浏览量:156

基于物理的渲染

 

1. 光的性质

光通常指的是人类眼睛可以见的电磁波,反馈到人眼上就是我们可辨别的颜色。

光谱,是复色光通过色散系统(如光栅、棱镜)进行分光后,依照光的波长(或频率)的大小顺次排列形成的图案。光谱中的一部分可见光谱是电磁波谱中人眼可见的唯一部分,在这个波长范围内的电磁辐射被称作可见光,如图1所示。

2019-09-07_20-57-10

图1. 光谱

实际上,我们看到的光并不是单一波长的电磁波,而是由多种波长混合而成。通过棱镜,不同波长的光会分散开来,就能看到所谓的“彩虹”,如图2所示。

2019-09-07_20-57-22

图2. 光的色散

光谱能量分布(Spectral Power Distribution,简称为SPD),用于描述复合光中各个波长的色光分别有多少能量。如下图所示,就表示不同的光源发射出来的光的SPD,如图3所示。换个角度说,可见光内任意一个SPD都可以表示一个唯一的颜色,但是任何一种不颜色可能由不同的SPD组成。

2019-09-07_20-57-41

图3. 不同光源的SPD

任何看到的颜色是不同能量的电磁波混合而成,而电磁波具有偏振现象,它会朝前进方向的垂直方向偏振,如图4所示。

2019-09-07_20-59-29

图4. 光的偏振

偏振片会过滤某个方向上偏振的电磁波,证实了光的偏振现象,如图5所示。

2019-09-07_21-00-00

图5. 偏振片

2. 基础概念

本小节介绍与能量相关的基础概念。

2.1. Radiant Energy

辐射能量。

指以辐射形式发射、转移,或接收的能量。

单位是焦耳,J,符号是Q

2.2. Radiant Flux

辐射通量。

指的是单位时间到达一块平面的能量总和。

单位是焦耳每秒J/s,或瓦特W,符号是\Phi

2.3. Radiance

辐射度,辐照度,辐射照度。

指的是单位面积接收的辐射通量。

单位是W/m^2,用符号E表示。

点光源在不同的圆圈上的辐射通量是相同的,内圆圈的面积更小,则辐射度越大;相反,外圆圈的辐射度越小,如图6所示。

2019-09-07_21-00-15

图6. 点光源的辐射

球面上的辐射度可以表示为:

    \[E = \frac{\Phi}{4 \pi r^2}\]

用积分形式可以表示为:

(1)   \[E = {{\partial \Phi } \over {\partial A}} \]

当假设光源在无限远处时,可把光源认为是一块平面。此时,光源方向与平面存在2种情形:平行和不平行,如图7所示。

2019-09-07_21-00-37

图7. 辐射度的计算

当光源方向与平面平行时,辐射通量表示为:

    \[E = \frac{\Phi}{A}\]

