2012-12-20 44 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)。