GLSL PBS 实现,奇怪的着色器行为
GLSL PBS implementation, weird shader behaviour
我正在使用 Cook-Torrance 镜面 BRDF + Disney 的漫反射 BRDF 灯光模型,如果单独应用它们可以正常工作。不幸的是,如果我尝试将它们组合起来,就会发生一些奇怪的事情:
漫反射光照贴图如下所示:
镜面光照贴图(注意地形边缘的伪影):
生成的光照贴图是这样计算的:
float result = Fr + Fd;
其中 Fd 是漫反射 BRDF 分量,Fr 是镜面反射 BRDF 分量。
为什么它会在生成的光照贴图上产生这样的瑕疵?
我在想产生的光强超出范围[0;1],检查我是否修改了代码如下:
return result <= 1.0 ? result : 1.0;
生成的光照贴图:
如您所见,所有伪影的强度现在都为 1.0(它们显然超出了 [0;1] 范围),但如果高光贴图包含零,为什么会一直出现这种情况?
完整着色器代码:Pastebin
正如@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));
我正在使用 Cook-Torrance 镜面 BRDF + Disney 的漫反射 BRDF 灯光模型,如果单独应用它们可以正常工作。不幸的是,如果我尝试将它们组合起来,就会发生一些奇怪的事情:
生成的光照贴图是这样计算的:
float result = Fr + Fd;
其中 Fd 是漫反射 BRDF 分量,Fr 是镜面反射 BRDF 分量。
为什么它会在生成的光照贴图上产生这样的瑕疵?
我在想产生的光强超出范围[0;1],检查我是否修改了代码如下:
return result <= 1.0 ? result : 1.0;
生成的光照贴图:
如您所见,所有伪影的强度现在都为 1.0(它们显然超出了 [0;1] 范围),但如果高光贴图包含零,为什么会一直出现这种情况?
完整着色器代码:Pastebin
正如@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));