OpenGL ES 2.0——简单粒子系统的最佳途径

Sha*_*ock 4 android opengl-es point sprite particles

我正在尝试使用 OpenGL ES 2.0 为 Android 应用程序创建一个非常简单的粒子系统。基本上它仅适用于背景中线性移动的云。在开始之前,我的第一个想法是使用点精灵,这就是我一直在尝试做的事情。对我来说,要实现这一点相当困难,但抛开这些问题不谈,点精灵真的是实现这一点的方法吗?

我在搜索中读到了很多关于它们的相互矛盾的内容来解决我的错误,如果这不是我应该寻求的解决方案,我不想投入大量时间来使其一切正常工作第一名。人们提出了使用它们的各种问题,例如裁剪,甚至与仅使用三角形相比性能下降。我希望有经验的用户能够深入了解点精灵适合的位置以及何时使用它们,包括在像我这样的情况下,它们在屏幕上最多不会超过几十个“粒子”。

Emi*_*nus 5

请记住,点精灵有严格的大小限制,大小越大,性能越慢。如果您的目标是只有 12 个“粒子”,我认为您应该将它们渲染为四边形。另一方面,如果您的目标是拥有 12 个由许多“云粒子”组成的云,每个云都赋予它们动画效果,那么您应该使用点精灵。

瓶颈将是填充率,特别是因为您可能会使用混合。

如果您有 100 多个云,是否使用点精灵的问题就变得更加相关。要为它们设置动画,您必须每帧向 opengl 发送一个新缓冲区(方法 1),或者使用不同的变换矩阵在单独的调用中渲染每个云(方法 2)。后者很可能是最慢的,但前者要求您为每个云发送 4 个新顶点(假设索引渲染),而如果您使用点精灵(方法 3),则每个云只需发送 1 个新顶点。

此时,很容易粗略地计算出最快的速度。方法 2 表示16*4*num_clouds每帧传输到 GPU 的数据字节,方法 1 是d*4*num_clouds,而方法 3 d*num_clouds,其中 d 是 2 或 3,具体取决于是否需要 z。

另外值得注意的是,方法1和3是批量发送数据,而方法2是一次发送16*4字节。

由于您使用的是 GL ES 2,您可以跳过方法 2 中的矩阵,只将翻译作为向量发送,但您仍然会遭受非批量数据传输以及为每个实例设置统一的成本。

编辑:实际上,在有许多粒子的情况下,您要做的就是设置一个统一的时间,并将云的速度作为静态属性,然后通过将速度乘以时间来在着色器中对它们进行动画处理,然后使如有必要,请确保它们环绕边缘。因此,对于完全动画的云场景,每帧只需传输 4 个字节。