Opengl 半透明对象渲染顺序

Opengl 半透明对象渲染顺序,opengl,graphics,3d,Opengl,Graphics,3d,渲染半透明对象(使用glBlend)时,建议从后到前z顺序对对象进行排序 发件人: 在应用程序中使用深度缓冲时,需要注意渲染基本体的顺序。需要先渲染完全不透明的基本体,然后按从后到前的顺序渲染部分不透明的基本体。如果不按此顺序渲染基本体,则通过部分不透明的基本体可以看到的基本体可能会完全丢失深度测试 因此,每当我在渲染不透明三角形后渲染半透明对象时,如果我相对于“视图方向”从后向前渲染半透明三角形,是否正确?从后到前到底意味着什么?我试图理解,如果我有一个场景对象经过mvp变换,我是否需要特别关

渲染半透明对象(使用glBlend)时,建议从后到前z顺序对对象进行排序

发件人: 在应用程序中使用深度缓冲时,需要注意渲染基本体的顺序。需要先渲染完全不透明的基本体,然后按从后到前的顺序渲染部分不透明的基本体。如果不按此顺序渲染基本体,则通过部分不透明的基本体可以看到的基本体可能会完全丢失深度测试

因此,每当我在渲染不透明三角形后渲染半透明对象时,如果我相对于“视图方向”从后向前渲染半透明三角形,是否正确?从后到前到底意味着什么?我试图理解,如果我有一个场景对象经过mvp变换,我是否需要特别关注世界坐标中的顺序,以及与摄影机中心的关系


此外,这是否会因混合类型的不同而发生变化?

每当渲染半透明三角形时,都必须将其向后绘制。这里从后到前意味着,您必须首先绘制远离屏幕的三角形(深度值较高)


之所以有必要这样做,是因为大多数混合方程会根据顺序产生不同的结果。OpenGL中实现的公式通常在从前到后渲染时给出“正确”的结果。

我认为顺序很重要,不仅仅是因为您使用了混合函数 您只需要记住管道的一个重要方面。z测试发生在管道中的混合操作之前。 考虑我们画两个三角形T1和T2 T1是T2的后面的情形。

所以,若z测试拒绝所有属于t1的片段,那个么t1的颜色值就不会写入颜色缓冲区。现在在后面的t2片段被绘制出来,正好在t1前面,z测试在最后一步中拒绝了t1。因此,理想情况下,t1的颜色会与t2的颜色混合,但由于t1的z测试失败,且混合操作在z测试之后,t2颜色不会混合

因此,若你们并没有保持秩序,那个么禁用z测试,然后用适当的混合功能绘制你们的对象。这在性能上不是很好,因为很多z测试都会失败

因此,您可以保持多边形的顺序,但此解决方案也不会随着多边形数量的增加以及不透明和透明对象的混合而缩放

因此,提出了一种新的解决方案,即使用阶独立的透射率。 有不同的方法来实现这一点,您不必担心对象的顺序

我已经在片段着色器中使用每像素链表实现了解决方案。你可以找到下面的链接。这不是最好的解决方案,但应该给你一个公平的想法


请您更深入地了解屏幕从后到前的含义是什么?具体来说,在摄像机中心和世界坐标方面。大多数解释中都缺少一些细节。定义是:从较高的深度值到较低的深度值。在世界坐标中,这意味着您必须首先绘制远离摄影机中心的对象。@dev_nut这意味着您需要首先在摄影机空间(而不是世界空间)中渲染最远的面。对于相交(半透明)的多边形,这不是一项容易的任务。@Spektre如果多边形相交,则需要在相交处对其进行细分。我想如果几何体是静态的,这不是问题,因为可以在渲染之前进行细分,但是如果是动态网格,那么这将需要一些非常好的多边形处理逻辑。@dev_nut yep确实有一些解决方法,但是请参见我在您的问题下方的评论中链接的QA中的答案。另外,如果您知道只有几层透明度,您可以在运行时记住几层渲染的深度层(深度排序片段而不是多边形),并在最后合并(但这在GPU上很难实现)。我认为英伟达的一个答案是你最好的选择,如果你不想去的话,这可能会让你感兴趣。