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

3
我正在尝试修改以下粒子系统。 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和绘制函数有关,但我不知道如何修改它使其正常工作。

你也可以尝试访问gamedev.stackexchange.com。 - Nate
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/

0
这很简单...你只需要在CPU上进行位置/速度计算,而不是将它们卸载到着色器上。当然,我看不到你的代码,所以我无法提供更具体的指导...但无论你是使用像FarSeer这样的物理引擎来为粒子添加动画效果,还是自己进行基本的运动方程计算,都会在CPU上进行。

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接