我正在将3D对象(obj或3ds或collada文件)加载到我的openGL应用程序中。 3环境非常大(所有轴都有几百米)。 我的问题是较小的3D物体(即〜<1-2m的数量级)似乎没有被正确地深度测试。根据相机的变焦,我有时可以看到物体的背面(我一直在使用一个简单的立方体进行测试)或其他面部变得可见/不可见/撕裂。请参阅附图以获得更好的解释。 我被引导相信问题是由于启用了mipmapping。我想要禁用mipmapping(有人可以建议一种简单,快速的方法)或者为mipmap对象设置更大的分辨率。或者我是否完全咆哮错误的树?
由于
克里斯
答案 0 :(得分:11)
这是z-buffer exission不足的结果,这在具有巨大世界但(相对)小对象的游戏中是一个问题。直接的解决方案是尝试使用24位z缓冲区而不是16位缓冲区。解决这个问题的另一种方法是将游戏世界渲染两步,首先是远处的大物体,然后清除zbuffer然后绘制更近的物体。
顺便提一下,这个特定问题叫做z-fighting,这是关于这个问题的一个很好的资源:http://www.codermind.com/articles/Depth-buffer-tutorial.html
外卖是上面文章的最后一段:
真正的问题是你无法画画 这两个对象都非常远 非常靠近的物体 相同的深度缓冲方程。如果你 想要绘制很远的物体然后你 需要牺牲你的近视 进一步推动它。为了避免剪裁 你可以碰撞的文物 信封足够大,以便你的 剪辑平面永远不会拦截 你的视锥内的现有物体。 或者你可以逐渐制作对象 随着他们的透明度消失 靠近你的剪裁飞机。
如果你想保持靠近物体和 同时画山(或 行星)在远处,然后你 可以切割部分渲染。第一 然后绘制远处的物体 清除深度缓冲区和 用a渲染近物体 不同的z缓冲区。
答案 1 :(得分:2)
与Julio一样,我认为这是一个深度精度问题,而不是与mip-mapping有关的问题。但是,我建议你在更改其他任何东西之前调整你的近和远剪裁平面(你可能已经使用了24位深度缓冲区,因为这是大多数驱动程序/卡上的默认值)。特别是近平面应尽可能远离您的场景。查找对glFrustum
或gluPerspective
的来电。