GLSL PBS实现,怪异的着色器行为

时间:2015-08-18 09:40:54

标签: glsl shader fragment-shader

我正在使用Cook-Torrance高光BRDF +迪士尼漫反射BRDF灯光模型,如果单独使用,它们可以正常工作。不幸的是,如果我尝试将它们结合起来,就会发生奇怪 Specular Intensity + Diffuse Intensity artifacts 漫反射光照贴图如下所示: enter image description here 镜面光照贴图(地形边缘的注意事项): enter image description here

生成的光照贴图的计算如下:

float result = Fr + Fd;

其中Fd是漫反射BRDF分量,Fr是镜面BRDF分量。

为什么它会在生成的光照贴图上产生这样的瑕疵?

我认为结果光强度超出范围[0; 1],检查我是否按如下方式修改了代码:

return result <= 1.0 ? result : 1.0;

产生的光照贴图: Modified shaders

正如你所看到的,所有的工件现在都具有1.0的强度(它们明显超过[0; 1]范围),但是如果镜面反射贴图包含零,为什么会一直发生呢?

完整着色器代码:Pastebin

1 个答案:

答案 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));

The final shader code