一些建议
您可以通过使用四边形而不是点来获得更大的显示灵活性。您基本上为每个粒子输入顶点数据,例如
//localX, localY, data for particle, data for particle, ...
-1, -1, gravityForParticle0, velocityForParticle0, etc..,
1, -1, gravityForParticle0, velocityForParticle0, etc..,
-1, 1, gravityForParticle0, velocityForParticle0, etc..,
1, 1, gravityForParticle0, velocityForParticle0, etc..,
-1, -1, gravityForParticle1, velocityForParticle1, etc..,
1, -1, gravityForParticle1, velocityForParticle1, etc..,
-1, 1, gravityForParticle1, velocityForParticle1, etc..,
1, 1, gravityForParticle1, velocityForParticle1, etc..,
-1, -1, gravityForParticle2, velocityForParticle2, etc..,
1, -1, gravityForParticle2, velocityForParticle2, etc..,
因此,对于每个四边形的每个顶点,每个粒子的数据都是相同的。换句话说,你有
unit vertex #0, particle0 data
unit vertex #1, particle0 data
unit vertex #2, particle0 data
unit vertex #3, particle0 data
unit vertex #0, particle1 data
unit vertex #1, particle1 data
unit vertex #2, particle1 data
unit vertex #3, particle1 data
unit vertex #0, particle2 data
unit vertex #1, particle2 data
unit vertex #2, particle2 data
unit vertex #3, particle2 data
现在您可以在着色器中旋转、缩放和定向四边形,并根据需要偏移它,这是 POINTS 无法做到的。
此外,如果您的粒子系统是确定性的(因为任何粒子的位置仅基于时间),那么您可以将所有变量放入属性和制服中,然后将时间作为制服传递。
你可以看到an example of this kind of system here。这些粒子完全在 GPU 上运行。唯一传入的是用于投影的时间和矩阵。它们处理 3D 中的粒子定向、随时间改变颜色、随时间旋转、随时间变化的速度和加速度位置,甚至随时间变化的纹理动画(参见示例中的数字)
在这些技术之上,如果您的粒子系统不是确定性的,这意味着您的状态每帧都会发生变化,您可以通过将纹理附加到帧缓冲区对象来将状态写入纹理。如果您的机器支持浮点纹理,那么您可以写入 RGBA/FLOAT 并在后续绘制调用中将该纹理作为顶点或片段着色器的输入读取。
There's an example here。您甚至可以查看用于计算的纹理。