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

使用CPU而不是GPU(XNA)绘制粒子,xna,xna-4.0,Xna,Xna 4.0,我正在尝试修改以下粒子系统。 我有一个函数,当我按下空格键时,所有粒子的位置和速度都设置为0 for (int i = 0; i < particles.GetLength(0); i++) { particles[i].Position = Vector3.Zero; particles[i].Velocity = Vector3.Zero; } for(int i=0;i

我正在尝试修改以下粒子系统。

我有一个函数,当我按下空格键时,所有粒子的位置和速度都设置为0

for (int i = 0; i < particles.GetLength(0); i++)  
{  
    particles[i].Position = Vector3.Zero;      
    particles[i].Velocity = Vector3.Zero;  
}
for(int i=0;i
但是,当我按空格键时,粒子仍在移动。如果我转到FireArticleSystem.cs,我可以将settings.Gravity设置为0,粒子停止移动,但粒子仍然没有移动到(0,0,0)

据我所知,问题在于GPU正在处理所有粒子的位置,它根据粒子的初始位置、初始速度以及乘以它们的年龄来计算粒子的位置。因此,我所能做的就是改变粒子的初始位置和速度,但我无法在飞行中做到这一点,因为GPU正在处理一切


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

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

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

Riemers XNA教程非常有用。请尝试以下链接:

它将教您如何创建二维粒子系统。这可以很容易地转换为3D。 或者,如果您只想下载现有引擎,请尝试Mercury粒子引擎:
我建议您这样做。它在CPU上进行计算,完全可定制且非常灵活,具有很大的帮助文档和教程,甚至还提供了您正在使用的Particle3D示例中FireParticle系统的完整源代码。您应该能够将粒子系统集成到游戏中,并在几分钟内完成您想要的任务。

您也可以尝试gamedev.stackexchange.com。