半透明物体渲染顺序

时间:2017-10-04 20:10:38

标签: opengl graphics 3d

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

来自opengl docs: 在应用程序中使用深度缓冲时,需要注意渲染基元的顺序。需要首先渲染完全不透明的图元,然后按照从前到后的顺序渲染部分不透明的图元。如果你不按这个顺序渲染图元,原始图形(否则通过部分不透明的图元可见)可能会完全失去深度测试。

因此,每当我在渲染不透明三角形后渲染半透明物体时,如果我相对于"视图方向"从后到前渲染半透明三角形,这是正确的吗?回到前面究竟是什么意思?我试图理解,如果我有一个通过mvp转换的场景对象,我是否需要专门查看世界坐标​​中的顺序,以及相机中心的顺序?

另外,这会根据混合类型而改变吗?

2 个答案:

答案 0 :(得分:2)

每当渲染半透明三角形时,都必须从前到后绘制它们。这里的前后方式意味着,您必须首先绘制远离屏幕的三角形(具有更高的深度值)。

这是必要的原因是大多数混合方程根据顺序产生不同的结果。在OpenGL中实现的方程通常是这样的,它们可以提供正确的#34;从后向前渲染时的结果。

答案 1 :(得分:0)

我认为订单的重要性不仅仅在于您的混合功能 正在使用,但必须记住管道的一个重要方面。 z测试在混合操作之前发生在管道中的线下。 考虑我们绘制两个三角形t1和t2 t1回到t2的情况。

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

因此,如果您没有保持顺序,则禁用z测试,然后使用适当的混合功能绘制对象。这在性能上并不是很好,因为很多z测试都会失败。

所以你维持秩序或多边形,但这个解决方案也不会随着多边形数量的增加以及不透明和透明物体的混合而缩放。

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

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

Order Independent Transparency