2010-04-05 429 views
4

我正在製作一個小型的3D圖形遊戲/演示用於個人學習。我知道d3d9,關於d3d11,但關於opengl目前很少,所以我打算抽象出圖形的實際渲染,這樣我的場景圖和所有「高於」的東西都需要知道如何實際繪製圖形。我打算使它與d3d9一起工作,然後添加d3d11支持,最後是opengl支持。就像學習3D圖形和抽象的練習一樣。opengl中的頂點緩衝區

雖然在這一點上我對opengl知之甚少,也不希望自己的抽象接口暴露出一些在opengl中不易實現的東西。具體來說,我正在尋找頂點緩衝區。在d3d中,它們基本上是一個結構數組,但看看opengl接口的等價物似乎是頂點數組。然而,這些似乎是組織不同,你需要一個單獨的頂點陣列,一個用於法線,一個用於紋理座標等,並設置與glVeexexPointer,glTexCoordPointer等。

我希望能夠實現一個VertexBuffer接口非常類似於directx,但它看起來像在d3d中有一個結構數組,並且在opengl中,每個元素都需要一個單獨的數組,這使得找到一個通用抽象很難提高效率。

有沒有什麼辦法像directx一樣使用opengl?或者有關如何提出更高級別抽象的建議,以便在兩個系統上高效工作?

回答

3

頂點數組有一個步幅和一個偏移屬性。這是特別允許結構的數組。

所以,說你要建立一個VBO與FLOAT3頂點和FLOAT2紋理座標,你會做到以下幾點:

// on creation of the buffer 
typedef struct { GLfloat vert[3]; GLfloat texcoord[2]; } PackedVertex; 
glBindBuffer(GL_ARRAY_BUFFER, vboname); 
glBufferData(...); // fill vboname with array of PackedVertex data 

// on using the buffer 
glBindBuffer(GL_ARRAY_BUFFER, vboname); 
glVertexPointer(3, GL_FLOAT, sizeof(PackedVertex), BUFFER_OFFSET(0))); 
glTexCoordPointer(2, GL_FLOAT, sizeof(PackedVertex), BUFFER_OFFSET(offsetof(PackedVertex, texcoord)); 

隨着BUFFER_OFFSET宏把偏移到相應的指針( vbos使用指針參數作爲偏移量),並偏移另一個宏以查找PackedVertex結構內texcoord的偏移量。在這裏,它可能是sizeof(float)* 3,因爲結構中不會有任何填充。

+0

好吧,這是有道理的。您仍然需要調用不同的函數來設置不同的屬性,但我仍然應該能夠與d3d共享一個結構。嗯,我真的需要更多地瞭解opengl :) – jcoder 2010-04-05 13:03:45

+0

@JB,實際上,如果你使用GL3.0,它會引入頂點數組對象,它封裝了整個事物。 http://www.opengl.org/registry/specs/ARB/vertex_array_object.txt – Bahbar 2010-04-05 13:16:15

+0

避免gl..Pointer作爲瘟疫。改用glVertexAttribPointer。另外,如果可以提供幫助,請避免交錯數據(步幅)。而是將單個頂點屬性順序保存在一個緩衝區對象中。請記住通過對齊數據緩衝區來使GPU快樂。 – 2010-04-05 23:17:03