光照模型和BRDF

本文参考了本篇博客,同时加入了Phong光照模型

一、预备知识

在介绍光照模型和BRDF(双向反射分布函数)时,我们要先理解一些基本概念,这些概念与辐射度学有关

1. 能量

每个光子都具有一定的能量(Energy),能量大小与频率有关 E = h v E = hv E=hv。用符号 Q Q Q表示,单位是焦耳 J J J

2. 功率

功率、辐射通量、通量

功率(Power),也被称为辐射通量(Radiant Flux)或者通量(Flux),指的是单位时间内通过表面或者空间区域的能量的总量。用符号 Φ \Phi Φ表示, Φ = d Q d t \Phi = \frac{dQ}{dt} Φ=dtdQ,单位为瓦特 W W W,或者焦耳/秒 J / S J/S J/S

3. 辐照度和辐出度

辐照度(辐射通量密度)

辐出度、辐射出射度、辐射度(辐射通量密度)

  • 辐照度(Irradiance)指单位时间内到达单位面积的辐射能量,或单位面积的辐射通量,即通量对于面积的密度。用符号 E E E表示, E = d Φ d A = d Q d t d A E = \frac{d\Phi}{dA} = \frac{dQ}{dtdA} E=dAdΦ=dtdAdQ,单位 W / m 2 W/m^{2} W/m2
  • 辐出度(Radiant Existance),也称为辐射出射度、辐射度(Radiosity)。与辐照度不同的是,辐出度是衡量离开表面的通量密度,二者都可以被称为辐射通量密度(Radiant Flux Density)。用符号 M M M表示

注意辐射通量和辐射通量密度之间的区别

如下图所示

一束平行光之间的间距为 d d d,一个垂直入射,一个与表面法线成 θ i \theta_{i} θi的角度入射,观察表面的间距,其中左图间距为 d d d,右图为 d c o s θ i \frac{d}{cos\theta_{i}} cosθid,相对于左图,右图的间距增大了。由于辐射通量是单位时间内通过表面或空间区域内的能量总和,所以辐射通量相同;而辐射通量密度是单位时间内通过单位面积的能量,右边面积大,所以右边辐射通量密度变小

让我们来看一下二者辐射通量密度的差异:假设右图中不垂直于光线方向的表面面积为 A A A,将他投影到垂直于直线方向得到一个虚拟表面,面积为 A ⊥ = A c o s θ i A^{\perp } = Acos\theta_{i} A=Acosθi,通过这两个面积的通量相同,设为 Φ \Phi Φ,则表面接收到的辐射通量密度 E = Φ A E = \frac{\Phi}{A} E=AΦ,虚拟表面的辐射通量密度 E ⊥ = Φ A ⊥ = Φ A c o s θ i E_{\perp} = \frac{\Phi}{A^{\perp}} = \frac{\Phi}{Acos\theta_{i}} E=AΦ=AcosθiΦ,得到 E = E ⊥ c o s θ i E = E_{\perp}cos\theta_{i} E=Ecosθi

同理对于点光源,假想以点光源为中心不同半径的求包围着点光源,穿过这些球的辐射通量是相通的,均为 Φ \Phi Φ,球的表面积为 4 π r 2 4\pi r^{2} 4πr2,得到辐射通量密度 E = Φ 4 π r 2 E = \frac{\Phi}{4\pi r^{2}} E=4πr2Φ,即通量密度与距离的平方成反比,即光的衰减与距离的平方成反比

4. 辐射强度

辐射强度

立体角:度量三维角度的量,用符号 ω \omega ω表示,立体角计算为 ω = s r 2 \omega = \frac{s}{r^{2}} ω=r2s,单位球的表面积为 4 π r 2 = 4 π 4\pi r^{2} = 4\pi 4πr2=4π,所以球面的立体角也为 4 π 4\pi 4π

