OpenGL中的Z深度测试

时间:2009-06-27 02:15:43

标签: opengl graphics

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

但是为什么openGL不能只使用相同的深度测试,总是能够找出反向距离顺序最远的那个并为你做这个?它只是框架的一个限制,还是与你在图形硬件中有效处理的东西有关,或类似的东西?

只是想知道。希望有人在这里澄清。

3 个答案:

答案 0 :(得分:11)

好问题。

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

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

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

希望这有帮助。

答案 1 :(得分:3)

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

此外,材质不直接与API中的三角形相关联,因此OpenGL实际上无法知道哪些是透明的,哪些是不透明的,直到它们实际呈现为止。

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

答案 2 :(得分:2)

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

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