OpenGL中的Z深度测试

OpenGL中的Z深度测试,opengl,graphics,Opengl,Graphics,第一次来这里。今天坐下来自学OpenGL。但是我遇到了一个我似乎找不到答案的问题。我想知道为什么深度测试似乎与OpenGL中的半透明对象不兼容。文档似乎建议您必须关闭深度测试,然后以相反的距离顺序绘制对象,混合将正常工作 但是为什么openGL不能使用它通常使用的深度测试,以相反的距离顺序计算出最远的距离,并为您这样做呢?这只是框架的一个限制,还是与图形硬件的有效性有关,或者类似的东西 只是想知道。希望这里有人能解释清楚。好问题 简而言之,Z缓冲区为帧缓冲区中的每个像素存储一个值(仅)。给定“常

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

但是为什么openGL不能使用它通常使用的深度测试,以相反的距离顺序计算出最远的距离,并为您这样做呢?这只是框架的一个限制,还是与图形硬件的有效性有关,或者类似的东西

只是想知道。希望这里有人能解释清楚。

好问题

简而言之,Z缓冲区为帧缓冲区中的每个像素存储一个值(仅)。给定“常规”操作模式(对于不透明对象--
GL\u DEPTH\u TEST
已启用,
glDepthFunc
设置为
GL\u LESS
),该值将是映射到该像素的最近片段的深度

帧缓冲区是一个“哑”设备——每个片段都独立于所有其他片段进行光栅化和深度测试,并且与生成它的原语的任何概念都是分离的。因此,对于实现“自动透明”功能所需的有关前面的原语、深度排序等信息,没有位置可供保存

您可能希望查看“场景图”以获得深度排序方面的帮助。这些库除了OpenGL提供的基本T&L功能外,还添加了“更高级别”的功能


希望这能有所帮助。

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


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

OpenGL一次写入深度缓冲区一个像素,并按照呈现给OpenGL的顺序渲染生成像素的三角形。OpenGL不会对三角形进行任何深度排序,而是由调用框架以最有效的方式对其进行管理。这是为了提高速度和灵活性,因为渲染大量三角形的最有效方法是将它们存储在顶点和索引的连续缓冲区中,如果API不得不担心在每一帧对它们进行排序,这将使速度大大降低

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


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

我想知道为什么这会被否决,因为如果你按照他的建议使用OpenGL,在透明对象后面绘制的所有内容都会完全遮挡透明对象,这显然不是故意的。这就是问题所在——最后绘制透明对象,启用深度测试,但禁用深度写入。这样,透明的物体仍然被它前面的不透明物体遮挡着。你最后,从后到前画出透明的物体。我想他已经知道了,因为他提到了相反的顺序,并且询问了z缓冲。