辐射强度(Radiant Intensity),通过单位立体角的辐射能量,用符号 I I I表示, I = d Φ d w I=\frac{d\Phi}{dw} I=dwdΦ,单位 W / s r W/sr W/sr

引入辐射强度的原因是:有时候需要度量通过一个点的通量的密度,因为点的面积是0,无法直接使用辐射通量密度,所以引入辐射强度。辐射强度不会随距离的增大而衰减,这是因为立体角不会随距离的变化而变化

5. 辐射率

辐射率

辐射率(Radiance),每单位面积每单位立体角的辐射通量密度,用符号 L L L表示, L = d Φ d ω d A ⊥ L = \frac{d\Phi}{d\omega dA^{\perp}} L=dωdAdΦ,单位为 W / m 2 s r W/m^{2}sr W/m2sr,其中 d A ⊥ dA^{\perp} dA是微分面积 d A dA dA在垂直于光线方向的投影,如图

辐射率可以看成我们眼睛看到(相机拍到)的物体上一点的颜色,基于物理着色时,计算表面一点的颜色就是计算它的辐射率,辐射率不会随距离变化而衰减,这和我们日常感受一致,在没有雾霾的干扰时,我们看到的物体表面上一点的颜色并不会随距离变化而变化。为什么辐照度会随距离增大而衰减,但是我们看到的颜色却不会衰减呢?这是因为随着距离变大,我们看到的物体上的一块区域到达视网膜的通量密度会变小,同时这块区域在视网膜表面上的立体角也会变小,正好抵消了通量密度的变化

二、BRDF

我们看到一个表面,实际上是周围环境的光照射到表面上,然后表面将一部分光反射到我们眼睛里。双向反射分布函数BRDF(Bidirectional Reflectance Distribution Function)就是描述表面入射光和反射光关系的

对于一个方向的入射光,表面会将光反射到表面上半球的各个方向,不同方向反射的比例是不同的,我们用BRDF来表示指定方向的反射光和入射光的比例关系,BRDF定义为:

f ( l , v ) = d L o ( v ) d E ( l ) f(l, v) = \frac{dL_{o}(v)}{dE(l)} f(l,v)=dE(l)dLo(v)

  • f f f:BRDF, l l l是入射光方向, v v v是观察方向,即反射光方向
  • d L o ( v ) dL_{o}(v) dLo(v):表面反射到 v v v方向的反射光的微分辐射率。表面反射到 v v v方向的反射光的辐射率为 L o ( v ) L_{o}(v) Lo(v),来自于表面上半球所有方向的入射光线的贡献,而微分辐射率 d L o ( v ) dL_{o}(v) dLo(v)特指来自方向 l l l的入射光贡献的反射辐射率
  • d E ( l ) dE(l) dE(l):表面上来自入射光方向 l l l的微分辐照度。表面接收到的辐照度为 E E E,来自上半球所有方向的入射光线的贡献,而微分辐照度 d E ( l ) dE(l) dE(l)特指来自于方向 l l l的入射光

表面对不同频率的光反射率可能不一样,因此BRDF和光的频率有关。在图形学中,将BRDF表示为RGB向量,三个分量各有自己的 f f f函数

BRDF需要处理表面上半球的各个方向,如下图使用球坐标系定义方向更加方便。球坐标系使用两个角度来确定一个方向:

  • 方向相对法线的角度 θ \theta θ,称为极角(Polar Angle)或天顶角(Zenith Angle)
  • 方向在平面上的投影相对于平面上一个坐标轴的角度 ϕ \phi ϕ,称为方位角(Azimuthal Angle)

所以BRDF也可以表示成 f ( θ i , ϕ i , θ o , ϕ o ) f(\theta_i, \phi_i, \theta_o, \phi_o) f(θi,ϕi,θo,ϕo)。对于各向同性材质,当 l l l v v v同时绕法线 n n n旋转时, f f f值保持不变,此时可以用 l l l v v v在平面投影的夹角 ϕ \phi ϕ来代替 ϕ i \phi _i ϕi ϕ o : f ( θ i , θ o , ϕ ) \phi _o:f(\theta_i, \theta_o, \phi) ϕof(θi,θo,ϕ)

