片段撕裂程序(GLSL)

时间:2013-10-03 17:12:35

标签: opengl glsl nvidia

我一直致力于为我的灯光着色器设计风格,并遇到了障碍。我的主要开发计算机有一张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的线性插值。如果我将此值设为“平坦”(这样就不会发生插值),那么撕裂就会消失。但是,这并没有产生预期的效果。

1 个答案:

答案 0 :(得分:0)

它几乎看起来像z-fighting,确保你的立方体不会渲染两次。此外,我看到你的alpha通道被调制,可能启用了混合,你有不希望的混合。如果是这种情况,请尝试:

fragment_color = vec4(vertex_color * clamp(playerTorch * 0.005, 0, 1), 1);

代替。如果您不想要,请禁用混合。 希望这有帮助