2011-12-06 54 views
4

你好,我已經嘗試瞭解代碼的這部分發生了什麼,儘可能多,但我沒有運氣。在xcode 4.2中找到的OpenGL遊戲模板(在這段代碼中發生了什麼?!!)

glGenVertexArraysOES(1, &_vertexArray); 
glBindVertexArrayOES(_vertexArray); 

glGenBuffers(1, &_vertexBuffer); 
glBindBuffer(GL_ARRAY_BUFFER, _vertexBuffer); 
glBufferData(GL_ARRAY_BUFFER, sizeof(gCubeVertexData), gCubeVertexData, GL_STATIC_DRAW); 

glEnableVertexAttribArray(GLKVertexAttribPosition); 
glVertexAttribPointer(GLKVertexAttribPosition, 3, GL_FLOAT, GL_FALSE, 24, BUFFER_OFFSET(0)); 
glEnableVertexAttribArray(GLKVertexAttribNormal); 
glVertexAttribPointer(GLKVertexAttribNormal, 3, GL_FLOAT, GL_FALSE, 24, BUFFER_OFFSET(12)); 

glBindVertexArrayOES(0); 

這屬於在xcode 4.2上創建OpenGL遊戲的模板。然而,我完全困惑,如果有人能向我解釋,我會愛上它。

首先,如何在不添加任何內容的情況下生成並綁定_vertexArray?

其次,如果gCubeVertexData是216以下的數組:

GLfloat gCubeVertexData[216] = 
{ 
    // Data layout for each line below is: 
    // positionX, positionY, positionZ,  normalX, normalY, normalZ, 
    0.5f, -0.5f, -0.5f,  1.0f, 0.0f, 0.0f, 
    0.5f, 0.5f, -0.5f,   1.0f, 0.0f, 0.0f, 

我會想,即時通訊處理這個數組以下命令,其中我使GLK的屬性,這就是即時通訊使用什麼指針(仍然使用prev綁定的)。但是,如果我沒有誤認爲語法是,(屬性集,頂點的大小,類型,假的,結構的大小(我認爲不是24),並從數據中偏移(這是從哪裏來的?!))

和最後一個問題,爲什麼我現在將0綁定到頂點數組?

編輯:爲了誠實我在不同的網站嘗試研究有關opengl,但我只能碰到理論而不是實踐。這就是我問這個問題的原因。

回答

21

好,分步:

glGenVertexArraysOES(1, &_vertexArray); 
glBindVertexArrayOES(_vertexArray); 

此結合併產生一個頂點數組對象(VAO)。現在VAO不包含任何數據。它只包含與頂點數組/屬性相關的所有狀態,例如啓用的屬性或使用glVertexAttribPointer進行的設置。

glGenBuffers(1, &_vertexBuffer); 
glBindBuffer(GL_ARRAY_BUFFER, _vertexBuffer); 
glBufferData(GL_ARRAY_BUFFER, sizeof(gCubeVertexData), gCubeVertexData, GL_STATIC_DRAW); 

這現在創建並綁定一個頂點緩衝器對象(VBO),其基本上是由僅僅指剛OpenGL的管理的明文數據緩衝器,和頂點數據複製到它。

讓我們看一下這些數據:

GLfloat gCubeVertexData[216] = 
{ 
    // Data layout for each line below is: 
    // positionX, positionY, positionZ,  normalX, normalY, normalZ, 
    0.5f, -0.5f, -0.5f,  1.0f, 0.0f, 0.0f, 

你的數據被佈置爲一堆浮子(32位/每4字節)的,與表示頂點,這反過來又由每六個值一個位置(3個浮標)和一個正常(3個浮標)。

glVertexAttribPointer(GLKVertexAttribPosition, 3, GL_FLOAT, GL_FALSE, 24, BUFFER_OFFSET(0)); 

這指定了每個頂點包含3個浮點值的第一個屬性(位置),每個頂點之間跨度爲24個字節。意思是從一個頂點的屬性值(在這種情況下的位置)開始到下一個頂點的屬性數據的開始爲止的24個字節。實際上24字節是6個浮點數的大小,因此也是我們頂點數據中單個頂點數據的大小,所以這恰好符合。最後一個參數表示位置數據從當前綁定的VBO(包含我們的頂點數據)開始,因爲它是我們頂點數據中的第一個屬性。

glVertexAttribPointer(GLKVertexAttribNormal, 3, GL_FLOAT, GL_FALSE, 24, BUFFER_OFFSET(12)); 

這指定第二屬性(正常)到包含每個頂點3的浮點值,再以24個字節的步幅,因爲是從同一數據採購它。所以從一個正常到下一個也是24個字節(6個浮點數)。現在最後一個參數表示正常數據在當前綁定的VBO(包含我們的頂點數據)開始之後開始12個字節(3個浮點數)。這是必要的,因爲法線是我們頂點數據中的第二個屬性,所以我們需要「跳過」前三個值(即位置)以得到正常數據。如果我們再次使用0,我們將採用與位置相同的數據。

glEnableVertexAttribArray(GLKVertexAttribPosition); 
glEnableVertexAttribArray(GLKVertexAttribNormal); 

這些最終啓用渲染屬性。

glBindVertexArrayOES(0); 

所以這現在綁定默認的(不)VAO,因爲我們完成了指定它。我想這整個代碼片段是一些初始化例程的一部分。所以,現在每當我們以後想使我們的頂點數據,可能使用glDrawArrays,我們只需要調用Draw方法,每個頂點數組狀態通過glEnableVertexAttribArrayglVertexAttribPointer獲取做出之前綁定使用glBindVertexArray的VAO的設定值時,VAO被綁定最後,就像我們的初始化程序一樣。如果你不會使用VAO,你就必須調用glBindBuffer,你想得出這樣的頂點數據,每次兩個glEnableVetrexAttribArrayglVertexAttribPointer電話。

但所有這些說明假設你是這些概念或多或少的瞭解。如果所有這些詞都沒有告訴你什麼,那麼你應該從試圖破譯其他人的代碼之前學習一些真正的學習資源開始。

+0

非常感謝你,這個代碼是直接從Xcode中自帶的模板。我在網上做了一個使用教程,但它沒有管理的跨步,所以我真的不知道到底是什麼意思。在ios 5上找到用於學習opengl es 2的新資源證明是相當困難的。 – Pochi

+0

@LuisOscar如果答案是解決您的問題,acepting將不勝感激。如果你仍然對你的問題有些不滿,請隨時詢問他們。 –

+0

我很確定我已經做到了,哈哈srry – Pochi

相關問題