为什么BRDF要定义成辐射率和辐照度的比值,而不是直接定义为辐射率和辐射率比值,有两种解释

第一种解释参考BRDF为什么要定义为一个单位是sr-1的量?

结合下面辐射通量密度 ( A ) (A) (A)和辐射率 ( B ) (B) (B)测量仪的示意图来看:辐照度(辐射通量密度)测量仪 ( A ) (A) (A)接受平面上半球的所有光线,可以测量一个较小面积来自于四面八方的所有光通量,光通量 Φ \Phi Φ除以传感器面积 A A A就可以得到辐照度(辐射通量密度) E E E。辐射度测量仪 ( B ) (B) (B)则有一个长筒控制光线只能从一个很小的立体角进入测量仪,光通量 Φ \Phi Φ除以传感器面积 A A A和立体角 ω \omega ω就可以得到辐射率 L L L

测平面上一点在某一个方向的出射辐射率很简单,只需要用仪器 ( B ) (B) (B)从该方向对准该点就可以了。而测平面一点入射的辐射率则没有那么简单,必须保证光源正好覆盖测量仪开口立体角,大了该点会接受到比测量值更多的光照,导致测量值比实际值小,小了则与仪器的设计立体角不一致,可在实际中是基本做不到光源大小正好覆盖测量仪开口立体角的。而测表面的辐照度则简单得多,只要保证光源很小,而且没有来自其他方向的光干扰,这时候测到的辐照度就是平面上来自光源方向的微分辐照度 d E dE dE

第二种解释从数学的角度出发

对于现实世界中的非光学平面,一束光线射到表面上后,被表面反射到各个方向,其中一个出射方向的光通量只是整个反射光通量极小的一部分,当出射方向立体角趋于0时, lim ⁡ ω o → 0 d L o L i = 0 \lim_{\omega_{o} \rightarrow 0}{\frac{dL_{o} }{Li} } = 0 limωo0LidLo=0,所以在实际计算中使用辐射率和辐射率比值是没有意义的。而如果分母改成表面上接收到的来自光源方向的微分辐照度,我们知道 d E = L i ( l ) d ω i c o s θ i dE = L_i(l) d\omega _{i} cos \theta _{i} dE=Li(l)dωicosθi,由于给入射辐射率乘了一个趋于零的微分立体角, d E dE dE的值会小很多,比值 d L o d E \frac{dL_o}{dE} dEdLo是有意义的,而不是0

下面我们来看看怎么用BRDF来计算表面辐射率

我们考虑来自方向 l l l的入射光辐射率 L i ( l ) L_i(l) Li(l),由辐射率和辐照度的定义:

L i ( l ) = d Φ d ω i d A ⊥ = d Φ d ω i d A c o s θ i = d E ( l ) d ω i c o s θ i L_i(l) = \frac{d \Phi }{d\omega_i d A^{\bot } } = \frac{d \Phi }{d\omega_i dA cos \theta_i } = \frac{dE(l) }{d\omega_i cos \theta_i } Li(l)=dωidAdΦ=dωidAcosθidΦ=dωicosθidE(l)

则照射到表面来自于方向l的入射光贡献的微分辐照度:

d E ( l ) = L i ( l ) d ω i c o s θ i dE(l) = L_i(l) d\omega_i cos \theta_i dE(l)=Li(l)dωicosθi

表面反射到 v v v方向的由来自于方向l的入射光贡献的微分辐射率:

d L o ( v ) = f ( l , v ) ⊗ d E ( l ) = f ( l , v ) ⊗ L i ( l ) d ω i c o s θ i dL_o(v) = f(l, v) \otimes dE(l) = f(l, v) \otimes L_i(l) d\omega_i cos \theta_i dLo(v)=f(l,v)dE(l)=f(l,v)Li(l)dωicosθi
符号 ⊗ \otimes 表示按向量的分量相乘,因为 f f f L i L_i Li都包含RGB三个分量

