2014-04-05 172 views
0

我試圖在C++中製作OpenGL引擎,但無法正確呈現網格。網格在渲染時會創建連接網格上兩個隨機點的面,或者使用0,0,0網格上的隨機點。這個問題可以在這裏看到:Corrupted Wireframe Rendering (我做了一個線框,看問題更清晰)OpenGL繪圖網格不正確

代碼:

// Render all meshes (Graphics.cpp) 
for(int curMesh = 0; curMesh < numMesh; curMesh++) { 
    // Save pointer of buffer 
    meshes[curMesh]->updatebuf(); 
    Buffer buffer = meshes[curMesh]->buffer; 

    // Update model matrix 
    glm::mat4 mvp = Proj*View*(meshes[curMesh]->model); 

    // Initialize vertex array 
    glBindBuffer(GL_ARRAY_BUFFER, vertbuffer); 
    glBufferData(GL_ARRAY_BUFFER, sizeof(GLfloat)*buffer.numcoords*3, meshes[curMesh]->verts, GL_STATIC_DRAW); 

    // Pass information to shader 
    GLuint posID = glGetAttribLocation(shader, "s_vPosition"); 
    glVertexAttribPointer(posID, 3, GL_FLOAT, GL_FALSE, 0, (void*)0); 
    glEnableVertexAttribArray(posID); 

    // Check if texture applicable 
    if(meshes[curMesh]->texID != NULL && meshes[curMesh]->uvs != NULL) { 
     // Initialize uv array 
     glBindBuffer(GL_ARRAY_BUFFER, uvbuffer); 
     glBufferData(GL_ARRAY_BUFFER, sizeof(GLfloat)*buffer.numcoords*2, meshes[curMesh]->uvs, GL_STATIC_DRAW); 

     // Pass information to shader 
     GLuint uvID = glGetAttribLocation(shader, "s_vUV"); 
     glVertexAttribPointer(uvID, 2, GL_FLOAT, GL_FALSE, 0, (void*)(0));   
     glEnableVertexAttribArray(uvID); 

     // Set mesh texture 
     glActiveTexture(GL_TEXTURE0); 
     glBindTexture(GL_TEXTURE_2D, meshes[curMesh]->texID); 
     GLuint texID = glGetUniformLocation(shader, "Sampler"); 
     glUniform1i(texID, 0); 
    } 

    // Actiavte shader 
    glUseProgram(shader); 

    // Set MVP matrix 
    GLuint mvpID = glGetUniformLocation(shader, "MVP"); 
    glUniformMatrix4fv(mvpID, 1, GL_FALSE, &mvp[0][0]); 

    // Draw verticies on screen 
    bool wireframe = true; 
    if(wireframe) 
     for(int i = 0; i < buffer.numcoords; i += 3) 
      glDrawArrays(GL_LINE_LOOP, i, 3); 
    else 
     glDrawArrays(GL_TRIANGLES, 0, buffer.numcoords); 
} 
// Mesh Class (Graphics.h) 
class mesh { 
public: 
    mesh(); 
    void updatebuf(); 
    Buffer buffer; 
    GLuint texID; 
    bool updated; 

    GLfloat* verts; 
    GLfloat* uvs; 

    glm::mat4 model; 
}; 

我的OBJ加載代碼是在這裏:https://www.dropbox.com/s/tdcpg4vok11lf9d/ObjReader.txt(這是相當粗糙和ISN」但仍應該工作)

+0

你可以發佈你的示例文件嗎?你在裝載程序中做了一些假設,這些假設可能會或可能不會被數據所尊重,但沒有數據很難說。 – DirkR

+0

@DirkR也許這可能是問題,這裏是我正在使用的teapot.obj文件:https://www.dropbox.com/s/z8fy46x3zeadg0s/teapot.obj.txt –

+0

嗯,好的,那一個是關於儘可能微不足道,應該有效。所以我的建議是放棄你自己的loader,並使用assimp(http://assimp.sourceforge.net/)來代替,它支持更多的格式並被廣泛使用。 – DirkR

回答

0

這看起來像一個原始的重新啓動問題給我。很難說沒有看到一些代碼就知道問題到底是什麼。這將有助於很多人看到約20行以上和以下,包括繪圖調用渲染茶壺。即在相應的glDrawArrays,glDrawElements或glBegin調用之前的20行以及之後的20行。

+0

我認爲這與重新啓動三角形有關,但OBJ文件中沒有任何內容表示頂點中斷點,所以如何知道新三角形列表何時開始? (我發佈代碼btw) –