gpt4 book ai didi

c++ - 如何避免远距离的Z-fighting?

转载 作者:太空狗 更新时间:2023-10-29 19:51:59 25 4
gpt4 key购买 nike

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

让我澄清一下。想想天际。注意到山脉有时是如何闪烁的吗?当使用 OpenGL 渲染场景时,所有对象都被挤入或“夹紧”到 Z 值从 -1.0 到 1.0 的小坐标平面中。然后对每个对象进行深度测试——树木、雪、山、动物、房屋,随便你怎么说,这样当它们被其他东西覆盖时就不会被绘制出来。然而,浮点只能达到一定的精度水平,因此将数百个对象夹在一个微小的空间中不可避免地会导致一些对象具有完全相同的 Z 坐标,并且这两个对象在屏幕上一起闪烁,这种现象称为“Z -斗争”。我问是否每个对象的深度 (z-) 坐标都可以转换为 double ,以便它们具有足够的精度(值得在可忽略的时间段内使用可忽略不计的额外内存)以便以正确的顺序准确地绘制对象,不会相互夹住。

最佳答案

When a scene is rendered with OpenGL, all the objects are crammed, or "clamped" into a small coordinate plane with Z-values from -1.0 to 1.0.

这只是故事的一部分。另一部分是 z 是非线性存储的:具有最高“保真度”的部分是靠近近 Z 平面的部分,保真度随着您向后移动而降低。参见 this page一个公式。

OpenGL 常见问题 12. The Depth Buffer12.070 为什么在深度缓冲区的前端有更高的精度? 中对此进行了讨论,并且 12.080 提出了不同 z 距离的多 channel 渲染。

您可以使用 glGetIntegerv(GL_DEPTH_BITS, &bits); 查询当前的深度缓冲区大小,但是(在搜索之后)似乎没有标准的方法来改变它以使用更大(或更小)深度。

可以通过不将它们绘制为 3D 对象来应对远处对象中的 Z 战斗。例如,如果您示例中的山脉距离很远,则任何视差效果都将不可见。所以在那种情况下,将远处的物体绘制到天空盒上可能会更好。

关于c++ - 如何避免远距离的Z-fighting?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32938159/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com