要计算表面反射到v方向的来自上半球所有方向入射光线贡献的辐射率,可以将上式对半球所有方向的光线积分:

L o ( v ) = ∫ Ω f ( l , v ) ⊗ L i ( l ) c o s θ i d ω i L_o(v) = \int_{\Omega }^{} f(l, v) \otimes L_i(l) cos \theta_i d\omega_i Lo(v)=Ωf(l,v)Li(l)cosθidωi
上式称为反射方程(Reflectance Equation),用来计算表面反射辐射率

对于点光源、方向光等理想化的精准光源(Punctual Light),计算过程可以大大简化。我们考察单个精准光源照射表面,此时表面上的一点只会被来自一个方向的一条光线照射到(而面积光源照射表面时,表面上一点会被来自多个方向的多条光线照射到),则辐射率:

L o ( v ) = f ( l , v ) ⊗ E L c o s θ i L_o(v) = f(l, v) \otimes E_L cos \theta_i Lo(v)=f(l,v)ELcosθi
对于多个精准光源,只需简单累加就可以了:

L o ( v ) = ∑ k = 1 n f ( l k , v ) ⊗ E L k c o s θ i k L_o(v) = \sum_{k = 1}^{n}{f(l_k, v) \otimes E_{L_k} cos \theta_{i_k}} Lo(v)=k=1nf(lk,v)ELkcosθik
这里使用光源的辐照度,对于阳光等全局方向光,可以认为整个场景的辐照度是一个常数,对于点光源,辐照度随距离的平方衰减,用公式 E L = Φ 4 π r 2 E_{L} = \frac{\Phi }{4\pi r^2} EL=4πr2Φ就可以求出到达表面的辐照度, Φ \Phi Φ是光源的功率,比如100瓦的灯泡,r是表面离光源的距离

回头看看反射方程,是对表面上半球所有方向的入射光线积分,这里面包含了来自精准光源的光线,也包括周围环境反射的光线。处理来自周围环境的光线可以大幅提高光照的真实程度,在实时图形学中,这部分光照可以用基于图像的光照(Image Based Lighting)来模拟。我们将在下篇文章讨论基于图像的光照。

上面给出了BRDF的定义和使用BRDF计算表面反射辐射率的公式。但这个定义实际上是无法直接用于计算表面反射辐射率的,我们还要建立一个能模拟真实光照的模型,使得输入入射方向和出射方向, f ( l , v ) f(l, v) f(l,v)能输出表面反射微分辐射率和入射微分辐照度的比率。

1967年Torrance-Sparrow在Theory for Off-Specular Reflection From Roughened Surfaces中使用辐射度学和微表面理论建立了模拟真实光照的BRDF模型,1981年Cook-Torrance在A Reflectance Model for Computer Graphics中把这个模型引入到计算机图形学领域,现在这个模型已经成为基于物理着色的标准,被称为Cook-Torrance模型。下面我们来看看微表面理论和Cook-Torrance模型的推导过程。

三、Phong光照模型

光照到物体表面时,物体对光会发生反射、透射和吸收。简单光照模型只考虑物体对直接光照的反射作用,而物体间的光反射作用,只用环境光来表示。此时光源被假定为点光源,反射作用被细分为镜面反射和漫反射

Phong光照模型

根据Phong光照模型,物体被感知的亮度由环境光、漫反射光及镜面反射光组成,物体表面的反射光强度为
I = K a I a + K d I l c o s ( θ ) + K s I l c o s n ( α ) I = K_{a}I_{a} + K_{d}I_{l}cos(\theta) + K_{s}I_{l}cos^{n}(\alpha) I=KaIa+KdIlcos(θ)+KsIlcosn(α)

  • K a   K d   K s K_{a}~K_{d}~K_{s} Ka Kd Ks:分别为环境光、漫反射光及镜面反射光系数
  • I a I_{a} Ia:入射的环境光强度
  • I l I_{l} Il:光源的入射光强度
  • θ \theta θ:入射光与物体表面法线之间的夹角
  • α \alpha α:反射光与视线之间的夹角
  • n n n:镜面反射参数

