浏览量:37

基于物理的渲染

 

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. Irradiance

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

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

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

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

2019-09-07_21-00-15

图6. 点光源的辐射

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

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

用积分形式可以表示为:

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

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

2019-09-07_21-00-37

图7. 辐射度的计算

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

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

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

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

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

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

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 ]\)),单位球体上任意一点可以用球坐标表示为:

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

2019-09-07_21-27-51

图8. 极坐标

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

\[d\omega = \sin \theta d\theta d\varphi \tag{4}\]

2.5. Irradiance

辐射率

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

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

用符号\(I\)表示。

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

\[E = I cos \theta d\omega \tag{6}\]

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}\]

> 其中,\(s\)\(d\)分别表示镜面反射和漫反射分量的系数,有\(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),构成了光照计算能量守恒的基础。

\[\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 \tag{9}\]

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为:

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

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为:

\[{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} \tag{13}\]

> 其中,\(m\)是光滑系数。

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

\[{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] \tag{14}\]

> 其中,\(s\)\(d\)分别表示镜面反射和漫反射分量的系数,有\(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_i\)\(n_r\)分别是两种介质的折射率(index of refraction),\({\theta _i}\)\({\theta _r}\)分别是入射光、折射光与平面法向量的夹角。

斯涅尔方程表示为:

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

4.2. 菲涅耳方程

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

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

s偏振和p偏振

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

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

2019-09-07_21-52-18

图18. 光的反射

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

\[{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}}} \tag{16}\]

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

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

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

\[{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] \tag{18}\]

\[{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,则我们得到另外一个等式:

\[{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\} \tag{19}\]

\[{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对菲涅耳方程做了一个近似拟合:

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

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

2019-09-07_21-52-52

图20. 菲涅耳的拟合曲线

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

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

我们看到的几乎所有的物体都有反射,对于绝缘体来说,取一个合理的折射率为\(\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. 平面的微表面模型的剖面图

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

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

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

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

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

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

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

4.4. 双向反射函数

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

\[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|}} \tag{24}\]

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

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

菲涅耳项

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

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

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

这里给出等式(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分布项的等式表示为:

\[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) \tag{26}\]

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

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

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

> 其中,\(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),它函数形式为:

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

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

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

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

由于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)\),表示为:

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

> 其中,\(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\)项可以表示为:

\[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]}} \tag{31}\]

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

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

\[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}} \tag{32}\]

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

\[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}} }} \tag{33}\]

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) \]

则得到新的等式:

\[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]}} \tag{34}\]

> 其中,\(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