我正在尝试使用OpenGL ES 2.0为Android应用程序创建一个非常简单的粒子系统.基本上,它仅用于背景中的线性移动云.开始此操作之前,我的第一个想法是使用点精灵,这就是我一直在尝试的方法.我很难做到这一点,但是除了那些问题之外,指向精灵真的是解决这个问题的方法吗?
在解决错误时,我已经阅读了很多关于它们的矛盾文章,如果这不是我应该寻求的解决方案,我不想花费大量时间使它们一切正常第一名.与使用三角形相比,人们会遇到各种麻烦,例如裁剪,甚至性能下降.我想让经验丰富的用户洞悉点子精灵的适合位置和使用时间,包括像我这样的情况,在这些情况下,它们最多在屏幕上不会出现几十个“粒子”.
解决方法:
请记住,点精灵有严格的大小限制,大小越大,性能越慢.如果您的目标是只有12个“粒子”,我认为您应该将它们渲染为四边形.另一方面,如果您的目标是要有12个由许多云组成的云,每个云都会赋予它们动画效果,那么是的,您应该使用点精灵.
瓶颈将是填充率,尤其是因为您可能会使用混合.
如果您有100个云,则是否使用点精灵的问题变得更加重要.要为它们设置动画,您必须发送一个新的缓冲区以对每个帧进行opengl(方法1),或者在单独的调用中使用不同的转换矩阵渲染每个云(方法2).后者很可能是最慢的,但是前者要求您每个云发送4个新顶点(假定索引渲染),而如果使用点精灵,则每个云仅发送1个新顶点(方法3).
在这一点上,很容易大致计算出最快的速度.方法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个字节.