2011-09-08 44 views
3

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

在我的搜索中,我已经阅读了很多相互矛盾的内容来解决我的错误,并且我不想投入大量时间使它在一切正常的情况下运行,如果这不是我应该的解决方案首先要去做。人们会发布诸如裁剪之类的各种麻烦,甚至与使用三角形相比,性能下降。我希望有经验的用户能够洞察点精灵适合什么位置以及何时应该使用它们,包括像我的情况,他们最多只能在屏幕上显示几十个“粒子”。

回答

4

请记住,点精灵有硬尺寸限制,而且尺寸越大,性能越慢。如果你的目标是只有12个“粒子”,我认为你应该把它们作为四边形。另一方面,如果你的目标是让12个云由许多许多“云粒子”组成,每个云粒子都会给它们带来生气蓬勃的效果,那么是的,你应该选择点精灵。

瓶颈将是填充率,尤其是因为您可能会使用混合。

如果你有100多个云,是否使用点精灵的问题变得更相关。要为它们设置动画,您必须发送一个新的缓冲区来打开每个帧(方法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个字节即可完成动画云场景。

+0

好像点精灵仍然是我的方式,所以我想我会战士,并试图让他们工作。非常感谢那些有用的信息。然而,我还有一个与他们有关的问题。我读过某些设备根本不显示它们,我想知道这是旧版Android手机的问题(使用OpenGL ES 1.1时),而不是像我的应用将运行的更新式的手机。 – Shamrock