OpenGL中的MipMapping问题

时间:2010-12-17 09:11:17

标签: opengl textures mipmaps tearing

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

alt text alt text alt text

由于

克里斯

2 个答案:

答案 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位深度缓冲区,因为这是大多数驱动程序/卡上的默认值)。特别是近平面应尽可能远离您的场景。查找对glFrustumgluPerspective的来电。