2014-02-21 45 views
2

我正在嘗試在我的遊戲中即興創作某種硬件實例。我只想繪製多個樹,只有一個Draw Call。世界矩陣陣列的XNA模型實例

到目前爲止,我已經建立了一個包含模型,紋理和矩陣數組的類。每個矩陣對應於遊戲世界中一棵樹的位置。

我決定在我的課程和着色器中使用50個對象作爲硬編碼限制。

我確定生成的矩陣是正確的。在多個繪圖調用中使用基本效果並在它們之間切換出世界矩陣時,在正確的位置上產生正確數量的樹。

我曾嘗試射中,黑暗的方法:

float4x4 View; 
float4x4 Projection; 
float4x4 World[50]; 

... 

VertexShaderOutput VertexShaderFunction(VertexShaderInput input) 
{ 
    VertexShaderOutput output[50]; 

    for (int i=0; i<50; i++) 
    { 
     float4 worldPosition = mul(input.Position, World[i]); 
     float4 viewPosition = mul(worldPosition, View); 
     output[i].Position = mul(viewPosition, Projection); 
     output[i].texCoord = input.texCoord; 

     return output[i]; 
    } 

} 

令我驚訝的是,這居然也編譯,以更大的驚喜,沒有融化我的GPU。

要沒有這麼大的驚喜,這僅消耗一棵樹,第一個,當環路儘快結束,因爲它擊中了「迴歸」的關鍵字任何頭腦健全希望它。

我已經嘗試了谷歌搜索技巧與谷歌搜索這類問題,但大多數的結果處理C + +代碼(我使用C#+ XNA),他們的方法是基本上收集所有需要模型的頂點並轉發所有這些,作爲用一個世界矩陣位置繪製的一個巨大模型。

是否有借鑑使用世界矩陣陣列中的着色器模型一個可靠的方式,或者我必須收集所有的頂點數據和批量這樣的說法?

+0

你可能有這樣的渲染問題上http://gamedev.stackexchange.com/ ......即使這不是遊戲開發更好的運氣,那裏的人可以處理這種事情更頻繁。 – Beska

+0

OK謝謝你,我會嘗試有作爲:) – Eudaimonium

回答

0

有XNA的整個部分專用硬件實例化。你需要能夠編寫自己的着色器,這並不難學。您基本上爲着色器提供一組矩陣和一個幾何網格,着色器將爲每個世界矩陣一次網格。此方法還允許您將更多的替代世界矩陣傳遞給每個實例,例如替代紋理座標。

+0

這是字面上我在做什麼,和它不工作本身。 正確的是是利用DrawInstancedPrimitives的繪圖調用,使用多個頂點數據流。轉發世界矩陣數組將不會奏效。 – Eudaimonium