我正在使用Cook-Torrance高光BRDF +迪士尼漫反射BRDF灯光模型,如果单独使用,它们可以正常工作。不幸的是,如果我尝试将它们结合起来,就会发生奇怪 漫反射光照贴图如下所示: 镜面光照贴图(地形边缘的注意事项):
生成的光照贴图的计算如下:
float result = Fr + Fd;
其中Fd是漫反射BRDF分量,Fr是镜面BRDF分量。
为什么它会在生成的光照贴图上产生这样的瑕疵?
我认为结果光强度超出范围[0; 1],检查我是否按如下方式修改了代码:
return result <= 1.0 ? result : 1.0;
正如你所看到的,所有的工件现在都具有1.0的强度(它们明显超过[0; 1]范围),但是如果镜面反射贴图包含零,为什么会一直发生呢?
完整着色器代码:Pastebin
答案 0 :(得分:2)
正如@Columbo所提到的,它是NaN异常(抛出除零的原因),这导致了奇怪的着色器行为。我稍微修改了代码:
float F_Schlick (in float f0, in float f90, in float u)
{
return f0 + ( f90 - f0 ) * pow(clamp(1.0 - u, 0.0, 1.0), 5.0); //line 34
}
点积应大于零:
float dotNV = abs(dot(N, V));
float dotNL = abs(dot(N, L));