【问题标题】:Tearing in Fragment Program (GLSL)片段撕裂程序 (GLSL)
【发布时间】: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 位。

标签: opengl glsl nvidia


【解决方案1】:

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

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

相反。或者如果您不想要任何混合,请禁用混合。 希望这会有所帮助

【讨论】:

  • 嗨 Jean-Simon,我完全同意它看起来像 z-fighting,但即使我只渲染单个 VAO 一次(而不是其他任何东西)我仍然可以看到同样的问题。我还尝试了您将 alpha 设置为 1 的建议,但是在渲染此 VAO 期间已经禁用了混合,我没有发现任何不同。这个问题在我的 NVIDIA 测试中仍然存在。我认为这是 NVIDIA 和 ATI/Intel 执行插值方式的不同之处。如果我对 vertex_position 使用“flat”,那么我就不会再看到这个问题了。
  • 好的,谢谢你的精确。我暂时没有任何想法。顶点着色器有什么特别之处吗?任何几何着色器?看起来片段着色器中的插值 vertex_position 是另一个片段的。您还可以在顶点着色器中计算片段颜色。
  • 顶点着色器非常简单,只需通过将输入顶点乘以模型矩阵来设置顶点位置。我想在着色器中进行光照计算,但我无法从顶点数据中分辨出我正在绘制哪个四边形。我通过在片段着色器中占据顶点位置的地板,“欺骗”系统知道正在渲染哪个四边形。由于我所有的正方形都是单位长度(1x1),因此地板会为整个四边形保持一致的颜色。我不确定如何在不存储更多信息的情况下在顶点着色器中复制它。
  • 是的,顶点着色器中的计算将是 Gouraud 着色,我认为您想要的是 Phong 着色。我猜你有最新的 NVidia 驱动程序?
  • 是的,我有最新的驱动程序。同样的现象也出现在另一台基于 NVIDIA 的计算机上(一位测试游戏的朋友)。在他们的硬件上似乎是一个一致的问题。
猜你喜欢
  • 1970-01-01
  • 2011-04-04
  • 2012-06-15
  • 2011-04-09
  • 1970-01-01
  • 2014-05-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多