2012-12-20 5 views
3

이 OpenGL 구현으로 실수를 저지르는 데 어려움을 겪고 있습니다. 내가 프로그램을 실행할 때 얻을 수있는 유일한 것은 검은 화면입니다. 나는 큐브를보아야한다. 어떤 종류의 오류도 발생하지 않습니다. 내 OpenGL을 실험과 비슷한 문제가 있었다OpenGL 및 Vertex Array Objects로 실수를 잡는 데 어려움이 있습니다.

// 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

이것은 깨진 레코드처럼 들리지만 모든 단일 gl 호출 후에 glError를 확인 했습니까? –

+0

OpenGL Profiler를 통해 렌더링을 할 때 모든 상태가 올바른지, 오류가 발생하지 않는지 확인하려면 "/ Developer/Applications/Graphics Tools/OpenGL Profiler" – kvark

답변

0

: 나는 범인이 VAO과 잿물 수 있습니다 의심을 가지고있다. 또한 정점 위치 및 정점 색상 데이터에 별도의 버퍼 객체를 사용하고있었습니다. 하나의 GL_ARRAY_BUFFER 꼭지점 배열 개체에 바인딩 할 수 있습니다 믿습니다. 따라서 모든 데이터를 하나의 결합 된 버퍼에 넣은 다음 해당 버퍼에 대한 오프셋을 가진 특성 포인터를 설정하십시오.

귀하의 VBO/VAO 설정 같은 것을해야한다 : 당신의 -drawRect: 함수 내

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); 

다음을, 당신은 당신의 유니폼이 설정 한 프로그램을 사용하고 호출 할 수 있습니다 glDrawElements() :

glUseProgram(shaderProgramID); 

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

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

glBindVertexArray(0); 

glUseProgram(0); 

두 주목할 가치가있는 다른 항목 :

  1. 나는 모든 버퍼 초기화를 제안한다. 당신의 -drawRect: 메쏘드는 뷰가 다시 그릴 때마다 호출 될 것이기 때문에. 즉, 모든 데이터를 OpenGL 서버에 모두 -drawRect:에 다시 복사한다는 의미입니다.
  2. 최신 버전의 osx를 사용하는 경우 최신 버전의 OpenGL (OpenGL/gl3.h) 사용을 고려해야합니다.