2012-12-20 38 views
3

我在使用這個OpenGL實現發現我的錯誤時遇到了問題。當我運行程序時,我得到的唯一東西就是黑屏。我應該看到一個立方體。我沒有收到任何錯誤。我懷疑罪魁禍首可能會與VAO鹼液:用OpenGL和頂點數組對象捕捉錯誤

// draws the view 
-(void)drawRect:(NSRect)dirtyRect 
{ 
// clear the viewport 
glClearColor(0.0, 0.0, 0.0, 1.0); 
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 

shaderProgramID = [self loadShaders]; 

// get uniform locations 
uniformLocations[0] = glGetUniformLocation(shaderProgramID, "rotationX"); 
uniformLocations[1] = glGetUniformLocation(shaderProgramID, "rotationY"); 
uniformLocations[2] = glGetUniformLocation(shaderProgramID, "rotationZ"); 
uniformLocations[3] = glGetUniformLocation(shaderProgramID, "translation"); 
uniformLocations[4] = glGetUniformLocation(shaderProgramID, "projection"); 

// use this program 
glUseProgram(shaderProgramID); 

// create VAO 
glGenVertexArraysAPPLE(1, &vao); 
glBindVertexArrayAPPLE(vao); 
glGenBuffers(3, vbo); 

// bind and copy data for vertex position data 
glBindBuffer(GL_ARRAY_BUFFER, vbo[0]); 
glBufferData(GL_ARRAY_BUFFER, sizeof(cubePositionData), cubePositionData, GL_STATIC_DRAW); 
glVertexAttribPointer(TCV_VERTEX_POS_INDEX, TCV_NUM_POS_COMPONENTS, GL_FLOAT, GL_FALSE, 0, 0); 
glEnableVertexAttribArray(TCV_VERTEX_POS_INDEX); 

// bind and copy data for vertex color data 
glBindBuffer(GL_ARRAY_BUFFER, vbo[1]); 
glBufferData(GL_ARRAY_BUFFER, sizeof(cubeColorData), cubeColorData, GL_STATIC_DRAW); 
glVertexAttribPointer(TCV_VERTEX_COLOR_INDEX, TCV_NUM_COLOR_COMPONENTS, GL_FLOAT, GL_FALSE, 0, 0); 
glEnableVertexAttribArray(TCV_VERTEX_COLOR_INDEX); 

// bind and copy data for vertex indices data 
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, vbo[2]); 
glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(cubeIndices), cubeIndices, GL_STATIC_DRAW); 
glVertexAttribPointer(TCV_VERTEX_INDICES_INDEX, TCV_NUM_INDEX_ARRAY_COMPONENTS, GL_UNSIGNED_BYTE, GL_FALSE, 0, 0); 
glEnableVertexAttribArray(TCV_VERTEX_INDICES_INDEX); 

// load uniform data into shader program 
glUniformMatrix4fv(uniformLocations[0], 1, GL_FALSE, rotationMatX); 
glUniformMatrix4fv(uniformLocations[1], 1, GL_FALSE, rotationMatY); 
glUniformMatrix4fv(uniformLocations[2], 1, GL_FALSE, rotationMatZ); 
glUniformMatrix4fv(uniformLocations[3], 1, GL_FALSE, translationMat); 
glUniformMatrix4fv(uniformLocations[4], 1, GL_FALSE, projectionMat); 

// tell OGL to draw the cube, in this order 
glDrawElements(GL_TRIANGLES, 12, GL_UNSIGNED_BYTE, cubeIndices); 

// unbind VAO 
glBindVertexArrayAPPLE(0); 

// no longer using program 
glUseProgram(0); 

// flush buffer 
glFlush(); 
[[self openGLContext] flushBuffer]; 
} 
+1

這可能聽起來像一個破碎的記錄,但你有沒有檢查glError後,每一個單一的呼叫? –

+0

我會通過OpenGL Profiler來檢查是否所有狀態在渲染時都是正確的,並且不會出現錯誤:「/ Developer/Applications/Graphics Tools/OpenGL Profiler」 – kvark

回答

0

我的OpenGL實驗有類似的問題。我還使用單獨的緩衝區對象作爲頂點位置和頂點顏色數據。我相信只有一個GL_ARRAY_BUFFER可以綁定到頂點數組對象。因此,將所有數據放入一個組合緩衝區,然後將偏移量的屬性指針設置到該緩衝區中。

您的VBO/VAO設置應該是這樣的:

glGenVertexArrays(1, &vertexArray); 
glBindVertexArray(vertexArray); 

glGenBuffers(1,&vertexBuffer); 
glBindBuffer(vertexBuffer); 
glBindBufferData(GL_ARRAY_BUFFER, sizeof(cubePositionAndColorData), cubePositionAndColorData, GL_STATIC_DRAW); 

glVertexAttribPointer(kPositionAttribute, NUM_VERTEX_COMPONENTS, GL_FLOAT, GL_FALSE, 0, 0); 
// colorStartingIndex is probably just NUM_VERTEX_COMPONENTS*sizeof(GLfloat) 
glVertexAttribPointer(kColorAttribute, NUM_COLOR_COMPONENTS, GL_FLOAT, GL_FALSE, 0, (void *)colorStartingIndex); 

glEnableVertexAttribArray(kPositionAttribute); 
glEnableVertexAttribArray(kColorAttribute); 

glGenBuffers(1,&indexBuffer); 
glBindBuffer(indexBuffer); 
glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(cubeIndices), cubeIndices, GL_STATIC_DRAW); 

glBindVertexArray(0); 

然後,你-drawRect:功能中,您可以使用該程序,建立你的制服,並呼籲glDrawElements()

glUseProgram(shaderProgramID); 

// do the necessary uniform configuration 
glUniformMatrix4fv(...) 

glBindVertexArray(vertexArray); 
glDrawElements(GL_TRIANGLES, 12, GL_UNSIGNED_BYTE, 0); 

glBindVertexArray(0); 

glUseProgram(0); 

兩個其他項目值得一提:

  1. 我建議把所有的緩衝區initializat離開你的-drawRect:方法,因爲每次重新繪製視圖時都會調用它。這意味着你將每個-drawRect:的所有數據重新複製到OpenGL服務器。
  2. 如果您使用的是更新版本的osx,則應考慮使用最新版本的OpenGL(OpenGL/gl3.h)。