为什么OpenGL有一个远剪裁平面,用什么成语来处理这个?

exi*_*all 10 opengl 3d graphics render projection

我一直在学习OpenGL,而另一个让我感到困惑的话题就是远剪裁平面.虽然我可以理解近剪裁平面背后的原因,以及侧面剪裁平面(由于它们外面的物体永远不会被渲染,但它们从未产生任何实际效果),远剪裁平面似乎只是一个烦恼.

因为OpenGL背后的人显然已经想到这一点,所以我知道必须有一些我缺少的东西.为什么OpenGL有一个远剪裁平面?更重要的是,因为你无法将其关闭,在远距离绘制物体时使用的推荐成语和做法是什么(对于诸如太空游戏,天空盒等数千个单位之外的星星等物体)?您是否希望将剪裁平面放得很远,还是有更优雅的解决方案?这是如何在生产软件中完成的?

ltj*_*jax 20

唯一的原因是深度精度.由于深度缓冲区中只有有限的位数,因此您也可以用它来表示有限的深度.

但是,您可以将远平面设置为无限远:请参阅.它对深度缓冲区效果不佳 - 如果你有很远的遮挡,你会看到很多文物.

因此,由于这围绕深度缓冲区,只要你不使用它,你就不会有处理更远的东西的问题.例如,一种常见的技术是在"平板"中渲染场景,每个场景仅在内部使用深度缓冲区(对于一个平板中的所有东西),但在外部使用某种形式的画家算法(对于平板,因此您绘制最远的一个)第一)


Nic*_*las 9

为什么OpenGL有一个远剪裁平面?

因为计算机是有限的.

通常有两种方法可以尝试解决这个问题.一种方法是通过将极限设为z-far接近无穷大来构建投影.这将收敛于有限值,但它可以对远距离物体的深度精度造成严重破坏.

另一种选择(如果你愿意让超过一定距离的物体完全无法正确深度测试)就是打开深度钳位glEnable(GL_DEPTH_CLAMP).这样可以防止近距离和远距离平面的削波; 只是在[-1,1]范围之外将标准化z坐标的任何片段都会被限制在该范围内.如前所述,它会在被夹住的碎片之间拧紧深度测试,但通常这些物体很远.