我一直在努力对我的光照着色器进行一些风格化,但遇到了障碍。我的主要开发计算机有一个 ATI 卡,它可以毫无问题地渲染我的新照明场景。但是,NVIDIA 显卡往往会出现失真或撕裂现象。它几乎看起来像一个 zbuffer 问题,但它完全让我不知道问题可能是什么。我在这里拍了一张屏幕截图:http: //i.imgur.com/CT5ymGH.png(注意脸上的“抖动”)
这是片段程序的相关部分:
in vec3 vertex_color;
in vec4 vertex_position;
out vec4 fragment_color;
uniform vec3 playerPosition;
void main(void)
{
float playerDistanceTorch = length(playerPosition - floor(vertex_position.xyz));
float playerTorch = (160 - playerDistanceTorch * playerDistanceTorch);
fragment_color = vec4(vertex_color, 1) * clamp(playerTorch * 0.005, 0, 1);
}
同样,到目前为止,这似乎只影响我测试中的 NVIDIA 卡,所以我很困惑。我的第一个猜测是浮点精度错误,所以我尽量让 playerTorch 保持大(原始代码是 0.8 - 0.005*playerDistanceTorch*playerDistanceTorch)。
编辑:通过一些实验,我发现问题来自于 vertex_position 的线性插值。如果我使这个值“平坦”(这样就不会发生插值),那么撕裂就会消失。然而,这并没有产生预期的效果。