3

我正在尝试对以下粒子系统进行修改。 http://create.msdn.com/en-US/education/catalog/sample/particle_3d

我有一个功能,当我按下 Space 时,所有粒子的位置和速度都设置为 0。

for (int i = 0; i < particles.GetLength(0); i++)  
{  
    particles[i].Position = Vector3.Zero;      
    particles[i].Velocity = Vector3.Zero;  
}

但是,当我按空格键时,粒子仍在移动。如果我转到 FireParticleSystem.cs,我可以将 settings.Gravity 设置为 0,粒子停止移动,但粒子仍然没有移动到 (0,0,0)。

据我了解,问题在于 GPU 正在处理所有粒子位置,它根据粒子的初始位置、初始速度和乘以它们的年龄来计算粒子应该在哪里。因此,我所能做的就是改变粒子的初始位置和速度,但我无法即时完成,因为 GPU 正在处理所有事情。

我希望 CPU 单独计算粒子的位置。这是因为我稍后将实施某种风来推动粒子。如何阻止 GPU 接管?我认为这与 VertexBuffers 和 draw 函数有关,但我不知道如何修改它以使其工作。

4

3 回答 3

1

您下载的示例无法满足您的要求。您对问题的诊断是正确的:粒子系统完全由 GPU 维护,因此您对位置和速度的更改只会更改起始值,而不是实际的实时粒子值。要制作一个可由CPU更改的粒子系统,您需要制作一个粒子引擎类并自己做。还有许多其他示例可以做到这一点。

Riemers XNA 教程非常有用。试试这个链接: http ://www.riemers.net/eng/Tutorials/XNA/Csharp/Series2D/Particle_engine.php

它教你如何制作一个 2D 粒子系统。这可以很容易地转换为 3D。或者,如果您只想下载现有引擎,请尝试 Mercury 粒子引擎: http: //mpe.codeplex.com/

于 2011-02-14T08:59:43.863 回答
0

我会为此推荐DPSF(动态粒子系统框架)。它在 CPU 上进行计算,完全可定制且非常灵活,有很好的帮助文档和教程,它甚至提供了您正在使用的 Particle3D 示例中的 FireParticleSystem 的完整源代码。您应该能够将粒子系统集成到您的游戏中,并在几分钟内完成您想要的。

于 2011-11-15T19:19:16.793 回答
0

这很简单……您所要做的就是在 CPU 上进行位置/速度计算,而不是将它们卸载到着色器。我当然看不到你的代码,所以我真的不能提供任何更具体的指导……但无论你是使用像 FarSeer 这样的物理引擎为你的粒子设置动画,还是自己做基本的运动方程。它会发生在 CPU 上。

于 2011-02-01T21:12:29.367 回答