2013-07-17 77 views
2

我在寫一個使用C++和DirectX 11的小型渲染引擎。我設法使用索引頂點渲染模型。現在我想支持紋理和頂點法線。我正在使用Wavefront OBJ文件,它使用索引來引用正確的紋理和法線座標(很像索引頂點)。這是我第一次將頂點,紋理和法線組合在一起,所以這對我來說有點新鮮。如何一起使用頂點,法線和紋理索引?

我面臨的問題是,頂點,法線和紋理座標的索引數量不相同,我試圖找到一個正確的方式在頂點着色器中使用所有這些索引。爲了更清楚地說明問題,我做了一些圖片。

http://oi43.tinypic.com/2cegtih.jpg http://oi39.tinypic.com/33l1o46.jpg

左邊的圖像是一個簡單的piramid對象的線框和右圖像是其UV座標佈局(具有piramid的位於中心的底部)。在左邊的圖像中,你可以看到piramid有4個頂點,所以有4個頂點索引。右UV佈局有6個UV座標,所以有6個紋理索引。對於金字塔的每個面都有自己的法線,所以只有4個正態分佈。

我發現this問題,同時搜索和它似乎理論上工作(我還沒有嘗試過)。這是解決這種問題的常用方法,還是有更好的方法?你會推薦我做什麼?

謝謝:)

P.S。:我的頂點,正常和紋理數據被存儲在CPU側單獨的陣列。

+0

什麼問題了嗎? – zdd

回答

1

我會建議你分析縮小到最簡單的情況的問題;對我來說,它只幫助使用兩個正方形(平面,四個三角形),並嘗試正確映射兩個正方形上的紋理,如圖中所示。

enter image description here

使用這個簡單的情況下,你有這樣的數據:

  • 6個頂點
  • 6烏布蘇
  • 6法線(每個頂點,即使有些頂點可能共享同正常)
  • 12個索引

理論上這可以描述你的整個數據,但是如果你測試它會發現其中一個映射的紋理不會被完全映射到其中一個正方形上。這是因爲對於頂點2和頂點3,您有兩個不同的UV座標集,使用這麼少的頂點來描述是不可能的,您需要更多的頂點!

要解決這個問題,您從您選擇的任何出口商收集的數據將在發生這種衝突時複製頂點。對於上面的例子,將需要兩個頂點,它會產生法線數據的重複數據,索引中會有2個元素,但現在它將描述正確映射UV座標。

最後,你的榜樣那些4個頂點不能完全描述所有UV COORDS,然後複製一些頂點將需要完成的UV佈局,指數數組將增大。

對於零件不確定的情況是,如果OBJ格式導出器實際上引發準備讀取的數據,或者您可以嘗試弄清楚導出器,或者您可以嘗試另一種格式(我最好推薦您)導出已經以正確格式準備推送到DirectX11的圖形管道中的數據。

希望幫助我理解這個問題的例子,將有助於你。 看看一些基本的DirectX11教程,或者如果可以的話this書。

+0

是的,這實際上是有道理的。現在我更清楚了,現在知道了,我認爲OBJ格式還沒有準備好直接從OBJ導出器讀取。我想我會看一些更合適的其他數據格式。你知道你可以推薦的數據格式嗎? – Krienie

+0

聽說COLLADA是一個很好的,具有可讀格式(XML),還沒有嘗試過自己,但也許會爲你最好的一段路要走。對於我實際做的是爲Blender和3DMax創建我自己的導出器,您可以在我的博客notnullgothik.blogspot.com中看到結果,大多數商業引擎將在我使用時使用自己的優化加載和二進制格式數據。 – notNullGothik

+0

我會檢查出來,thx – Krienie