1.通过网上冲浪了解到,BentNormal可以解决间接环境高光漏光及间接漫反射光照漏光的问题。
这里的漏光是指间接光照部分没有考虑到模型自身的遮挡关系导致的漏光。
2.可以通过SD之类的软件烘焙BentNormal贴图,软件会根据余弦角向外计算各个角度可见性,最终求平均得到一个向量,会在之后的计算里带入这个向量求权重。
另外BentNormal贴图存放的是归一化向量,和法线的储存方式一样。
具体可参考文章:https://developer.download.nvidia.cn/books/HTML/gpugems/gpugems_ch17.html
注:烘焙时设置更远的最大检测距离效果会比较好
3.Unity实现部分看了一下GetSpecularOcclusionFromBentAO,差不多是这个意思,
如果大于BendNormal向量的权重区域就不计算Occlusion,否则根据系数计算SpecularOcclusion的值并返回。
间接光照的测试(以光照探针SH为例),开了2倍的NormalMap缩放,防止图片压缩不明显。
(左 无BentNormal, 右 BentNormal)
高光的测试,需要打开Specular Occlusion的From Bent Normal。
测试效果:
(左 无BentNormal, 右 BentNormal)
最后我验证了下理解是否正确,在URP中改写了一个简单的BentNormal,用其给间接光照部分增加权重:
//GlobalIllumination部分增加 float bentNormalIntensity = saturate(1.0 - dot(normalWS, bentNormalWS)); float weight = max(dot(bentNormalWS, reflectVector), 0.0); weight = lerp(1.0, weight, _BentNormalWeight * bentNormalIntensity); indirectDiffuse *= weight; indirectSpecular *= weight; fresnelTerm *= weight;
然后还是赋予之前烘焙好的BentNormal贴图,结果如下:
(左 无BentNormal, 右 BentNormal)