2

我一直在努力对我的光照着色器进行一些风格化,但遇到了障碍。我的主要开发计算机有一个 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 的线性插值。如果我使这个值“平坦”(这样就不会发生插值),那么撕裂就会消失。然而,这并没有产生预期的效果。

4

1 回答 1

0

它几乎看起来像 z-fighting,确保你的立方体没有被渲染两次。我还看到您的 Alpha 通道已被调制,也许混合已启用并且您有不希望的混合。如果是这种情况,请尝试:

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

反而。或者如果您不想要任何混合,请禁用混合。希望这可以帮助

于 2013-10-03T17:58:33.430 回答