理论支线:直接光漫反射与GGX高光的混合问题
渲染方程
直接光分为漫反射和镜面反射两部分,混合的话他们分别对应一个系数
\[L_o(p,\omega_o) = \int\limits_{\Omega}(k_d\frac{c}{\pi} + k_s\frac{DFG}{4(\omega_o \cdot n)(\omega_i \cdot n)}) L_i(p,\omega_i) n \cdot \omega_i d\omega_i\]这里需要说明:Kd = (1 - F) × (1 - metallic) 而Ks = F (菲涅尔项),它实际上已经包含在GGX计算公式中了,所以无需再处理
简化
这段代码提前剔除了金属部分漫反射,会导致能量不守恒,但是如果卡通渲染实际上没什么问题,可以不用求KD,就是说实话不处理pbrDiffuseColor也没问题,直接加上GGX就行,加这个总感觉是多余,0.04的差距肉眼也看不出来。
1
2
3
4
//整体漫反射剔除金属的的漫反射
float3 pbrDiffuseColor = lerp(0.96 * diffuseColor, 0, metallic);
//非金属
float3 f0 = lerp(0.04, diffuseColor, metallic);
参考代码
1
2
3
4
float3 KD_GGX = (1 - f)* (1 - metallic);
//======================
float3 pbrSpecularColor = ggxBRDF * _SpecularColor * lightColor * nol;
float3 pbrDiffuseColor = baseCol /3.14159 * KD_GGX * nol * lightColor;
最终混和则需要和阴影计算
1
float3 finalColor = (pbrDiffuseColor + pbrSpecularColor) * shadow;
Enjoy Reading This Article?
Here are some more articles you might like to read next: