使用CPU而不是GPU(XNA)绘制粒子

时间:2011-02-01 17:42:55

标签: xna xna-4.0

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

我有一个功能,当我按空格键时,所有粒子的位置和速度都设置为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和绘图功能有关,但我不知道如何修改它以使其工作。

3 个答案:

答案 0 :(得分:1)

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

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

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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