2013-01-03 42 views
2

我試圖在頂點陣列對象(VAO)中使用兩個頂點緩衝區對象(VBO)和兩個索引緩衝區對象(IBO)來渲染來自包含3D模型的波前.Obj文件的數據。使用 的obj文件是vertex/normal face definition我如何從波前.obj文件獲取索引頂點位置和索引頂點法線到OpenGL頂點着色器?

f v1//vn1 v2//vn2 v3//vn3 

我發現我不能,因爲只有一個緩衝對象(一次)使用兩個企業家們用於索引與OpenGL的VAO可以綁定到GL_ELEMENT_ARRAY_BUFFER結合靶。這意味着我不能只定義頂點位置索引和頂點法線索引,這在我需要同時作爲GLSL頂點着色器的輸入時是個問題。

我想過使用封裝頂點位置和頂點法線的「Vertex」結構,但我不知道如何將OpenGL數據作爲任何東西提供給一個長數組,並且當我將所有頂點位置數據放在不同的對象中時。我想我可以使用一些循環將數據複製到包含所有位置數據的新數組。

加載.obj文件時,我想我可以處理數據,以便法線與相應的頂點位置值相匹配。

我應該如何解決這個問題?

我在OpenGL 3.3中使用C++和Visual Studio 2012。

回答

7

你必須明白的一件事是,「頂點」與「位置」不是同名的。頂點是整套屬性;位置,法線,紋理座標等。OpenGL每次處理一個圖元,其中一個圖元由1(點),2(線)或3個頂點(三角形)組成。你不能分開處理位置和正常,他們必須一起走。

在OpenGL中處理它之前,您必須展開.obj文件中的數據。對於每個屬性的唯一元組引入一個帶有新索引的新頂點,並用.obj替換索引頂點OpenGL所需的索引屬性。

+0

謝謝你的回答,datenwolf。我現在在概念上理解它。 – aPerfectMisterMan

+0

我相信我仍然失去了一些東西。 「對於每個屬性的唯一元組引入一個帶有新索引的新頂點並替換索引屬性...」 在一個面內,obj中的頂點具有相關的法線。在共享相同頂點的另一面中,該頂點具有不同的法線。 OpenGL中的頂點法線屬性是否代表每個頂點每個頂點的法線,或者單個頂點的單個法線,而不管它屬於哪個面?對不起necropost。 –

+1

@JohnP:請再次閱讀我答案的第一句話。如果有兩個頂點具有相同的位置,但不同的法線,則它們是*不同*頂點! Wavefront OBJ文件是錯誤的,因爲它們稱爲*位置*「頂點」(它們不是,它們只是位置),並且臉部記錄索引到「頂點」和「頂點正常」記錄(記錄的專有名稱將是「位置記錄「和」正常記錄「)。 – datenwolf