我想知道爲什麼當我使用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時分割頂點?
明白了,謝謝先生! – mrcointreau 2016-02-12 09:14:07