OpenGL绘图网格不正确

时间:2014-04-05 15:46:15

标签: c++ opengl

我正在尝试用C ++制作OpenGL引擎,但无法正确渲染网格物体。渲染时,网格会创建连接网格上两个随机点的面,或者网格上的随机点(0,0,0)。这个问题可以在这里看到:Corrupted Wireframe Rendering (我做了一个线框来更清楚地看到问题)

代码:

// 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(它很粗糙,没有组织,但应该仍然有效)

2 个答案:

答案 0 :(得分:0)

这看起来像是一个原始的重启问题。没有看到一些代码很难说出究竟是什么问题。看到上面和下面的大约20行并包括绘图调用渲染茶壶会有很大帮助。即相应的glDrawArrays,glDrawElements或glBegin调用之前的20行和之后的20行。

答案 1 :(得分:0)

这是因为未连接三角形,因此线框看起来并不完美。 如果未连接三角形,则应构造索引缓冲区。