gpt4 book ai didi

c++ - 生成 GPU 粒子

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:46:01 28 4
gpt4 key购买 nike

我正在开发我的第一个游戏引擎,并尝试实现 GPU 粒子系统。我以前在 CPU 上实现过一个,但现在我正在努力提高它的效率。具体来说,我的问题是在一生中产生粒子。

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

我的一个想法是在需要创建粒子时使用 bool 值或整数,表示创建粒子的需要或要产生的粒子数量,两者均由 CPU 初始化。因此,如果我发现一个粒子(像素)的生命周期(假设第一个 fbo 纹理的 alpha 值)小于零,并且我知道我应该创建它,我该如何禁用其余部分的创建粒子,或减少要爆裂的粒子数?我听说过转换反馈之类的东西,但我不知道那是否是最好的方法。无状态粒子声音限制 - 并非所有粒子都具有 1:1 的生成率。

简单地重复一下这个问题:生成 GPU 粒子的最佳方式是什么?

如果我能知道 CPU 上的粒子数量,顺便说一下,我可以在 glDrawArraysInstanced 中设置要绘制的数量,所以如果您能在您的答案中包含它,我将不胜感激。

最佳答案

我会去...

CPU 应该知道最大粒子数是多少(这将是池大小)和当前“事件”粒子数。第一个数字用于初始化或调整粒子状态 VBO 的大小,不应经常更改。如果您愿意,第二个可以逐帧更改。

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

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

希望这对您有所帮助。

关于c++ - 生成 GPU 粒子,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38285650/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com