我正在尝试为使用 OpenGL ES 2.0 的 Android 应用程序创建一个非常简单的粒子系统。基本上它仅适用于背景中的线性移动云。在开始之前我的第一个想法是使用点 Sprite ,这就是我一直在尝试做的事情。我很难做到这一点,但撇开这些问题不谈,点 Sprite 真的是解决这个问题的方法吗?
在我为解决错误而进行的搜索中,我已经阅读了很多关于它们的相互矛盾的内容,如果这不是我应该的解决方案,我不想投入大量时间来使它一切正常首先去争取。与仅使用三角形相比,人们发布了各种各样的问题,例如裁剪,甚至性能下降。我希望有经验的用户了解点 Sprite 适合的位置以及何时应该使用它们,包括在像我这样的情况下,它们在屏幕上最多不会超过几十个“粒子”。
最佳答案
请记住,点 Sprite 有硬性尺寸限制,尺寸越大,性能越慢。如果您的目标是只有 12 个“粒子”,我认为您应该将它们渲染为四边形。另一方面,如果您的目标是让 12 朵云由很多很多“云粒子”组成,每个云都给它们一个动画效果,那么是的,您应该使用点 Sprite 。
瓶颈将是填充率,特别是因为您可能会使用混合。
如果你有 100 多朵云,是否使用点 Sprite 的问题就变得更重要了。要为它们设置动画,您要么必须在每个帧中向 opengl 发送一个新缓冲区(方法 1),要么在使用不同变换矩阵的单独调用中渲染每个云(方法 2)。后者很可能是最慢的,但前者要求您为每个云发送 4 个新顶点(假设索引渲染),而如果您使用点 Sprite (方法 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 个字节。
关于android - OpenGL ES 2.0——简单粒子系统的最佳途径,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7342033/