2011-02-01 58 views
3

我正在嘗試修改以下粒子系統。 http://create.msdn.com/en-US/education/catalog/sample/particle_3d使用CPU而不是GPU繪製粒子(XNA)

我有這樣的功能,當我按空格鍵,所有的粒子有自己的位置和速度設置爲0

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

然而,當我按下空格鍵,顆粒仍在移動。如果我去FireParticleSystem.cs,我可以調整設置。重力爲0,粒子停止移動,但粒子仍然沒有移動到(0,0,0)。

據我所知,問題在於GPU正在處理所有的粒子位置,它正在計算粒子應該基於它們的初始位置,初始速度和乘以其年齡的位置。因此,我所能做的就是改變粒子的初始位置和速度,但是由於GPU處理所有事情,所以我無法實時完成它。

我想讓CPU分別計算粒子的位置。這是因爲我稍後會實施某種風來推動粒子。我如何阻止GPU接管?我認爲這與VertexBuffers和draw函數有關,但我不知道如何修改它以使其工作。

+0

您也可以嘗試gamedev.stackexchange.com。 – Nate 2011-02-01 17:49:31

回答

0

這很簡單...您只需要在CPU上進行位置/速度計算,而不是將它們卸載到着色器。我當然看不到你的代碼,所以我不能提供任何更具體的指導......但是不管你是用像FarSeer這樣的物理引擎來動畫你的粒子,還是你自己來做基本的運動方程。它會發生在CPU上。

1

您下載的示例無法執行您所要求的操作。在對問題的診斷中,您是正確的:粒子系統完全由GPU維護,因此對位置和速度的更改只會改變起始值,而不會改變實際的實時粒子值。爲了使CPU可以改變粒子系統,你需要製作一個粒子引擎類,然後自己做。有很多其他的樣本可以做到這一點。

Riemers XNA教程非常有用。試試這個鏈接: http://www.riemers.net/eng/Tutorials/XNA/Csharp/Series2D/Particle_engine.php

它教你如何製作二維粒子系統。這可以很容易地轉換成3D。 或者,如果你想只下載現有的發動機,嘗試水星粒子引擎: http://mpe.codeplex.com/

0

我會建議DPSF (Dynamic Particle System Framework)這一點。它在CPU上進行計算,完全可定製且非常靈活,對文檔和教程有很大幫​​助,甚至可以從您正在使用的Particle3D樣本中提供FireParticleSystem的完整源代碼。您應該能夠將粒子系統集成到您的遊戲中,並在幾分鐘內完成您想要的任務。