4

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

我在搜索中阅读了很多关于它们的相互矛盾的东西来解决我的错误,如果这不是我应该寻求的解决方案,我不想投入大量时间来让它一切正常第一名。与仅使用三角形相比,人们会发布各种问题,例如剪裁,甚至性能下降。我希望有经验的用户能够深入了解点精灵适合的位置以及应该使用它们的时间,包括在像我这样的情况下,它们最多不会在屏幕上超过几十个“粒子”。

4

2 回答 2

4

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

于 2011-09-08T08:47:35.160 回答
0

推荐你阅读《iPhone 3D Programming》的粒子文章。

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

于 2011-09-08T00:59:35.580 回答