1

我正在将 3D 对象(obj 或 3ds 或 collada 文件)加载到我的 openGL 应用程序中。3 环境相当大(全轴几百米)。我的问题是较小的 3D 对象(即按 ~< 1-2m 的顺序)似乎没有正确地进行深度测试。根据相机的变焦,我有时可以看到物体的背面(我一直在使用简单的立方体进行测试)或其他面变得可见/不可见/撕裂。请参阅附图以获得更好的解释。我被引导相信问题是由于启用了 mipmapping。我想禁用 mipmapping(有人可以建议一种简单、快速的方法来执行此操作)或将 mipmapped 对象的分辨率设置为更大。还是我完全找错了树?

替代文字 替代文字 替代文字

谢谢

克里斯

4

2 回答 2

11

这是 z 缓冲区精度不足的结果,这在具有巨大世界但(相对)小对象的游戏中是一个问题。直接的解决方案是尝试使用 24 位 z 缓冲区而不是 16 位缓冲区。解决这个问题的另一种方法是将游戏世界渲染为两步,首先是远处的大物体,然后清除 zbuffer,然后绘制更近的物体。

顺便说一下,这个特定的问题被称为 z-fighting,这里有一个关于这个问题的好资源:http: //www.codermind.com/articles/Depth-buffer-tutorial.html

要点是上面文章的最后一段:

真正的问题是,您无法使用相同的深度缓冲区方程同时绘制非常远的对象和非常近的对象。如果你想画很远的物体,那么你需要通过进一步推动它来牺牲你的近景。为避免剪切伪影,您可以使碰撞包络足够大,以便您的剪切平面永远不会拦截平截头体中的现有对象。或者,您可以使对象在靠近您的剪切平面时逐渐消失并具有透明度。

如果您想保持靠近物体的同时在远处绘制山脉(或行星),那么您可以将您的渲染分割成部分。首先绘制您的远处对象,然后清除深度缓冲区并使用不同的 z 缓冲区渲染近处对象。

于 2010-12-17T09:33:51.920 回答
2

和 Julio 一样,我认为这是一个深度精度问题,与 mip-mapping 无关。但是,我建议您在更改任何其他内容之前先调整您的近剪裁平面和远剪裁平面(无论如何,您可能已经在使用 24 位深度缓冲区,因为这是大多数驱动程序/卡的默认设置)。特别是对于您的场景,近平面应该尽可能远。查找对glFrustum或的调用gluPerspective

于 2010-12-17T09:39:24.220 回答