2013-01-23 27 views
0

我讀過將網格組合成單個網格並且渲染速度快得多,因爲您一次發送所有數據。我使用的是directx9.0c,固定功能,C++。我有很多LP3DXMESH,我想一次組合併發送畫出。如何將多個directx LP3DXMESH組合成1個網格進行快速渲染?

我谷歌的答案是我得到垃圾結果。我怎樣才能做到這一點?

+0

基本上你可以通過鎖定頂點和索引緩衝區來合併網格(例如'LockVertexBuffer'([doc](http://msdn.microsoft.com/de-de/library/windows/desktop/bb205731% 28v = vs.85%29.aspx))和複製數據,但這是很費力的,因爲索引數據必須被重寫。你的應用程序的目的是什麼?你有動態對象,它們在移動嗎?在這種情況下,它不是合併網格並不實際,因爲開銷會比渲染更大。 – Gnietschow

回答

0

要將幾個網格合併爲一個網格,這非常簡單,只要滿足一些標準即可。

您所有的網都必須具有相同的頂點尺寸/佈局(或declaration

鑑於此,讓我們說你有3種型號: 模型1有10個頂點和21個指數 模型2有20個頂點, 30個指數 模型3具有25個頂點和45個指數

創建頂點緩衝器,將能夠容納所有的數據:從模型1(例如10 + 20 + 25個頂點)

複印每個頂點,然後從Model 2和Model 3到這個新版本texbuffer。

以同樣的方式作爲頂點緩衝區創建一個索引緩存(例如:21個+ 30個+ 45指數)

現在對模型中的一個,剛纔複製的指數。

對於模型2,您需要複製索引,但將10添加到每個索引(第一個頂點緩衝區的大小)。

對於模型3,您的操作與第二種操作相同,但需要添加10 + 20(每個以前大小的總和)。

創建您與新緩衝區網格。

在一些注意事項:

  • 如果你不畫,往往(例如,3個網格繪製各一次)的模型,這將使​​你幾乎沒有任何好處。
  • 如果你的每個模型都需要用不同的轉換來繪製(這個轉換也經常發生變化),那麼你還需要在cpu中轉換頂點(這會給你一個潛在的性能損失),或者添加一些額外的數據在你的模型中(就像一個ID),並使用任何形式的查找(數組或紋理查找是常見的)在vertexshader中進行轉換。
  • 在某些情況下使用這種技術實際上很不錯(例如多次重複同一個對象),但看起來不像您的用例。