产生GPU粒子

时间:2016-07-09 19:38:25

标签: c++ opengl glsl framebuffer particle-system

我正在研究我的第一个游戏引擎,并试图实现GPU粒子系统。我以前在CPU上实现了一个,但现在我试图提高它的效率。我的问题,特别是在一生中产生粒子。

由于我正在为粒子引擎使用帧缓冲纹理,它非常平行,但代价是无法返回CPU,对吧?我有第一个绘​​制四边形来处理特定粒子系统的计算(为了排序可能必须有第二个四边形),然后我运行一个glDrawArraysInstanced

我有一个想法是在需要创建粒子时使用布尔值或int,表示需要创建粒子或者要生成的粒子数量,这两者都是由CPU初始化的。因此,如果我发现一个粒子(像素)的生命周期(让我们说第一个fbo纹理的alpha值)小于零,我知道我应该创建它,如何禁用其余粒子的创建,或减少要爆发的粒子数量?我听说过改变反馈等事情,但我不知道这是否是最佳方式。无状态粒子声音限制 - 并非所有粒子都具有1:1的产卵率。

简要回答一下这个问题:产生GPU粒子的最佳方法是什么?

顺便说一句,如果我可以拥有CPU上的粒子数量,我可以设置绘制glDrawArraysInstanced的数量,所以如果你能在答案中包含这些,我将不胜感激。

1 个答案:

答案 0 :(得分:0)

我会去......

CPU应该知道粒子的最大数量(池大小)和当前“粒子”的数量。第一个数字用于初始化或调整粒子状态VBO的大小,并且不应经常更改。如果你愿意,第二个可以逐帧改变。

单个粒子寿命应存储为VBO值的一部分。假设您使用计数器或时间值来确定位置,颜色等,当此计数器达到最大值时,您“杀死”粒子并重新分配。通过改变初始计数器值,粒子不必全部以相同的方式启动和更新。

要更新粒子状态,是的,您需要转换反馈。你将有一个'顶点着色器',它从旧的每个粒子计算新值,并将这些值写入另一个VBO。有关详细信息和示例代码,请参阅OpenGL SuperBible。我只是在两个VBO之间打乒乓,一个用于旧值,一个用于新值,但是您也可能决定使用纹理缓冲对象,这些对象是可以在着色器中写入的大型数组(比均匀大)。每次更新的粒子数由CPU实时计数器控制。

希望这有帮助。