当光源方向与平面不平行时,需要计算投影面积A在光源垂直方向上的投影,即:

    \[\cos \theta = {{A'} \over A}\]

那么平面接受到光源的辐射度可以表示为:

(2)   \[{E'} = {\Phi \over {A'}} = {\phi \over {A\cos \theta }} \]

2.4. Solid Angle

立体角

立体角是三维单位球面上的一块面积,用球的表面积与半径平方的比值来表示。

单位是球面度(steradian,sr)。

以一个球体为例,球体上任意一点的立体角就表示为球表面积与球半径平方之比,即:

    \[d\omega = {A \over {{r^2}}} = {{4\pi {r^2}} \over {{r^2}}} = 4\pi\]

可以说,球体上任意一点的立体角为4\pi

引入极坐标的概念,如图8所示。\theta代表极角(polar ,原点到点P的连线与正z-轴之间的角度,\theta \in [0,\pi ]),\varphi代表方位角(azimuth,原点到点P的连线在xy-平面的投影线,与正x-轴之间的角度,\varphi \in [0,2\pi ]),单位球体上任意一点可以用球坐标表示为:

(3)   \[\left( {x,y,z} \right) = (\sin \theta \cos \varphi ,\sin \theta \sin \varphi ,\cos \theta )\]

2019-09-07_21-27-51

图8. 极坐标

立体角是球面的微分,它可以用极坐标表示为

(4)   \[d\omega = \sin \theta d\theta d\varphi \]

2.5. Irradiance

辐射率

指辐射通量与单位面积 * 单位立体角的比值,定义如下:

(5)   \[I = {{d\phi } \over {d\omega A \cdot cos \theta}} \]

用符号I表示。

显然,辐射率与辐射度的对应关系有:

(6)   \[E = I cos \theta d\omega \]

3. 能量守恒

本小节将介绍简单的Lambert漫反射模型和Phong高光模型来阐述能量守恒的概念。

当一束能量为光线打到平面上,从另一个方向能接收到光线,如图9所示。简单来说**双向反射分布函数**(bidirectional reflectance distribution function)就是研究入射光线能量与出射光线能量比值的函数。

2019-09-07_21-32-09

图9. 双向反射函数

> w_i指向光源方向,w_r指向观察,n是法线方向。

一部分光会直接反射(就跟扔到地面上的乒乓球,会向平面法线相对应的方向弹飞),这部分光称为镜面光(specular)。

剩下的光会被平面吸收转化为热能,或者面内部无规律发射而被人眼接受,这部分光称为漫反射光(diffuse),如图10所示。

2019-09-07_21-32-43

图10. 光的镜面反射和漫反射

简单来说,一束光线打到平面上,它主要分成三个派系:一派觉得道不同不相为谋,直接滚蛋(镜面反射);另一派系被“平面”玩弄一阵子再被赶走(漫反射);还有一个派系,被同化了(热能)。

用数学的角度来解释这个过程,入射光线的能量为E_i,方向为w_i,反射光线的能量为E_r,方向为w_r,双向反射分布函数为f\left( {{\omega _i},{\omega _r}} \right),当然还有一部分转化为热能为E_0,则有:

    \[{E_r} = {E_i} \cdot f\left( {{\omega _i},{\omega _r}} \right) + {E_0}\]

**能量守恒**,就是所有平面的出射光能量总和不能高于入射光能量总和。为了方便后续的讨论,我们忽略转化为热能的那部分能量,即有:

    \[{E_r} = {E_i} \cdot f\left( {{\omega _i},{\omega _r}} \right) {\tag 7}\]

双向反射函数又可以分为漫反射分量和镜面反射分量,分别表示为{f_d}\left( {{\omega _i},{\omega _r}} \right){f_s}\left( {{\omega _i},{\omega _r}} \right),即有等式:

    \[f\left( {{\omega _i},{\omega _r}} \right) = d \cdot {f_d}\left( {{\omega _i},{\omega _r}} \right) + s \cdot {f_s}\left( {{\omega _i},{\omega _r}} \right){\tag 8}\]

> 其中,sd分别表示镜面反射和漫反射分量的系数,有d + s = 1

由等式(8)可以看出来,镜面反射和漫反射是互斥的两个分量,镜面反射越强,则漫反射越弱,这也是符号能量守恒的,如图11所示。所以,同时拥有强漫反射光和强镜面反射光是反物理的。

2019-09-07_21-33-05

图11. 镜面反射越强,漫反射越弱

如图12所示,能量的角度来说,某个方向出射的光线,相当于所有入射光线对该方向出射光线的能量贡献总和。

2019-09-07_21-33-19

图12. 光的入射和反射现象

从数学的角度来解释,设半球用符号\Omega表示,用积分可以表示为:

    \[{E_r} = d \cdot \int_\Omega {{E_i}{f_d}\left( {{\omega _i},{\omega _r}} \right) d\omega } + s \cdot \int_\Omega {{E_i}{f_s}\left( {{\omega _i},{\omega _r}} \right) d\omega}\]

把等式(4)(6)带入上述等式,有:

    \[{E_r} = {I_i} \cdot \left( {d\int_\Omega {{f_d}\left( {{\omega _i},{\omega _r}} \right) \cos \theta \sin \theta d\theta d\varphi } + s\int_\Omega {{f_s}\left( {{\omega _i},{\omega _r}} \right) \cos \theta \sin \theta d\theta d\varphi } } \right) \]

对于双向反射函数的积分,有下列等式成立,结合等式(8),构成了光照计算能量守恒的基础。

(9)   \[\int_\Omega {{f_d}\left( {{\omega _i},{\omega _r}} \right)\cos \theta d\omega } \le 1,\int_\Omega {{f_s}\left( {{\omega _i},{\omega _r}} \right)\cos \theta d\omega } \le 1 \]

Lambert模型

漫反射分量采用朗伯特(Lambert)模型,它的双向反射函数可以表示为:

    \[{f_d}\left( {{\omega _i},{\omega _r}} \right) = c \tag {10}\]

接下来,为了保证漫反射模型是能量守恒的,计算参数c的数值。

    \[\int_\Omega {{f_d}\left( {{\omega _i},{\omega _r}} \right)\cos } \theta d\omega = \int_0^{2\pi } {d\varphi } \int_0^{{\pi \over 2}} {c\cos \theta \sin \theta d\theta } = - {\pi \over 2}c\left[ {\cos 2\theta } \right]_0^{{\pi \over 2}} = c\pi \le 1\]

所以,有:

    \[ c = {1 \over \pi } \]

最终的漫反射分量的brdf为:

(11)   \[{f_d}\left( {{\omega _i},{\omega _r}} \right) = {1 \over \pi } \]

Blinn-Phong模型

如图13所示,镜面反射体现了光照中的高光部分,往往越光滑的表现反光越强。

2019-09-07_21-33-30

图13. 镜面反射现象

Blinn-Phong模型是一种模拟镜面反射光的一种光照模型,它是基于**半角向量**(half vector)的镜面反射光模型。

如图14所示,入射光方向为l,反射光方向为v,则半角向量可以定义为,半角向量与法线方向的夹角为\theta_h

    \[h = {{l + v} \over {\left\| {l + v} \right\|}} \tag {12}\]

2019-09-07_21-33-41

图14. 半角向量

那么blinn-phong光照模型定义为,其中,系数m用于模拟模型的光滑度,c是常数。

    \[{f_s}\left( {{\omega _i},{\omega _r}} \right) = c{\left( {\cos {\theta _h}} \right)^m}\]

接下来,为了保证镜面反射模型是能量守恒的,需要计算参数c的值。而\theta_h又怎么表示,设反射方向与法线方向重叠,此时反射出来的能量是最多的,在这种情况下有:

    \[{\theta _h} = {\theta \over 2}\]

那么:

    \[\int_\Omega {{f_s}\left( {{\omega _i},{\omega _r}} \right)\cos \theta d\omega } = \int_0^{2\pi } {d\varphi } \int_0^{{\pi \over 2}} {c{{\left( {\cos {\theta \over 2}} \right)}^m}\cos \theta \sin \theta d\theta }\]

由于,2{\left( {\cos {\theta \over 2}} \right)^2} - 1 = \cos \theta代入上式,同时替换x = \cos \theta,可得:

    \[\int_\Omega {{f_s}\left( {{\omega _i},{\omega _r}} \right)\cos \theta d\omega } = 2\pi c\int_0^1 {{{\left( {{{x{\rm{ + 1}}} \over {\rm{2}}}} \right)}^{{m \over 2}}}xdx}\]

对积分项进行拆分:

    \[{\left( {{{x{\rm{ + 1}}} \over {\rm{2}}}} \right)^{{m \over 2}}}x = {{{{\left( {x + 1} \right)}^{{m \over 2} + 1}} - {{\left( {x + 1} \right)}^{{m \over 2}}}} \over {{2^{{m \over 2}}}}}\]

最终,可得:

    \[{{8\pi \left( {m + {2^{ - m/2}}} \right)} \over {\left( {m{\rm{ + 2}}} \right)\left( {m + 4} \right)}}c \le 1\]

易得:

    \[ c = {{\left( {m{\rm{ + 2}}} \right)\left( {m + 4} \right)} \over {8\pi \left( {m + {2^{ - m/2}}} \right)}} \]

镜面反射分量的brdf为:

(13)   \[{f_s}\left( {{\omega _i},{\omega _r}} \right) = {{\left( {m{\rm{ + 2}}} \right)\left( {m + 4} \right)} \over {8\pi \left( {m + {2^{ - m/2}}} \right)}}{\left( {\cos {\theta _h}} \right)^m} = {{\left( {m{\rm{ + 2}}} \right)\left( {m + 4} \right)} \over {8\pi \left( {m + {2^{ - m/2}}} \right)}}{\left( {h \cdot n} \right)^m} \]

> 其中,m是光滑系数。

漫反射采用Lambert模型,镜面反射采用Blinn-Phong模型,可以得到能量守恒等式为:

(14)   \[{E_r} = {I_i}\left[ {d\int_\Omega {{1 \over \pi }\cos \theta } d\omega + s\int_\Omega {{{\left( {m{\rm{ + 2}}} \right)\left( {m + 4} \right)} \over {8\pi \left( {m + {2^{ - m/2}}} \right)}}{{\left( {\cos {\theta _h}} \right)}^m}\cos \theta d\omega } } \right] \]

> 其中,sd分别表示镜面反射和漫反射分量的系数,有d + s = 1

如图15所示,漫反射分量和镜面反射分量是互斥关系,漫反射分量变多了,相应的镜面反射分量就得变少,鱼和熊掌不可兼得是维持能量守恒的基础。

2019-09-07_21-33-55

图15. 漫反射和镜面反射

4. 物理渲染

本小节介绍镜面反射BRDF的基于物理的渲染模型。

4.1. 反射与折射

任何一种介质的折射率\eta等于“光在真空中的速度(c)”跟“光在介质中的相速度(v)”之比,即:

    \[\eta = {c \over v}\]

比如水的折射率是1.33,表示光在真空中的传播速度是在水中传播速度的1.33倍。折射率决定了进入材料时光的路径弯曲或折射的程度,不同的介质有不同的折射率,如图16所示。

2019-09-07_21-51-47

图16. 不同材质的折射率

当光从一种折射率为\eta_i的介质向另一种折射率为\eta_r的介质传播时,在两者的交界处(通常称作界面)可能会同时发生光的反射和折射。则入射角与折射角之间的关系可以用**斯涅尔定律**(Snell’s Law)来描述,如图17所示。

2019-09-07_21-52-03

图17. 光的折射现象

> 其中,\eta_in_r分别是两种介质的折射率(index of refraction),{\theta _i}{\theta _r}分别是入射光、折射光与平面法向量的夹角。

斯涅尔方程表示为:

(15)   \[{\eta_i}\sin {\theta _i} = {\eta_r}\sin {\theta _r} \]

4.2. 菲涅耳方程

菲涅耳方程描述了光的不同分量被折射和反射比值的情况,本节只讨论光的反射情况。

前面说过,光是电磁波,有偏振现象,而光的折射和反射取决于入射光的偏振态。以下是两种偏振状态:

s偏振和p偏振

  • -偏振入射光的电场分量与入射光及反射光所形成的平面相互垂直。此时的入射光状态称为“**s偏振态**”,源于德语“senkrecht”。
  • -偏振入射光的电场分量与入射光及反射光所形成的平面相互平行。此时的入射光状态称为“**p偏振态**”,源于德语“parallel”。

s偏振和p偏振相当基础坐标系,任何一束光线都可以通过s偏振和p偏振的光来表示。图形渲染上,通常把光当做是非偏振光(unpolarized)

2019-09-07_21-52-18

图18. 光的反射

以绝缘体为例,如图18所示,s偏振光和p偏振光的入射光与反射光的比值分别**估算**为:

(16)   \[{r_p} = {{{\eta _r}\cos {\theta _i} - {\eta _i}\cos {\theta _r}} \over {{\eta _r}\cos {\theta _i} + {\eta _i}\cos {\theta _r}}},{r_s} = {{{\eta _i}\cos {\theta _i} - {\eta _r}\cos {\theta _r}} \over {{\eta _i}\cos {\theta _i} + {\eta _r}\cos {\theta _r}}} \]

对于非偏振光来说,它的菲涅耳方程可以表示为:

(17)   \[F = {1 \over 2}\left( {r_p^2 + r_s^2} \right) \]

接下来,考虑非绝缘体,需要考虑消光系数k(物体对光的吸收系数),认为光线由真实射入物体上,真空的折射率为1,物体的折射率为\eta,则有

(18)   \[{F_r} = {1 \over 2}\left[ {{{{{\left( {a - \cos \theta } \right)}^2} + {b^2}} \over {{{\left( {a + \cos \theta } \right)}^2} + {b^2}}}} \right]\left[ {{{{{\left( {a + \cos \theta - {1 \over {\cos \theta }}} \right)}^2} + {b^2}} \over {{{\left( {a - \cos \theta + {1 \over {\cos \theta }}} \right)}^2} + {b^2}}} + 1} \right] \]

    \[{a^2} = {1 \over 2}\left( {\sqrt {{{\left( {{\eta ^2} - {k^2} + \cos {\theta ^2} - 1} \right)}^2} + 4{\eta ^2}{k^2}} + {\eta ^2} - {k^2} + \cos {\theta ^2} - 1} \right) \]

    \[{b^2} = {1 \over 2}\left( {\sqrt {{{\left( {{\eta ^2} - {k^2} + \cos {\theta ^2} - 1} \right)}^2} + 4{\eta ^2}{k^2}} - {\eta ^2} + {k^2} - \cos {\theta ^2} + 1} \right) \]

对于非金属来说,消光系数k等于0,而对于金属来说k是不等于0的。为了方便计算机模拟,我们可以指定消光系数为0,则我们得到另外一个等式:

(19)   \[{F_r} = {1 \over 2}{{{{\left( {g - \cos \theta } \right)}^2}} \over {{{\left( {g + \cos \theta } \right)}^2}}}\left\{ {{{{{\left[ {\cos \theta \left( {a + \cos \theta } \right) - 1} \right]}^2}} \over {{{\left[ {\cos \theta \left( {a + \cos \theta } \right) + 1} \right]}^2}}} + 1} \right\} \]

    \[{g^2} = {\eta ^2} + \cos {\theta ^2} - 1\]

若一条光线垂直射光平面,即\theta = 0则有\cos \theta = 0,g = \eta,代入上述等式,可以得到:

    \[{F_0} = {\left( {{{\eta - 1} \over {\eta + 1}}} \right)^2}\]

在实际应用的时候,F_0就是算出来的SpecularColor,由此可以反推出物体的介质:

    \[\eta = {{1 + \sqrt {{F_0}} } \over {1 - \sqrt {{F_0}} }}\]

不同的材质得到的反射比如图19所示,在入射角等于90度时,不论什么材质反射比都趋向 1。

2019-09-07_21-52-31

图19. 不同材质的菲涅耳曲线

Schlick对菲涅耳方程做了一个近似拟合:

(20)   \[{F_0} + \left( {1 - {F_0}} \right){\left( {1 - \cos {\theta}} \right)^5} \]

如图20所示,虚线表示拟合函数,实线表示菲涅耳系数。

2019-09-07_21-52-52

图20. 菲涅耳的拟合曲线

而Lagarde对{\left( {1 - \cos \theta } \right)^5}再次进行了拟合,可以得到等式:

(21)   \[{F_r} = {F_0} + \left( {1 - {F_0}} \right){2^{\left( { - 5.55473\cos \theta - 6.98316} \right)\cos \theta }} \]

我们看到的几乎所有的物体都有反射,对于绝缘体来说,取一个合理的折射率为\eta {\rm{ = 1}}{\rm{.5}},代入上等式可以得到:

    \[\eta {\rm{ = }}{{{{\left( {1.5 - 1} \right)}^2}} \over {{{\left( {1.5 + 1} \right)}^2}}} = 0.04\]

4.3. 微表面理论

微表面理论(microfacet theory)是现在PBR渲染的基础,假设任意一个像素点还是由大量的微面元组成,每个微面元是绝对光滑的。如图21所示所示,我们打个比方,我们看出来的任何一个像素的颜色,都是一群人共同决策的,最终才呈现出来,任何一片微面元都有自己支持的颜色,那么谁说的算呢,这就是一个投票的过程,少数服从多数。

2019-09-07_21-53-14

图21. 微面元对光的反射

微表面理论假设物质表面由大量微面元组成,这些微面元远小于一个像素的尺寸,通过数据统计来模拟微观结构的分布。

微面元与入射光和反射光之间有一定的交互现象,如图22所示,黑色虚线部分表示入射光被其它微面元遮挡处于阴影区,这个过程叫**shadowing**(不好翻译);红色虚线部分表示反射光被其它微面元阻挡,这个过程叫**masking**(不好翻译);光线在微面元之间还有互相弹射的情况,当然我们这里只考虑光的一次反射的情况。

2019-09-07_21-53-23

图22. 微面元对光的Shadowing和Masking

特别注意,微面元是完美的镜面,也就是说不存在散色的情况,它只能发生镜面反射。如图23所示,一束方向为l的光线射向微面元,那么在方向v观察到的光线只能是法线方向为h的微面元的反射。

2019-09-07_21-53-32

图23. 微面元对光照的完美反射

微面元理论最重要的是统计微面元的法线分布,我们称之为**法线分布函数**(normal distribution function, NDF),用D\left( m \right)表示。统计法线分布的意义在于它确定了能量的分布,如图24所示,设微面元的法线方向为m,它与几何法线的夹角为{{\theta _m}},则反射出去的能量L_o可以表示为:

    \[{L_o} = \int_{\rm M} {{L_m}\cos {\theta _m}d{\omega _m}}\]

2019-09-07_21-53-43

图24. 微面元反射能量

> 其中,w_0表示反射的方向

接下来,来探究法线分布函数的属性,如图25所示,n表示平面的几何法线,m表示微面元的法线,v表示视线方向。左图,对D\left( m \right)\left( {m \cdot n} \right)积分表示的是微面元在平面上的投影;对D\left( m \right)\left( {m \cdot v} \right)积分表示的是微面元在与v垂直的平面上的投影。

2019-09-07_21-53-56

图25. 平面的微表面模型的剖面图

对投影的面积归一化,则有:

(22)   \[\int_\Omega {D\left( m \right)\left( {m \cdot n} \right)d\omega } = 1 \]

注意观察图24的右图,在v方向上,有些微面积会被其它微面元遮挡,我们定义一个

遮蔽函数{{G_{mask}}},则有等式:

(23)   \[\int_\Omega {{G_{mask}} \cdot D\left( m \right) \cdot \left( {m \cdot v} \right)d\omega } = n \cdot v \]

证明一个反射模型是否能量守恒,最关键的是证明这个等式是否成立。

对法线分布函数更详细的讨论,可以参见Eric Heitz[1]或RTR[3]中的介绍,不想写了。

4.4. 双向反射函数

双向反射函数的推导过程可以参见链接[8]的介绍,这里直接给出基于物理渲染的BRDF:

(24)   \[f\left( {{\omega _i},{\omega _r}} \right) = {{F \cdot D \cdot G} \over {4\left| {n \cdot l} \right| \cdot \left| {n \cdot v} \right|}} \]

> 其中,{w_i}表示光线入射光线方向,{w_r}表示反射光线方向。

本节讨论中,n表示平面的几何法线,m表示微面元的法线,即半角向量,v表示由顶点指向观察方向,l表示由顶点指向光照方向。

菲涅耳项

F项表示的是菲涅耳项,等式(20)(21)(22)。既然我们是基于微面元模型,那么

\cos \theta应该是半角向量与反射方向的夹角,即:

(25)   \[\cos \theta = \left| {m \cdot v} \right| \]

这里给出等式(20)和(22)的代码实现版本,参考UE的代码:

float3 F_Fresnel( float3 SpecularColor, float VoH )
{
	float3 SpecularColorSqrt = sqrt( clamp( float3(0, 0, 0), float3(0.99, 0.99, 0.99), SpecularColor ) );
	float3 n = ( 1 + SpecularColorSqrt ) / ( 1 - SpecularColorSqrt );
	float3 g = sqrt( n*n + VoH*VoH - 1 );
	return 0.5 * Square( (g - VoH) / (g + VoH) ) * ( 1 + Square( ((g+VoH)*VoH - 1) / ((g-VoH)*VoH + 1) ) );
}

// [Schlick 1994, "An Inexpensive BRDF Model for Physically-Based Rendering"]
// [Lagarde 2012, "Spherical Gaussian approximation for Blinn-Phong, Phong and Fresnel"]
float3 F_Schlick( float3 SpecularColor, float VoH )
{
	return SpecularColor + ( 1.0 - SpecularColor ) * exp2( (-5.55473 * VoH - 6.98316) * VoH );
	//float Fc = exp2( (-5.55473 * VoH - 6.98316) * VoH );	// 1 mad, 1 mul, 1 exp 	//float Fc = pow( 1 - VoH, 5 );
	//return Fc + (1 - Fc) * SpecularColor;					// 1 add, 3 mad
}
法线分布项

Beckmann分布项的等式表示为:

(26)   \[D\left( m \right) = {1 \over {\pi {a^2}{{\left( {n \cdot m} \right)}^2}}}\exp \left( {{{{{\left( {n \cdot m} \right)}^2} - 1} \over {{a^2}{{\left( {n \cdot m} \right)}^2}}}} \right) \]

> 其中,a = roughnes{s^2}

Walter(2007)提出了GGX,有很长的拖尾效果,得到广泛应用,等式表示为:

(27)   \[D\left( m \right) = {{{a^2}} \over {\pi \left( {1 + {{\left( {m \cdot n} \right)}^2}\left( {{a^2} - 1} \right)} \right)}} \]

> 其中,a = roughnes{s^2}

下面给出上述两个等式的代码实现,参考UE4的代码:

// [Beckmann 1963, "The scattering of electromagnetic waves from rough surfaces"]
float D_Beckmann( float a2, float NoH )
{
	float NoH2 = NoH * NoH;
	return exp( (NoH2 - 1) / (a2 * NoH2) ) / ( PI * a2 * NoH2 * NoH2 );
}

// GGX / Trowbridge-Reitz
// [Walter et al. 2007, "Microfacet models for refraction through rough surfaces"]
float D_GGX( float a2, float NoH )
{
	float d = ( NoH * a2 - NoH ) * NoH + 1;	// 2 mad
	return a2 / ( PI*d*d );					// 4 mul, 1 rcp
}
几何衰减项

Smith(1967)[5]提出的一种几何衰减项(Geometric Attenuation Coefficent),它函数形式为:

(28)   \[G\left( {v,n} \right) = {{{\chi ^ + }\left( {v \cdot n} \right)} \over {1 + \Lambda \left( v \right)}} \]

> 其中,若a > 0,则{\chi ^ + }\left( a \right) = 1;否则,{\chi ^ + }\left( a \right) = 0

Smith模型设定{G_{mask}}{G_{shadow}}是互相独立的,则:

(29)   \[G = {G_{mask}} \cdot {G_{shadow}} \]

由于Smith模型计算较为复杂,Schlick(1994)[6]对Smith模型进行了拟合估计。Heitz(2014)[1]对几种不同的几何衰减项进行了分析研究,证明Smith模型是能量守恒的,但是Schlick(1994)拟合的模型能量不守恒,如图26所示。

2019-09-07_21-54-09

图26. Smith模型和Schlick-Smith模型的比对

提出GGX模型的Walter,同时提出了相应的\Lambda \left( v \right),表示为:

(30)   \[\Lambda \left( {n,v} \right) = {{ - 1 + \sqrt {1 + {a^2}\tan {\theta ^2}} } \over 2} \]

> 其中,a = roughnes{s^2}v是一个变量,表示任意一个方向,\theta是向量v与法线n的夹角。

这个等式可能有些费解,换种形式,也许大家就认识了:

    \[G\left( {v,n} \right) = {{2\left( {v \cdot n} \right)} \over {\left( {v \cdot n} \right) + \sqrt {{{\left( {v \cdot n} \right)}^2}\left( {1 - {a^2}} \right) + {a^2}} }}\]

采用Walter(2007)得到的Smith模型的G项可以表示为:

(31)   \[G = {{4\left( {v \cdot n} \right)\left( {l \cdot n} \right)} \over {\left[ {\left( {v \cdot n} \right) + \sqrt {{{\left( {v \cdot n} \right)}^2}\left( {1 - {a^2}} \right) + {a^2}} } \right]\left[ {\left( {l \cdot n} \right) + \sqrt {{{\left( {l \cdot n} \right)}^2}\left( {1 - {a^2}} \right) + {a^2}} } \right]}} \]

> 其中,a = roughnes{s^2}

入射遮蔽项和出射遮蔽项是有一定关联的,因此Lagarde(2014)[7]提出了另外一种更精确的几何衰减项等式:

(32)   \[G\left( {v,l,n} \right) = {{{\chi ^ + }\left( {v \cdot n} \right) \cdot {\chi ^ + }\left( {l \cdot n} \right)} \over {\Lambda \left( {v \cdot n} \right) + \Lambda \left( {l \cdot n} \right) + 1}} \]

将等式(30)\Lambda \left( n, v \right)代入上述等式,再可以得到:

(33)   \[G = {{2\left( {v \cdot n} \right)\left( {l \cdot n} \right)} \over {\left( {l \cdot n} \right) \cdot \sqrt {{{\left( {v \cdot n} \right)}^2}\left( {1 - {a^2}} \right) + {a^2}} + \left( {v \cdot n} \right) \cdot \sqrt {{{\left( {l \cdot n} \right)}^2}\left( {1 - {a^2}} \right) + {a^2}} }} \]

Hammon(2017)[8]对等式(33)再进行拟合,即:

    \[\sqrt {{{\left( {v \cdot n} \right)}^2}\left( {1 - {a^2}} \right) + {a^2}} = \sqrt {lerp\left( {{{\left( {v \cdot n} \right)}^2},1,{a^2}} \right)} \approx lerp\left( {v \cdot n,1,a} \right) \]

则得到新的等式:

(34)   \[G = {{2\left( {v \cdot n} \right)\left( {l \cdot n} \right)} \over {\left( {l \cdot n} \right) \cdot \left[ {\left( {v \cdot n} \right)\left( {1 - a} \right) + a} \right] + \left( {v \cdot n} \right) \cdot \left[ {\left( {l \cdot n} \right)\left( {1 - a} \right) + a} \right]}} \]

> 其中,a = roughnes{s^2}

在实际实现的时候,将1/\left( {4\left| {n \cdot l} \right|\left| {n \cdot v} \right|} \right)并入几何衰减项G的计算。

最后给出等式(31)和等式(34)的代码实现,参考UE4的代码。

// Tuned to match behavior of Vis_Smith
// [Schlick 1994, "An Inexpensive BRDF Model for Physically-Based Rendering"]
float Vis_Schlick( float a2, float NoV, float NoL )
{
	float k = sqrt(a2) * 0.5;
	float Vis_SchlickV = NoV * (1 - k) + k;
	float Vis_SchlickL = NoL * (1 - k) + k;
	return 0.25 / ( Vis_SchlickV * Vis_SchlickL );
}

// Smith term for GGX
// [Bruce Walter, et al, 2007. "Microfacet models for refraction through rough surfaces"]
float Vis_Smith( float a2, float NoV, float NoL )
{
	float Vis_SmithV = NoV + sqrt( NoV * (NoV - NoV * a2) + a2 );
	float Vis_SmithL = NoL + sqrt( NoL * (NoL - NoL * a2) + a2 );
	return rcp( Vis_SmithV * Vis_SmithL );
}

// Appoximation of joint Smith term for GGX
float Vis_SmithJointApprox( float a2, float NoV, float NoL )
{
	float a = sqrt(a2);
	float Vis_SmithV = NoL * ( NoV * ( 1 - a ) + a );
	float Vis_SmithL = NoV * ( NoL * ( 1 - a ) + a );
	return 0.5 * rcp( Vis_SmithV + Vis_SmithL );
}

 

参考

[1] Eric Heitz. “Understanding the masking-shadowing function in microfacet-based BRDFs.”, 2014.

[2] Petr Beckmann, and Andre Spizzichino. “The scattering of electromagnetic waves from rough surfaces.” Norwood, MA, Artech House, Inc., 511p, 1987.

[3] Tomas Akenine-Moller, Eric Haines, and Naty Hoffman. *Real-time rendering*. AK Peters/CRC Press, 2019.

[4] Bruce Walter, et al. “Microfacet models for refraction through rough surfaces.” Proceedings of the 18th Eurographics conference on Rendering Techniques. Eurographics Association, 2007.

[5] Bruce Smith. “Geometrical shadowing of a random rough surface.” IEEE transactions on antennas and propagation ,vol 15.5, p668-671, 1967.

[6] Christophe Schlick. “An inexpensive BRDF model for physically‐based rendering.” Computer graphics forum. Vol. 13. No. 3. Edinburgh, UK: Blackwell Science Ltd, 1994.

[7] Sébastien Lagarde, and Charles de Rousiers. “Moving frostbite to physically based rendering.” SIGGRAPH 2014 Conference, Vancouver. 2014.

[8] Hammon, Earl, Jr., “PBR Diffuse Lighting for GGX+Smith Microsurfaces,” Game Developers Conference, Feb.Mar. 2017.

[9] [BASIC THEORY OF PHYSICALLY-BASED RENDERING](https://marmoset.co/posts/basic-theory-of-physically-based-rendering/)

[10] [ENERGY CONSERVATION IN GAMES](http://www.rorydriscoll.com/2009/01/25/energy-conservation-in-games/)

[11] [Spherical Gaussian approximation for Blinn-Phong, Phong and Fresnel](https://seblagarde.wordpress.com/2012/06/03/spherical-gaussien-approximation-for-blinn-phong-phong-and-fresnel/)

[12] [基于物理着色:BRDF](https://zhuanlan.zhihu.com/p/21376124)

 

spacer

Leave a reply