2017-10-04 158 views
2

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

From opengl docs: 在应用程序中使用深度缓冲时,需要注意渲染基元的顺序。需要首先渲染完全不透明的图元,然后按照从后到前的顺序渲染部分不透明的图元。如果你不按照这个顺序渲染原始图元,原本可能通过部分不透明原始图元可见的图元可能会完全失去深度测试。因此,无论何时在渲染不透明三角形后呈现半透明物体,如果我从“视图方向”相对于背面渲染半透明三角形,这是正确的吗?回到前面的意思是什么意思?我试图理解,如果我有一个通过mvp转换的场景对象,是否需要专门查看世界坐标​​中的顺序以及相机中心的顺序?

此外,此更改取决于混合类型?

+0

这个[OpenGL的 - 如何创建顺序无关的透明度(https://stackoverflow.com/a/37783085/2521214)可能你感兴趣。 – Spektre

回答

2

无论何时渲染半透明三角形,都必须将它们背对背绘制。这里的回到前面意味着,你必须首先绘制更远离屏幕的三角形(具有更高的深度值)。

这是必要的原因是大多数混合方程根据顺序产生不同的结果。在OpenGL中实现的方程通常是这样的,以便在反向渲染时提供“正确”的结果。

+0

您能否更深入地深入了解与屏幕相关的背后意味着什么?具体来说,就相机中心和世界坐标而言。在那里的大多数解释中都缺少一些细节。 –

+1

定义如下:从较高深度值到较低深度值。在世界坐标系中,这意味着您必须首先绘制远离相机中心的物体。 – BDL

+1

@dev_nut这意味着你需要在摄像头空间中(而不是在世界空间)渲染最远的脸。使用相交(半)透明多边形不是一件容易的事。 – Spektre

0

我认为订单不仅因为你使用的混合功能,而且还有一个重要的方面,你必须牢记。 z测试在混合操作在流水线中进行之前发生。 考虑一下我们绘制两个三角形t1和t2的场景,t1是t2的后面。

所以,如果z测试拒绝属于t1的所有片段,所以t1的颜色值不会写入颜色缓冲区。现在后面的t2片段正在被绘制,这正好在t1的前面,z测试在最后一步被拒绝。因此,理想情况下,t1的颜色将与t2的颜色混合,但由于t1的z测试失败,并且在z测试后的混合操作不会混合t2颜色。

因此,如果你不保持顺序,那么禁用z测试,然后用适当的混合函数绘制你的对象。这在性能上并不好,因为很多z测试都会失败。

因此,您维护顺序或多边形,但此解决方案也不随着多边形数量的增加以及不透明和透明物体的混合而缩放。

因此,提出了使用与顺序无关的透明度的新解决方案。 有不同的方式来实现这一点,你不必担心对象的顺序。

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

Order Independent Transparency