繁体   English   中英

生成GPU粒子

[英]Spawning GPU Particles

我正在开发第一个游戏引擎,并尝试实现GPU粒子系统。 我以前在CPU上实现过一个,但是现在我试图使其效率更高。 我的问题特别是在生命周期内产生粒子。

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

我曾经有一个想法是在需要创建粒子时使用布尔值或整数,以表示需要创建粒子或要生成的粒子数量,两者均由CPU初始化。 因此,如果我发现一个寿命(即第一个fbo纹理的alpha值)小于零的粒子(像素),并且我知道我应该创建它,那么如何在其余的时间里禁用创建颗粒,或减少要破裂的颗粒数量? 我听说过诸如变换反馈之类的事情,但是我不知道这是否是最好的方法。 无状态粒子的声音受到限制-并非所有粒子都具有1:1的产卵率。

简短地重复这个问题:产生GPU粒子的最佳方法是什么?

顺便说一句,如果我能在CPU上设置粒子数量,那么我可以设置要在glDrawArraysInstanced中绘制的数量,因此,如果您可以将其包括在答案中,我将不胜感激。

我去...

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

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

对于更新粒子状态,是的,您需要变换反馈。 您将拥有一个“顶点着色器”,它可以根据旧粒子为每个粒子计算新值,并将其写入另一个VBO。 有关详细信息和示例代码,请参见OpenGL SuperBible。 我只是在两个VBO之间进行乒乓操作,一个用于旧值,一个用于新值,但是您可能还决定使用纹理缓冲区对象,它们是可以在着色器中写入的大型数组(比统一数组大得多)。 每次更新的粒子数量由CPU活动计数器控制。

希望这可以帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM