2012-09-14 31 views
3

我正在使用WaveFront .obj加載程序,我的第一個目標是獲取從以下.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和我在兩個矢量指數已經檢查過他們倆(他們以正確的順序所有的輸入,verticesVec [0] = 0.9和indicesVec [0] = 1)。我將VertexBufferObject中的頂點以及VerticArrayObject中的索引與着色器字段設置一起加載。

但是,當我渲染多維數據集時,我得到以下圖像不正確。我重新檢查了我所有的代碼,但是我找不到我要出錯的地方。它與向量和向量的字節大小有關嗎?

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

下面的代碼是從我繪製/ Render方法做所有的渲染。

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中它們從零開始,所以您可能不得不從所有索引中減去1。 –

+0

@VaughnCato:好的!從來沒有想過這個。我添加了一個索引 - ;在將其添加到矢量之前,但它仍然是一個凌亂的立方體,所以存在比索引更多的錯誤:(。 –

+1

您的索引真的很短嗎?您已經爲每個值分配了4個字節,但後來告訴OpenGL它們沒有簽名 – Tim

回答

3

您建立索引的無符號整數,但你傳遞到OpenGL,他們是類型GL_UNSIGNED_SHORT的。 glDrawElements的類型參數必須與上傳到索引緩衝區的數據類型相匹配。

+0

這是答案;您實際上可以在示例圖片中看到正頂點的渲染。 – Krythic