【发布时间】:2013-10-03 17:12:35
【问题描述】:
我一直在努力对我的光照着色器进行一些风格化,但遇到了障碍。我的主要开发计算机有一个 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 的线性插值。如果我使这个值“平坦”(这样就不会发生插值),那么撕裂就会消失。但是,这并没有达到预期的效果。
【问题讨论】:
-
您能否详细说明您在两种硬件上使用的像素格式?你用的是FBO吗?如果没有,您能否查询像素格式(特别是深度缓冲区)。
-
我正在使用 GLUT 请求具有多重采样和深度的 RGBA(32 位)。我还通过请求模板缓冲区(Apple 计算机的技巧)来欺骗系统使用更大的深度缓冲区。这是有问题的代码: Glut.glutInitDisplayMode(Glut.GLUT_DOUBLE | Glut.GLUT_DEPTH | Glut.GLUT_ALPHA | Glut.GLUT_STENCIL | Glut.GLUT_MULTISAMPLE);我没有使用任何 FBO。 NVIDIA、ATI 和 Intel 卡(我测试的每个系统)上的深度缓冲区为 24 位。