粒子系统中顺序独立的透明度


9

我正在编写一个粒子系统,并且想找到一种技巧来实现正确的alpha混合而不对粒子进行排序,因为:

  • 每个粒子都是单个网格中的点精灵,我无法使用场景图功能对透明节点进行排序。但是,系统节点应正确排序。
  • 根据初始速度,加速度和时间在着色器上计算粒子位置。为了对系统进行排序,我必须在CPU上执行所有这些计算,这是我要避免的事情。
  • 根据相机位置对数百个粒子进行排序,并将每个帧的接缝上传到GPU上,以减轻操作负担。

Alpha测试似乎在GLES 2.0上足够快,并且对于非透明但“蒙版”的纹理效果很好。但是,对于半透明的粒子来说还不够。

您将如何处理?


对它们进行正确分类绝对有多重要?您实际上已经使用香草混合看到任何(重要的)人工痕迹了吗?
克里斯(ChrisE)2011年

一个粒子可以与背景混合,而不是与另一个粒子混合,然后点精灵的“矩形”本质非常明显。Alpha测试在这里有帮助,但是当Alpha值降低到很低但不足以丢弃片段时,伪影仍然很明显。
Stepan Zastupov 2011年

6
渲染粒子时,您是否尝试过禁用深度写入(启用深度测试)?那应该使不正确的排序不那么明显。
亚当

2
经过一些实验,我发现在大多数情况下禁用深度写入是最好的解决方案。
Stepan Zastupov 2011年

Answers:


10

这就是我要做的。

第1步:不要排序。去做就对了。看看是否有问题。很有可能不是。

步骤2:将粒子限制为真正不需要排序的粒子,例如:

  • 只是实体(可能具有覆盖范围的Alpha边)

    • 让zbuffer负责排序。
  • 只是加性位

    • a + b = b + a,所以顺序无关紧要

第3步:如果需要更多渲染,请将粒子渲染分为必须在前面和其余部分的位,然后分几次执行渲染(例如,可以修复复杂的烟雾)

第4步:如果仍然需要更多解决方案,或者您需要一个通用解决方案,那么想到的一件事情就是使用MRT来完成非常粗糙的N桶分类;将粒子渲染到N个输出曲面中,并在单独的通道中进行合成。

任何进一步的操作都需要有关您的特定用例的更多信息。但是我敢肯定,您毕竟根本不需要顺序独立。只要随机使用足够的粒子就可以了=)


6

只是在渲染粒子时不要写入深度缓冲区。这将允许它们全部渲染并相互融合。但是,您仍然应该执行深度测试,以使它们可以被场景中的几何图形正确地遮挡。


5

使用加法混合顺序无关紧要:

glEnable(GL_BLEND)
glDepthMask(GL_FALSE)
glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA)
DrawParticles();

// Now turn depth masking on and blending off, so state is unchanged.
glDepthMask(GL_TRUE)
glDisable(GL_BLEND)

这假定您的精灵纹理具有透明背景。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.