OpenGL精灵和点大小限制

我正在开发一个应该能够在移动设备(iOS,Andorid)上执行的简单粒子系统。 我的计划是使用GL_POINT_SPRITE / GL_PROGRAM_POINT_SIZE方法,因为它的效率(GL_POINTS足够了),但经过一些实验后,我发现自己陷入了麻烦。 精灵大小是有限的(通常为64像素)。 我正在使用这个公式来计算大小

gl_PointSize = in_point_size * some_factor / distance_to_camera 

使粒径与相机的距离成比例。 但在某些时候,当相机足够接近时,会出现尺寸限制的问题,整个系统开始显得不切实际。 有没有办法避免这个问题?

如果不是,有什么select? 我正在考虑为每个粒子手动生成广告牌。 现在,我对这种方法有一些疑问。

我猜最小几何数据将是每个粒子和索引数组的四个顶点,从这些顶点创建四边形(使用GL_TRIANGLE_STRIP)。 另外,对于每个顶点,我需要一个颜色和纹理坐标。 我会把所有的东西放在交错的顶点数组中。 但是,正如你所看到的,有很多的冗余。 相同粒子的所有顶点共享相同的颜色值,四个纹理坐标对于所有粒子都是相同的。 由于如何glDrawArrays /元素的作品,我看不出优化这一点。 你知道如何组织每粒子数据更好的方法吗?

我应该使用缓冲区还是顶点数组,或者因为每次必须更新所有粒子的数据,所以没有区别。

关于粒子模拟…在哪里做? 在CPU上还是在顶点处理器上? 有些东西告诉我,移动的CPU会比顶点单元更快(至less在今天是2012年)。

所以,对于如何制造一个简单而有效的颗粒系统,如果没有颗粒尺寸的限制,对于移动设备,我们将不胜感激。

(通过粒子的相机的animation应该是现实的)

实例化在ES2中是不可用的,但最终会提供最好的方法。

在没有实例的情况下,还有其他一些方法可以优化数据。 你知道,索引数组数据即使顶点数组数据不会改变,所以索引数组可以成为一个静态数组。 这同样适用于纹理坐标系(假设你没有粒子纹理图集),所以它们也可以被转换成一个静态的VBO,当然这需要是非交错的。 这有效地使位置和颜色成为唯一需要更新的dynamic每顶点数据,颜色是唯一重复的属性(如果你使用4个无符号字节的颜色,那么重复不是那么繁琐)。

没有一个是完美的,你已经正确地确定了不确定的原因。 然而,在你把事情分开之前,它会支付基准,看看是否使用重复数据实际上是一个问题。 这可以在本能面前飞翔,但通常情况下,拉动技巧来减less内存使用最终会导致性能的整体负面影响。 接受额外的内存使用并接受一些重复的数据 – 即使它看起来本能地是“错误的” – 通常可能是最优化的方法。

是的,我会说去与一个四角三角形剥离四。

如果您使用相同的颜色绘制大量这些三角形条纹,并使用同一组纹理坐标 ,则可以执行以下两项操作之一:

1)发送每个对象的4个顶点,并存储颜色和texcoords的制服

2) “硬件实例”