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



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

在我寻找解决bug的过程中,我读到了很多关于它们的相互矛盾的东西,如果它不是我首先应该去寻找的解决方案,我不想投入大量的时间去使它正常工作。人们发布了各种各样的问题,比如剪切,甚至性能下降与使用三角形相比。我希望有经验的用户能够洞察点精灵的位置和使用时间,包括在像我这样的情况下,它们在屏幕上最多不会超过几十个"粒子"。

请记住,点精灵存在硬尺寸限制,尺寸越大,性能越慢。如果你的目标是只有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字节。

推荐大家阅读《iPhone 3D Programming》的粒子文章

  • iPhone 3D编程-渲染五彩纸屑,烟花,和更多:点精灵

这本书的标题包括"iPhone",但这本书一般解释了OpenGL ES 1.1/2.0。因此,您可以将本书中的知识用于Android或Android NDK。

最新更新