2013-01-02 54 views
1

我最近解決了防止從一個OpenGL ES iOS應用程序的工作我的照明問題:多頂點緩存的OpenGL ES在iOS

Solved Question

我解決了這個問題,通過更換

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

glGenBuffers(1, &_vertexBuffer); 
glBindBuffer(GL_ARRAY_BUFFER, _vertexBuffer); 
glBufferData(GL_ARRAY_BUFFER, loader.currentCountOfVerticies * sizeof(GLfloat) * 3, arrayOfVerticies, GL_STATIC_DRAW); 

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

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

glGenBuffers(1, &_normalBuffer); 
glBindBuffer(GL_ARRAY_BUFFER, _normalBuffer); 
glBufferData(GLKVertexAttribNormal, loader.currentCountOfNormals * sizeof(GLfloat) * 3,loader.arrayOfNormals , GL_STATIC_DRAW); 

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

glEnable(GL_DEPTH_TEST); 

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

glGenBuffers(1, &_vertexBuffer); 
glBindBuffer(GL_ARRAY_BUFFER, _vertexBuffer); 
glBufferData(GL_ARRAY_BUFFER, total * sizeof(GLfloat), mergedArray, 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); 

組合頂點和正常數組ls到一個GLfloat數組並將該數組傳遞給單個緩衝區。這解決了我的問題,但我不明白爲什麼。據我所知,我應該可以使用2個緩衝區?

+0

因此,看來你沒有回答你原來的問題,但。 –

+0

[打開的GL ES 2.0燈光在iOS應用程序中無法使用]的可能重複(http://stackoverflow.com/questions/14103464/open-gl-es-2-0-lighting-not-working-in-ios-app ) –

+0

爲了清潔(即使這意味着犧牲我可以獲得的代表))我建議你刪除這個問題,因爲我已經將我的(據推測是正確的)答案複製到原始問題上,完全解決了。 –

回答

5

問題不在於使用多個頂點緩衝區,而在於使用多個頂點數組對象。一個頂點數組對象(VAO)是一種輕量級對象(即它不包含任何實際頂點屬性數據)封裝所有用於呈現一串頂點數組的與單個繪圖調用所需的狀態,特別是

  • glVertexAttribPointer爲每個屬性索引
  • 啓用的屬性陣列進行的設置
  • 結合的元件陣列緩衝器

因此它比個人頂點高一個級別屬性陣列,其包括所有的頂點ATTR一個(概念性)場景對象的ibute數組設置,或者更正確地說,一個繪製調用。

但是在您的原始代碼中,您爲每個單獨的屬性創建了一個新的頂點數組對象。當然後渲染你只綁定_vertexArray,這反過來只設置和啓用GLKVertexAttribPosition屬性,因此沒有法線或任何其他。

所以,你應該有相當取代他們的是原代碼:

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

glGenBuffers(1, &_vertexBuffer); 
glBindBuffer(GL_ARRAY_BUFFER, _vertexBuffer); 
glBufferData(GL_ARRAY_BUFFER, loader.currentCountOfVerticies * sizeof(GLfloat) * 3, arrayOfVerticies, GL_STATIC_DRAW); 

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

//this is the error 
//glGenVertexArraysOES(1, &_normalArray); 
//glBindVertexArrayOES(_normalArray); 

glGenBuffers(1, &_normalBuffer); 
glBindBuffer(GL_ARRAY_BUFFER, _normalBuffer); 
glBufferData(GLKVertexAttribNormal, loader.currentCountOfNormals * sizeof(GLfloat) * 3,loader.arrayOfNormals , GL_STATIC_DRAW); 

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

glBindVertexArrayOES(0);