2014-09-24 72 views
1

我想知道爲什麼當我使用Assimp庫導入波前對象文件(.obj)時,它會使特定頂點翻倍,並且我在Assimp SourceForge討論中找到以下答案http://sourceforge.net/p/assimp/discussion/817654/thread/026e9640/?limit=25#ba6c):
Assimp與MeshLab波前對象(.obj)導入

想象一下以下內容:您上傳了一系列的頂點到圖形卡。然後你通過一個索引緩衝區告訴GPU,你希望第一個三角形由頂點3,6和7組成。第二個三角形則是1,2和6.會發生什麼? GPU會爲您繪製一個立方體,但立方體的每個角落都會共享相同的UV數據,法向量,頂點顏色或您網格所需的其他任何東西。

現在我們如何獲得一個立方體角落,但是在接觸角落的所有側面都得到不同的UV映射?我們不能告訴GPU「使用頂點3,而是使用頂點的UV座標,而不是使用UV座標。」 GPU不能做到這一點。這就是爲什麼有必要複製該角落的頂點。現在,您有兩個相同位置的頂點,但具有不同的UV座標。

這就是Assimp爲你做的。如果你指定JoinIdenticalVertices,你將得到一個有24個頂點的立方體。爲什麼?立方體有8個角落,但有3個立方體側面在每個角落接觸,並且每個立方體側面爲該角落設置不同的UV座標,所以最終每個角落有3個版本。如果你沒有指定JoinIdenticalVertices,你會得到一個沒有任何重用的普通頂點數組。這意味着你需要2個三角形,每個立方體有3個頂點,最終在36個頂點。

另一種方法是使用3D uv座標和立方體貼圖來貼圖。這是一個特殊的情況,只適用於一個立方體,但它可以工作。 GPU然後在內部映射到6個紋理。上面的描述是一般情況,對於每個可能遇到的網格,它都是這樣工作的。

它確實有道理。
假設我不知道MeshLab如何處理.obj導入操作怎麼回事,如果我找到的答案是正確的,當我導入這樣一個對象時頂點計數器不會增加?這只是他們如何進行計數的問題,還是有辦法導入.obj文件,而不必在具有法線/切線/ UV時分割頂點?

回答

1

這不是特定於實現的(例如,它們有幾個向量 - 每個變量都有一個向量),但邏輯是相同的。

Meshlab除了常見的位置之外,還爲每個3D座標生成一個頂點,其中有幾個可能的「值」用於變量,如法線和紋理。這些頂點存儲在頂點向量中。

這些多個值存儲在一個單獨的頂點數據向量中(我將調用VDV)。三角形面將指向VDV中的3個條目,但頂點可指向任意數量的它們。

渲染時,VDV將用於索引目的,但實際頂點用於計算填充物和計算頂點數時。他們對像正常人這樣的東西分開「組合」值,認爲他們所有的相鄰面孔。

+0

明白了,謝謝先生! – mrcointreau 2016-02-12 09:14:07