首页 文章

OpenGL绘图网格不正确

提问于
浏览
0

我正在尝试用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(它's pretty crude and isn'吨有组织,但应该仍然有效)

1 回答

  • 0

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

相关问题