我的地形水问题,目前只是一个透明蓝色的四边形。
如您所见,它非常简单 - 一个代表水的扁平透明四边形。
对于那些无法看到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);
}
有谁知道问题是什么,以及如何提高深度缓冲区的精度(假设深度缓冲区是问题)?
答案 0 :(得分:2)
很难从GIF中得知,但我收集的内容是您遇到Z-Fighting的实例。
有几种解决方案对于处理Z-Fighting最有效:
我也看到过在处理某些对象时尝试禁用深度测试的解决方案,但这些解决方案几乎从不作为一般解决方案。
答案 1 :(得分:1)
增加深度缓冲区不会有太大帮助,因为打开一个世界会导致从zNear到zFar的距离很远,而zFar会映射到深度缓冲区。一个常见的技巧是实施logarithmic depth buffer。这使您能够在需要细节的地方重音,但在当前情况下,这需要随车辆+摄像系统的高度而变化。所以对数缓冲区不是解决方案,增加“线性”缓冲区不会影响很多。我建议阅读this和this有关深度缓冲的精彩文章。
第二点是您的景观似乎是程序性生成的。如果它是如此顶点可能产生真正接近水面高度。只有深度缓冲区操作(如果可能的话),在这个浮点比较战中获胜并不简单。
第三点是,通常你不需要额外的运行时作业,这就是模板缓冲区使用在这里有问题的原因(注意到JPhi1618)。
因此,如果您有机会从我的角度修改景观生成算法,那么这是值得的。再次来自JPhi1618字:
如果Y小于水位,即使是一点点,也要比水少。