粒子模拟中GL_POINTS相互遮挡问题

4
我有一个火焰模拟,其中包含大量纹理化的GL_POINTS。每个粒子都有一个透明的背景,当从某些角度面对火焰时,混合正常工作。然而,从其他角度观察时,应该是透明的背景会遮挡在其后渲染的粒子。如下图所示。
请看下面的图片。
如您所见,似乎有很多黑色的盒子挡住了粒子。我该如何避免这种情况?我使用的混合函数是GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA。将glBlendFunc的第二个参数设置为GL_ONE会得到非常相似的结果。

2
类似于https://dev59.com/eWAg5IYBdhLWcg3wtMzD。由于这是关于粒子系统而不仅仅是使用透明纹理的一般渲染,因此可能会有不同的考虑因素。所以我不确定它是否应该是重复的。 - Reto Koradi
禁用深度缓冲区 - BeyelerStudios
4
你可能需要对这些粒子进行排序,并按照正确的顺序进行渲染,即从后往前。 - Gigo
对于发光粒子,请尝试使用加法混合。要实现“好看”的粒子效果,有几个技巧需要掌握。我猜你想要一个火焰效果:请查看这里 - BeyelerStudios
Reto Koradi是正确的,大多数这些方法也可以用于粒子系统。该线程中未提到的另一种方法是预乘alpha,如此处所述:http://blogs.msdn.com/b/shawnhar/archive/2009/11/06/premultiplied-alpha.aspx - StarShine
显示剩余3条评论
1个回答

0

http://www.opengl-tutorial.org/intermediate-tutorials/billboards-particles/particles-instancing/#The_main_simulation_loop

在那里,你可以找到完全相同的问题及其解决方案。正如Gigo所建议的那样,你确实需要对粒子进行排序。原因是只有当颜色从后往前混合时,alpha混合才看起来正确。

然而,如果你真的想避免排序,也可以。有一些更有效的三维透明度算法。请参见:http://www.opengl-tutorial.org/intermediate-tutorials/tutorial-10-transparency/#Order_Independent_Transparency


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接