地形在水中闪烁|深度缓冲精度问题?

时间:2015-10-05 16:01:48

标签: java opengl lwjgl glu

我的地形水问题,目前只是一个透明蓝色的四边形。

当接近它时,它看起来像这样: enter image description here

如您所见,它非常简单 - 一个代表水的扁平透明四边形。

然而,当我走得更远时,会发生这种情况: enter image description here

对于那些无法看到GIF,或者需要external link(或者无法理解发生了什么)的人来说,地形在水面上会出现故障。如果你在水面附近看得太近,你会看到地形在它上面/下方有毛刺。

以下是我准备3D视图的代码:

static void ready3D()
{
    glViewport(0, 0, Display.getWidth(),Display.getHeight());
    glMatrixMode(GL_PROJECTION);

    glLoadIdentity();
    GLU.gluPerspective(45, (float) Display.getWidth()/Display.getHeight(), 50f, 500f);

    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();

    glDepthFunc(GL_LEQUAL);
    glEnable(GL_DEPTH_TEST);
}

有谁知道问题是什么,以及如何提高深度缓冲区的精度(假设深度缓冲区是问题)?

2 个答案:

答案 0 :(得分:2)

很难从GIF中得知,但我收集的内容是您遇到Z-Fighting的实例。

有几种解决方案对于处理Z-Fighting最有效:

  • 提高Z缓冲区的分辨率。
  • 调整水和水的相对位置。着陆将它们进一步分开,从而减少两个几何形状碰撞的可能性
  • 使用模板缓冲区确保正确绘制对象。

我也看到过在处理某些对象时尝试禁用深度测试的解决方案,但这些解决方案几乎从不作为一般解决方案。

答案 1 :(得分:1)

增加深度缓冲区不会有太大帮助,因为打开一个世界会导致从zNear到zFar的距离很远,而zFar会映射到深度缓冲区。一个常见的技巧是实施logarithmic depth buffer。这使您能够在需要细节的地方重音,但在当前情况下,这需要随车辆+摄像系统的高度而变化。所以对数缓冲区不是解决方案,增加“线性”缓冲区不会影响很多。我建议阅读thisthis有关深度缓冲的精彩文章。

第二点是您的景观似乎是程序性生成的。如果它是如此顶点可能产生真正接近水面高度。只有深度缓冲区操作(如果可能的话),在这个浮点比较战中获胜并不简单。

第三点是,通常你不需要额外的运行时作业,这就是模板缓冲区使用在这里有问题的原因(注意到JPhi1618)。

因此,如果您有机会从我的角度修改景观生成算法,那么这是值得的。再次来自JPhi1618字:

  

如果Y小于水位,即使是一点点,也要比水少。