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

Android OpenGL ES 2.0——简单粒子系统的最佳路径,android,opengl-es,sprite,point,particles,Android,Opengl Es,Sprite,Point,Particles,我正在尝试使用OpenGL ES 2.0为Android应用程序创建一个非常简单的粒子系统。基本上,它只适用于背景中线性移动的云。在开始这项工作之前,我的第一个想法是使用点精灵,这就是我一直在尝试的。这对我来说很难让它工作,但是撇开这些问题不谈,点精灵真的是解决这个问题的方法吗 在我的搜索中,我读到了很多关于它们的相互矛盾的东西来解决我的bug,如果这不是我首先应该寻求的解决方案,我不想投入大量的时间来让它们正常工作。人们贴出了各种各样的问题,比如剪辑,甚至与仅仅使用三角形相比性能下降。我希望有

我正在尝试使用OpenGL ES 2.0为Android应用程序创建一个非常简单的粒子系统。基本上,它只适用于背景中线性移动的云。在开始这项工作之前,我的第一个想法是使用点精灵,这就是我一直在尝试的。这对我来说很难让它工作,但是撇开这些问题不谈,点精灵真的是解决这个问题的方法吗


在我的搜索中,我读到了很多关于它们的相互矛盾的东西来解决我的bug,如果这不是我首先应该寻求的解决方案,我不想投入大量的时间来让它们正常工作。人们贴出了各种各样的问题,比如剪辑,甚至与仅仅使用三角形相比性能下降。我希望有经验的用户能够深入了解点精灵的位置和使用时间,包括在我这样的情况下,它们在屏幕上最多只能显示几十个“粒子”。

我建议您阅读“iPhone 3D编程”中的粒子文章


本书的标题包括“iPhone”,但本书对OpenGL ES 1.1/2.0进行了总体介绍。因此,您可以将本书中的知识用于Android或Android NDK。

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

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

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

在这一点上,很容易粗略地计算出什么是最快的。方法2意味着每个帧传输到gpu的数据字节数
16*4*num_clouds
,方法1是
d*4*num_clouds
,而方法3是
d*num_clouds
,其中d是2还是3取决于您是否需要z

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

由于您使用的是GL ES 2,您可以跳过方法2中的矩阵,只将转换作为向量发送,但您仍将承受非批处理数据传输和设置每个实例的统一成本

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

对于我来说,点精灵似乎仍然是一条路要走,所以我想我会继续努力,让它们工作。非常感谢你提供的有用信息。然而,我对他们还有一个担忧。我读到一些设备根本不显示它们,我想知道这是否是旧的Android手机(使用OpenGL ES 1.1)的问题,而不是像我的应用程序将要运行的那些更现代的手机的问题?感谢Kazuki链接,因为我正在学习OpenGL ES 2.0,这看起来对我来说是一本不错的读物。:)