【问题标题】:Z-Depth Testing in OpenGLOpenGL 中的 Z 深度测试
【发布时间】:2009-06-27 02:15:43
【问题描述】:

第一次来。今天坐下来自学OpenGL。但是我遇到了一个我似乎无法找到答案的问题。我想知道为什么深度测试似乎与 OpenGL 中的半透明对象不兼容。文档似乎建议您必须关闭深度测试,然后以反向距离顺序绘制对象,然后混合将正常工作。

但是,为什么 openGL 不能只使用它总是使用的相同深度测试来找出反向距离顺序中最远的位置并为您执行此操作?这只是框架的限制,还是与您在图形硬件中可以高效完成的事情有关?

只是想知道。希望这里有人能解释一下。

【问题讨论】:

    标签: opengl graphics


    【解决方案1】:

    好问题。

    简短的回答是 Z 缓冲区(仅)为帧缓冲区中的每个像素存储一个值。给定“常规”操作模式(对于不透明对象--启用GL_DEPTH_TESTglDepthFunc 设置为GL_LESS),该值将是映射到该像素的最近片段的深度。

    帧缓冲区是一个“愚蠢”的设备——每个片段的光栅化和深度测试都独立于所有其他片段,并且与产生它的任何原语概念脱节。因此,没有地方可以保存有关前面的基元、深度排序等的信息,而这些信息是实现“自动透明”功能所必需的。

    您可能需要查看“场景图”以获得深度排序的帮助。这些库在 OpenGL 提供的基本 T&L 内容之外添加了“更高级别”的功能。

    希望这会有所帮助。

    【讨论】:

      【解决方案2】:

      OpenGL 一次写入一个像素到深度缓冲区,并按照呈现给 OpenGL 的顺序渲染产生像素的三角形。 OpenGL 不对三角形进行任何深度排序,由调用框架以对该应用程序最有效的方式进行管理。这是出于速度和灵活性的目的,因为渲染大量三角形的最有效方法是将它们存储在顶点和索引的连续缓冲区中,如果 API 必须担心每一帧都对它们进行排序,那将使事情要慢得多。

      此外,材质与 API 中的三角形没有直接关联,因此 OpenGL 在实际渲染之前无法知道哪些是透明的,哪些是不透明的。

      处理它的一个好方法是先绘制所有不透明的三角形,然后最后绘制所有透明/alpha 混合的三角形。您通常希望启用深度测试,但禁用深度写入,并将透明三角形从后到前排序以正确混合。我通常处理这个问题的方法是有一个带有多个桶的场景图,当我向场景图中添加三角形时,它会自动将它们分成适当的桶,这些桶将以正确的顺序呈现。

      【讨论】:

        【解决方案3】:

        我还没有听说过关闭深度测试。您想要对透明对象进行深度测试。

        您只是不希望透明对象写入 z 缓冲区,因为那样它们会在其后面的任何东西上打孔,然后绘制。

        【讨论】:

        • 我想知道为什么这被投票赞成,因为如果你按照他的建议使用 OpenGL,那么在你的透明对象之后但在它后面绘制的所有内容都会完全遮挡透明对象,显然不是故意的。
        • 这就是重点——你最后绘制透明的东西,启用深度测试但禁用深度写入。这样透明的东西仍然会被它前面的不透明的东西遮挡。
        • 您最后绘制透明对象,从后向前。我以为他已经知道了,因为他提到了相反的顺序,并且在询问 z 缓冲。
        猜你喜欢
        • 1970-01-01
        • 2013-07-27
        • 2015-10-12
        • 1970-01-01
        • 2018-07-21
        • 1970-01-01
        • 1970-01-01
        • 2012-02-21
        • 2012-03-09
        相关资源
        最近更新 更多