我正在尝试使用OpenGL ES 2.0为Android应用程序创建一个非常简单的粒子系统。基本上它只适用于背景中的线性移动云。在开始之前我的第一个想法是使用点精灵,这就是我一直在尝试做的事情。对我来说,让这项工作变得非常困难,但除了这些问题之外,点精灵真的是这样做的吗?
我在搜索中已经阅读了很多相互矛盾的事情来解决我的错误,我不想投入大量的时间让它完全正常工作,如果它不是我应该的解决方案首先要去的。与仅仅使用三角形相比,人们发布各种各样的麻烦,例如剪裁,甚至性能下降。我希望有经验的用户能够深入了解点精灵适合的位置以及何时应该使用它们,包括在像我这样的情况下,它们最多只能在屏幕上显示几十个“粒子”。
答案 0 :(得分:4)
请记住,点精灵有较大的尺寸限制,尺寸越大,性能越低。如果你的目标是只有12个“粒子”,我认为你应该将它们渲染成四边形。另一方面,如果你的目标是让12个云由许多“云粒子”组成,每个云都给它们一个动画效果,那么你应该选择点精灵。
瓶颈将是填充率,特别是因为你可能会使用混合。
如果你有100多个云,那么是否使用点精灵的问题变得更加相关。要为它们设置动画,您必须发送新缓冲区以打开每个帧(方法1),或者使用不同的转换矩阵(方法2)在单独的调用中呈现每个云。后者最有可能是最慢的,但前者需要你为每个云发送4个新顶点(假设是索引渲染),而如果使用点精灵(方法3),每个云只需要1个新顶点。
此时,粗略计算最快的内容非常容易。方法2表示每帧传输到gpu的16*4*num_clouds
字节数据,方法1为d*4*num_clouds
,而方法3为d*num_clouds
,其中d为2或3,具体取决于您是否需要z。< / p>
值得注意的是,方法1和3一次发送数据,而方法2一次发送16 * 4个字节。
由于您使用的是GL ES 2,您可以跳过方法2中的矩阵,只是将转换作为向量发送,但您仍然会遭受非批量数据传输以及为每个实例设置统一的成本。
编辑: 实际上,在许多粒子的情况下你要做的是设置一个统一的时间,并将云的速度作为静态属性,然后通过将速度乘以时间在着色器中为它们设置动画,并确保它们必要时缠绕边缘。因此,对于完全动画的云场景,您只需要为每帧传输4个字节。
答案 1 :(得分:0)
我建议你阅读“iPhone 3D Programming”的粒子文章。
本书的标题包括“iPhone”,但本书一般解释了OpenGL ES 1.1 / 2.0。因此,您可以将本书中的知识用于Android或Android NDK。