2012-09-14 2 views
3

WaveFront .obj Loader에서 작업하고 있는데 첫 번째 목표는 다음 .obj 파일에서로드 된 모든 정점과 인덱스를 얻는 것입니다. (곡선 모서리가있는 큐브를 표시합니다).WaveFront .obj 로더가 (VBO & VAO)와 같이 객체를 표시하지 않습니다.

# Blender v2.62 (sub 0) OBJ File: 'Cube.blend' 
# www.blender.org 
o Cube 
v 0.900000 -1.000000 -0.900000 
v 0.900000 -1.000000 0.900000 
v -0.900000 -1.000000 0.900000 
v -0.900000 -1.000000 -0.900000 
v 0.900000 1.000000 -0.900000 
v 0.899999 1.000000 0.900001 
v -0.900000 1.000000 0.900000 
v -0.900000 1.000000 -0.900000 
v 1.000000 -0.900000 -1.000000 
v 1.000000 -0.900000 1.000000 
v -1.000000 -0.900000 1.000000 
v -1.000000 -0.900000 -1.000000 
v 1.000000 0.905000 -0.999999 
v 0.999999 0.905000 1.000001 
v -1.000000 0.905000 1.000000 
v -1.000000 0.905000 -1.000000 
f 1//1 2//1 3//1 
f 1//1 3//1 4//1 
f 13//2 9//2 12//2 
f 13//2 12//2 16//2 
f 5//3 13//3 16//3 
f 5//3 16//3 8//3 
f 15//4 7//4 8//4 
f 15//5 8//5 16//5 
f 11//6 15//6 16//6 
f 11//6 16//6 12//6 
f 14//7 6//7 7//7 
f 14//7 7//7 15//7 
f 10//8 14//8 11//8 
f 14//8 15//8 11//8 
f 13//9 5//9 6//9 
f 13//9 6//9 14//9 
f 9//10 13//10 10//10 
f 13//11 14//11 10//11 
f 9//12 1//12 4//12 
f 9//12 4//12 12//12 
f 3//13 11//13 12//13 
f 3//14 12//14 4//14 
f 2//15 10//15 11//15 
f 2//15 11//15 3//15 
f 1//16 9//16 10//16 
f 1//16 10//16 2//16 
f 5//17 8//17 7//17 
f 5//17 7//17 6//17 

나는 모든 정점을로드 한 및 verticesVec 및 indicesVec 및 I라는 두 벡터의 인덱스가 둘 (그들이 올바른 순서로 모든 입력을 체크 한, verticesVec [0] = 0.9 indicesVec [0] = 1). VertexBufferObject의 정점과 VerticArrayObject의 인덱스를 셰이더 필드 설정과 함께로드합니다.

그러나 큐브를 렌더링 할 때 올바르지 않은 다음 이미지가 표시됩니다. 모든 코드를 다시 확인했지만 잘못된 부분을 찾을 수 없습니다. 벡터 및 벡터의 크기 (바이트)와 관련이 있습니까?

wrong cube http://imageshack.us/a/img850/6249/wrongcube.png

다음 코드는 내 그리기에서/모든 렌더링을 수행하는 방법을 렌더링합니다.

glUseProgram(theProgram); 
    GLuint modelToCameraMatrixUnif = glGetUniformLocation(theProgram, "modelToCameraMatrix"); 
    GLuint perspectiveMatrixUnif = glGetUniformLocation(theProgram, "cameraToClipMatrix"); 
    glUniformMatrix4fv(perspectiveMatrixUnif, 1, GL_FALSE, glm::value_ptr(cameraToClipMatrix)); 

    glm::mat4 identity(1.0f); 
    glutil::MatrixStack stack(identity); // Load identity Matrix 

    // Push for Camera Stuff 
    glutil::PushStack camera(stack); 
    stack.Translate(glm::vec3(camX, camY, camZ)); 

    //Push one step further to fix object 1 
    glutil::PushStack push(stack); 

    stack.Translate(glm::vec3(0.0f, 0.0f, 3.0f)); 
    // Draw Blender object 
    glBindVertexArray(this->load.vertexArrayOBject); 
    glUniformMatrix4fv(modelToCameraMatrixUnif, 1, GL_FALSE, glm::value_ptr(stack.Top())); 
    glDrawElements(GL_TRIANGLES, this->load.indicesVec.size(), GL_UNSIGNED_SHORT, 0); 

    // Pop camera (call destructor to de-initialize all dynamic memory) 
    camera.~PushStack(); 

    // Now reset all buffers/programs 
    glBindVertexArray(0); 
    glUseProgram(0); 

그리고 내 .OBJ 로더에서 버퍼 오브젝트의 초기화 :

void Loader::generateVertexBufferObjects() 
{ 
    // Fils the vertex buffer object with data 
    glGenBuffers(1, &vertexBufferObject); 
    glBindBuffer(GL_ARRAY_BUFFER, vertexBufferObject); 
    glBufferData(GL_ARRAY_BUFFER, verticesVec.size() * 4, &verticesVec[0], GL_STATIC_DRAW); 
    glBindBuffer(GL_ARRAY_BUFFER, 0); 


    // Fills the index buffer object with its data 
    glGenBuffers(1, &indexBufferObject); 
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indexBufferObject); 
    glBufferData(GL_ELEMENT_ARRAY_BUFFER, indicesVec.size() * 4, &indicesVec[0], GL_STATIC_DRAW); 
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); 
} 

void Loader::generateVertexArrayObjects() 
{ 
    glGenVertexArrays(1, &vertexArrayOBject); 
    glBindVertexArray(vertexArrayOBject); 

    glBindBuffer(GL_ARRAY_BUFFER, vertexBufferObject); 
    glEnableVertexAttribArray(0); 
    glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, 0); 
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indexBufferObject); 

    glBindVertexArray(0); 
} 
+4

색인을 확인하십시오. obj의 인덱스는 1부터 시작하지만 OpenGL에서는 0부터 시작하므로 모든 인덱스에서 하나를 뺍니다. –

+0

@VaughnCato : 좋습니다! 결코 그것에 대해 생각하지 않았습니다. 나는 색인을 추가했다. 벡터에 추가하기 전에는 불행히도 여전히 지저분한 큐브이므로 인덱스들보다 더 잘못된 것이 있습니다. ( –

+1

인덱스는 정말 단락이 있습니까? 값 당 4 바이트를 할당했지만 OpenGL에게 서명되지 않은 short라고 말했습니다. – Tim

답변

3

당신은 부호의 int와 같은 인덱스를 만드는,하지만 당신은 그들이 형 GL_UNSIGNED_SHORT의 것을 OpenGL과 통과하고 있습니다. glDrawElements의 type 인수는 인덱스 버퍼에 업로드 된 데이터 유형과 일치해야합니다.

+0

이것은 답입니다; 예제 그림에서 양의 꼭지점 렌더링을 실제로 볼 수 있습니다. – Krythic

관련 문제