OpenGL绘制网格不正确

hjzp0vay  于 2022-11-04  发布在  其他
关注(0)|答案(3)|浏览(163)

我正在尝试用C++制作一个OpenGL引擎,但是无法正确渲染网格。网格在渲染时会创建连接网格上两个随机点的面,或者用0,0,0连接网格上的一个随机点。
问题可以在这里看到:

(我把它做成了线框,以便更清楚地看到问题)
编码:

// 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;
};

我的对象加载代码如下:https://www.dropbox.com/s/tdcpg4vok11lf9d/ObjReader.txt(它相当粗糙,没有组织,但应该仍然可以工作)

iih3973s

iih3973s1#

在我看来,这似乎是一个原始的重新启动问题。如果不查看一些代码,很难判断到底是什么问题。查看上下大约20行(包括绘制茶壶的绘制调用)会很有帮助。即,相应的glDrawArrays、glDrawElements或glBegin调用之前的20行和之后的20行。

2w2cym1i

2w2cym1i2#

从索引中减去1以供使用,因为这些是基于1的索引,而您几乎肯定需要基于0的索引。

brccelvz

brccelvz3#

这是因为你的三角形没有连接,线框看起来很完美。如果三角形没有连接,你应该构建索引缓冲区。

相关问题