第一部分、简介
基于物理的渲染(PBS),是为了进行更真实的材质/光照建模。
Unity5加入了Standard Shader,这是一个基于物理的光照模型。
第二部分、PBS理论基础
光和微表面模型:
-
光是一种电磁波,从光源发射出来与场景中的对象相交,一些光被吸收(Absorption),一些被散射(Scatter)。物理概念中的反射和折射都属于广义的散射。
-
微表面模型认为与光相交的平面都是平滑的,物体表面与光照发生的各种行为,都是一系列微小的光滑平面与光交互的结果。
-
光滑物体的体现为微表面的法线方向变化角度小,高光发射清晰,粗糙物体体现为微表面法线方向变化角度大,高光反射模糊。
-
被折射的光,一部分被介质吸收,另一部分又被散射到外部,称为次表面散射(subsurface-scatter)。金属材质吸收系数高,折射光立刻被金属的自由电子转换为其他形式的能量,基本不发生散射现象。
-
次表面散射离入射点距离小于像素距离时可以忽略,然后在局部着色渲染。更真实的次表面散射效果,需要使用特殊的次表面散射渲染技术。
双向反射分布函数(BRDF):
概念:
-
双向反射分布函数(BRDF)是不考虑透射的双向散射分布函数(BSDF)。
-
BRDF可用$f(l, v)$表示,l和v分别为入射和出射方向。
-
性质:BRDF必须符合能量守恒,出射辐照不能超过入射辐照。
-
性质:BRDF符合交换律,可以交换l和v的值,结果不变。
-
绕着法线旋转入射方向或者出射方向不影响/影响BRDF结果的,称为各向同性/各向异性。
-
反射等式:$L_o(v) = ∫_{Ω}f(l, v) · L_i(l)(n·l)dω_i$
-
物理意义:某点的出射辐照率根据不同方向的入射辐照计算叠加。
特殊情形:
-
在游戏渲染中,通常是和一些精确光源(punctual)例如点光源(point)和聚光灯(spot)打交道。反射等式可以简化为:$L_o(v) = πf(l_c,v) * c_{light}(n·l_c)$
-
如果场景中包含多个精确光源,分别带入计算,结果相加即可。
◉BRDF漫反射项:
Lambert模型:
$f_{lambert}(l,v) = {{c_{diff}} \over {\pi}}$
- Lambert模型是最简单的漫反射模型。
- $c_{diff}$表示漫反射颜色,即漫反射光线所占比例。
- 除以π的原因是BRDF要求在半球内的积分为1。
- 注意(n·l)项在PBS中不算做BRDF的一部分而是算作反射等式的一部分。所以BRDF不包含(n·l)项。
Disney模型(Unity使用的模型):
-
Disney使用更复杂的漫反射项:
$f_{diff}(l,v)={baseColor \over \pi}(1 +(F_{D90} - 1)(1-n·l)^5)(1 + (F_{D90} - 1)( 1 - n·v)^5)$ - baseColor是表面颜色,由纹理采样得来。
-
其中$F_{D90} = 0.5 + 2rounghness(h·l)^2$,roughness为粗糙度。
- Disney模型的优点是考虑了掠射角漫反射项的能量变化,也考虑了粗糙度对漫反射的影响。
◉BRDF高光反射项:
在基于物理的渲染中,BRDF的高光反射项大多数都是建立在微表面理论假设上的。光和微表面相交,分成两个方向反射和折射,在BRDF中只考虑反射光线,折射光线已经在漫反射中考虑过了。
基于微表面理论的高光反射项
$f_{spec} = {{F(l,h)G(l,v,h)D(h)} \over {4(n·l)(n·v)}}$
-
D(h)时微表面的法线分布函数,他用于计算多少比例的微面元的法线满足m(微面法线)=h(半程向量),即多少微面元能把l反射到v上。
-
G(l,v,h)是阴影遮蔽函数。用于计算满足m=h的微面中多少会因为遮蔽而不被看到,即活跃微面的比例。
-
F(l,h)是这些活跃微面的菲涅尔反射函数,即反射光线占入射光线比例。
-
4(n·l)(n·v)是用于校正从微面局部空间到整体宏观表面数量差异的校正因子。
不同部分的实现模型:
法线分布函数模型:
- Blinn-Phone模型。($D_{blinn}(h) = (n·h)^{gloss}$)
- GGX模型。
- Beckmann模型。
阴影-遮蔽函数模型:
- Smith模型。
※Unity使用的PBS实现:
-
漫反射:
$f_{diff}(l,v)={baseColor \over \pi}(1 +(F_{D90} - 1)(1-n·l)^5)(1 + (F_{D90} - 1)( 1 - n·v)^5)$ -
高光反射法线分布函数D(h):
$D_{GGX} = {{α^2} \over {\pi((α^2 - 1)(n·h)^2 + 1)^2}}$
($α = roughness^2$)
- 阴影-遮蔽函数G(l,v,h):(GGX衍生的smith-schlick函数)
$G(l,v,h) = {{1} \over {((n·l)(1 - k) + k)((n·v)(1 - k) + k)}}$
(其中$k = {{roughness^2} \over {2}}$)
- 菲涅尔反射F(l,h):
$F(l,h) = F_0 + (1 - F_0)(1 - l·h)^5$
($F_0$即高光反射系数,即高光反射颜色)
( The End )