粒子系统应该在几何着色器中完全更新,还是应该向几何着色器传递位置和生命等的更新数据。目前我更新几何中的所有内容,但我不确定这是否是最好的主意,以防 C++ 中需要一些数据。
2 回答
着色器中的几乎所有东西都是可能的(特别是如果你要使用 SM4+ 的话)。如果您想要任何形式的市场渗透,我不建议您购买任何超过 SM3 的东西。我仍然很遗憾我们没有为我们最新的游戏提供 SM2 后备,因为相当多的人仍然使用旧的蹩脚的 SM2 卡。
更多关于这个问题。您可以使用 RTT 并且永远不要往返于主内存(这非常慢,尽量减少从图形内存到主内存的传输),但不利的一面是您需要使用一些相当复杂的技巧来计算 AABB (你会想要在 CPU 方面)如果你去纯 GPU。
相反,我们做所有需要在 CPU 端改变粒子状态的事情。然后,我们对更新到 GPU 的数据进行了严格的内存表示。顶点着色器相当丰富(但这完全没问题,在顶点着色器中尽你所能!),它提取粒子的这种压缩表示,对其进行转换,并将未压缩的数据传递给像素着色器。这里的一个重要观察是,您可以而且应该按顶点和按粒子数据进行拆分。这意味着使用实例化(这只是一种说法:使用分频器)。我们用法线+围绕该法线的旋转来表示粒子旋转。
对粒子 CPU 端进行状态更改的另一个原因是,复合行为 CPU 端要容易得多。任何至少一半像样的粒子系统都需要相当多的旋钮来转动才能创建有趣的粒子效果。
编辑:如果你有任何类似 Particle::Update 的东西不能被内联,你就失败了,最小化每个粒子函数调用,尤其是虚拟函数调用,并保持粒子的内存表示紧密!
这取决于你拥有什么样的粒子系统。在大多数情况下,您有 C++ 中的软件表示和着色器的硬件表示。着色器的几何数据是从软件表示中计算出来的,应该尽可能少。因为在大多数情况下,限制资源的不是计算能力,而是显卡的传输速率。
如果您可以使用您的方法进一步减少传输,您仍然可以将软件表示保留在内存中以供进一步使用。即使这意味着计算数据两次,它也可以比传输过程更快。