2011-09-08 105 views
0

假設,例如,我有一個10x10「布」網格,每個正方形都是兩個三角形。現在,如果我想動畫,我可以在CPU上進行彈簧計算。每個頂點都會有自己的「彈簧」數據,並希望能夠像任何類型的「布料」一樣反彈。如何在處理後從顯卡讀取信息?

但是,這將涉及最低約380?每幀彈簧計算。令人高興的是,每個頂點的計算是「令人尷尬的並行」 - 如果每個頂點有一個CPU,每個頂點可以在單個CPU上運行。因此,GPU在理論上是運行此類計算的理想選擇。

除(這是使用的DirectX/SlimDX) - 我不知道/我不知道我怎麼會/應該:

1)發送所有這些頂點數據,以顯卡(是的,我知道如何渲染東西,甚至寫我自己的每像素和紋理混合全局光照效果文件;但是,每個頂點必須能夠訪問至少三個其他頂點的位置數據)。我想我可以在TextureCoords中粘貼相關的頂點位置和頂點位置數,但是可能有不同的標準解決方案。

2)之後讀取所有的頂點數據,這樣我就可以更新內存中的網格。否則,每次更新將對完全相同的數據執行完全相同的結果,而不是像2 + 3 = 5 - 2 = 3時那樣添加2 + 3 = 5,2 + 3 = 5,2 + 3 = 5 + 1.5 = 4.5。

而且這可能是我在錯誤的方向看這樣做。

謝謝。

回答

1

您可以使用您描述的方法將數據打包到紋理中,並編寫特殊的HLSL着色器來計算彈力,然後更新頂點位置。這種方法是完全有效的,但在嘗試調試問題時會很麻煩,因爲您以非常規方式使用紋理像素(可以繪製紋理,也可以編寫一些代碼以觀察給定像素中的值)。從長遠來看,使用諸如CUDA,DirectCompute或OpenCL之類的東西可能更容易。 CUDA允許您「綁定」DirectX頂點緩衝區以便在CUDA中訪問。然後在CUDA內核中,您可以使用位置來計算力,然後在渲染更新的位置之前將新位置寫入頂點緩衝區(在GPU上並行)。 有一個在DirectX 10/11 DirectX SDK中使用DirectCompute的布料演示。