如何避免距离Z战斗?

Sam*_*aus 3 c++ opengl precision projection

所以我最近观看了一个关于Z战斗的视频,并了解了一种简单的方法来处理它 - 主要是.给出的解决方案是实际倾斜投影,以便为更近的物体提供更多空间以进行更精确的深度测试(因为浮体只能如此精确),并且更远的物体被塞入投影的小区域.现在我对OpenGL和图形编程都很陌生(只是慢慢地工作),而且我实际上没有做任何复杂的事情,这对我来说是一个问题,但我可能需要在将来知道这一点.无论如何,所述解决方案所带来的新问题是在远处进行更糟糕的Z战斗(例如Skyrim,Rust等山区).有没有更好的解决方案,即使它具有成本效益,也不涉及图形妥协?假设说(因为我'

让我澄清一下.想想天际.注意山有时会闪烁吗?当使用OpenGL渲染场景时,所有对象都被填充或"钳制"到Z值为-1.0到1.0的小坐标平面中.然后对每个物体进行深度测试 - 树木,雪,山脉,动物,房屋,你可以命名它,这样当它们被其他东西覆盖时就不会画出东西.然而,浮点只能达到一定的精度水平,因此将数百个物体夹入一个微小的空间不可避免地导致一些物体具有完全相同的Z坐标,并且这两个物体在屏幕上闪烁在一起,称为"Z" -战斗".我问是否每个物体的深度(z-)坐标都可以投入双打,

usr*_*301 5

当使用OpenGL渲染场景时,所有对象都被填充或"钳制"到Z值为-1.0到1.0的小坐标平面中.

这只是故事的一部分.另一部分是z非线性存储的:具有最高"保真度"的部分是靠近近Z平面的,而保真度随着向后行进而减小.有关公式,请参阅此页面.

OpenGL FAQ 12.深度缓冲区12.070中讨论了这个问题为什么深度缓冲区前面有更高的精度?,和12.080提出了不同z距离的多遍渲染.

您可以使用查询当前深度缓冲区大小glGetIntegerv(GL_DEPTH_BITS, &bits);,但(搜索后)似乎没有标准方法可以将其更改为使用更大(或更小)的深度.

在遥远的物体中进行Z战斗可以通过不将它们绘制为3D物体来抵消.例如,如果你的例子中的山脉很远,任何视差效果都是不可见的.因此,在这种情况下,将远处的物体绘制到天空盒上可能会更好.

  • 默认帧缓冲区的深度缓冲区的位深度不受GL控制,而是由操作系统控制.它是窗口的属性(或者使用的任何drawable),因此,必须使用平台的GL接口API(如Windows上的wgl,unix/X11上的glX等)来设置它.但是,不要期望在常见的硬件上看到超过24位(整数)的广泛支持.但是,使用FBO时,通常可以使用32位浮点深度缓冲区. (2认同)