直接光照部分
BRDF方程
漫反射:兰伯特光照模型,除以π是为了能量守恒
高光反射
D项
这个式子被称为Trowbridge-Reitz GGX,是高光反射项的D项,法线分布项。
其中的h为半角向量,n为法线,α是粗糙度相当于roughness或者1 - smoothness,
unity内部实现的roughness(或者α) = (1 - smoothness) * (1 - smoothness)
可以看出
粗糙度α = 0的时候,也就是完美光滑的情况,得到的结果是0,那么就会返回一团黑色,在unity内部做了一个插值lerp(0.002,1,roughness),这样可以保证带一点点高光。
粗糙度α = 1的时候,也就是完美粗糙的情况,得到的结果是1/π,是一个偏灰色的值。
当α从(0 - 1)之间过渡的时候(D项用的是GGXTR,return float4(D,D,D,1));
G项
F项
菲涅尔方程描述的是被反射的光线对比光线被折射的部分所占的比率,这个比率会随着我们观察的角度不同而不同。当光线碰撞到一个表面的时候,菲涅尔方程会根据观察角度告诉我们被反射的光线所占的百分比。利用这个反射比率和能量守恒原则,我们可以直接得出光线被折射的部分以及光线剩余的能量。
当垂直观察的时候,任何物体或者材质表面都有一个基础反射率(Base Reflectivity),但是如果以一定的角度往平面上看的时候所有反光都会变得明显起来。当用垂直的视角观察你自己的木制/金属桌面,此时一定只有最基本的反射性。但是如果你从近乎90度(指和法线的夹角)的角度观察的话反光就会变得明显的多。如果从理想的90度视角观察,所有的平面理论上来说都能完全的反射光线。
方程中的F0理论上是平面的基础反射率,但实际实现时需要考虑另一个情况,即:
菲涅尔方程只对非金属有效(因为金属本身反射率就高,所以在不同角度下的菲涅尔反射不明显),在表面为金属时需要用到跟金属表面颜色相关的另一个方程。为了能够用同一个材质表示金属和非金属的不同属性,将材料的金属性参数整合到F0的计算中。
float3 F0 = lerp(unity_ColorSpaceDielectricSpec.rgb, Albedo, _Metallic);</