1. 漫反射

理想漫反射当光源来自一个方向时,漫反射光均匀向各方向传播,与视点无关,他是由表面的粗糙不平引起的,因而漫反射光的空间分布是均匀的。记入射光强为 I p I_{p} Ip,物体表面上点 P P P的法向量为 N N N,从点 P P P指向光源的向量为 L L L,当 L 、 N L、N LN为单位向量时,理想漫反射光强表示为:
I d = I p K d ( L ⋅ N ) I_{d} = I_{p}K_{d}(L\cdot N) Id=IpKd(LN)

K d K_{d} Kd:与物体有关的漫反射系数,取值 ( 0 , 1 ) (0, 1) (0,1)。在RGB模型下,漫反射系数 K d K_{d} Kd有三个分量 K d r 、 K d g 、 K d b K_{dr}、K_{dg}、K_{db} KdrKdgKdb分别表示RGB三原色的漫反射系数,反应物体颜色,通过调整三个分量可以改变物体的颜色,也可以吧入射光强 I I I设为三个分量 I r 、 I g 、 I b I_{r}、I_{g}、I_{b} IrIgIb通过调整这些分量来调整光源的颜色

2. 镜面反射

镜面反射光对于理想镜面,反射光集中在一个方向,并遵守反射定律。对一般光滑表面,反射光集中在一个范围内,且由反射定律决定的反射方向光强最大。因此对于同一点来说,从不同位置所观察到的镜面反射光强是不同的,镜面反射光强可以表示为:
I s = I p K s c o s n α     α ∈ ( 0 , π 2 ) I_{s} = I_{p}K_{s}cos^{n}\alpha~~~\alpha \in (0, \frac{\pi}{2}) Is=IpKscosnα   α(0,2π)

  • K s K_{s} Ks:与物体有关的镜面反射系数
  • α \alpha α:视线方向 V V V与反射方向 R R R的夹角
  • n n n:反射指数,反映了物体表面的光泽程度,一般为1~2000,数目越大表示物体表面越光滑

镜面反射光将会在反射方向附近形成很亮的光斑,称为高光现象,将 V 和 R V和R VR看做单位向量,镜面反射光强可以重写为:
I s = I p K s ( R ⋅ V ) n I_{s} = I_{p}K_{s}(R\cdot V)^{n} Is=IpKs(RV)n

其中 R = 2 N ( N ⋅ L ) − L R = 2N(N\cdot L)-L R=2N(NL)L,镜面反射光产生的高光区域只反映光源的颜色,例如在红光照射下,一个物体的高光域是红光,镜面反射系数 K s K_{s} Ks是一个与物体颜色无关的参数,在简单光照明模型中,只能通过改变物体的漫反射系数来控制物体的颜色

3. 环境光

环境光指光源间接对物体的影响,是在物体和环境之间多次反射,最终达到平衡时的一种光,可以近似地认为同一环境下的环境光,其光强分布是均匀的,他在任何一个方向上的分布都相同,在简单光照模型中,用一个常数来模拟环境光,用式子表示为:
I e = I a K a I_{e} = I_{a}K_{a} Ie=IaKa

  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 适合毕业设计、课程设计作业。这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。 所有源码均经过严格测试,可以直接运行,可以放心下载使用。有任何使用问题欢迎随时与博主沟通,第一时间进行解答!
提供的源码资源涵盖了小程序应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 适合毕业设计、课程设计作业。这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。 所有源码均经过严格测试,可以直接运行,可以放心下载使用。有任何使用问题欢迎随时与博主沟通,第一时间进行解答!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值