使用openGL,C ++绘制/渲染的替代方法

时间:2015-04-20 22:52:25

标签: c++ opengl

我试图使用Pointer方法绘制对象,因为在我渲染的那一刻,当我有多个对象时,由于I' m循环顶点等我已经听说过使用指针方法可以加快处理速度并提高帧速率,因为它的加载速度更快。

这就是我现在使用的东西,如果游戏没有严重滞后,我就无法产生超过3个物体。

for (int j = 0; j < mesh->objectParts.size(); j++) {//loop through each object part
    glBindTexture(GL_TEXTURE_2D, textures[j]->getId());
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
    glBegin(GL_TRIANGLES);
    for (int i = 0; i < mesh->objectParts[j]->faces[0].size(); i++) {

        glTexCoord2fv(&mesh->textureCoords[mesh->objectParts[j]->faces[1][i]]->u);
        glNormal3fv(&mesh->normals[mesh->objectParts[j]->faces[2][i]]->x);
        glVertex3fv(&mesh->indexedVertices[mesh->objectParts[j]->faces[0][i]]->x);
    }
    glEnd();

这是尝试转换为指针方法

    glEnableClientState(GL_VERTEX_ARRAY);
    glEnableClientState(GL_NORMAL_ARRAY);
    glEnableClientState(GL_TEXTURE_COORD_ARRAY);


    for (int i = 0; i < mesh->objectParts.size(); i++) {//loop through the amount of parts
        glBindTexture(GL_TEXTURE_2D, textures[i]->getId());
        glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
        glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
        glVertexPointer(3, GL_FLOAT, 0, &mesh->indexedVertices[0]->x);
        glNormalPointer(GL_FLOAT, 0, &mesh->normals[0]->x);
        glTexCoordPointer(2, GL_FLOAT, 0, &mesh->textureCoords[0]->u);

        for (int j = 0; j < 3; j++) 
        glDrawElements(GL_TRIANGLES, mesh->objectParts[i]->faceCount(), GL_UNSIGNED_SHORT, &mesh->objectParts[i]->faces[j][0]);
    }


    glDisableClientState(GL_VERTEX_ARRAY);
    glDisableClientState(GL_NORMAL_ARRAY);
    glDisableClientState(GL_TEXTURE_COORD_ARRAY);

我不确定后者是如何工作的,而且在绘制任何对象之前崩溃肯定是不对的。

修改

我确实在我的旧帖子上尝试了答案

C++ .obj parser, issue with parsing, or drawing using OpenGL

我解析了索引列表,并在解析文件时存储了顶点,法线和纹理的所有数据。然后我直接将它们传递给指针方法并使用glDrawArrays进行绘制。然而,它使我的对象变形,它肯定不像工作渲染代码那样出现。

    glEnableClientState(GL_VERTEX_ARRAY);
    glEnableClientState(GL_NORMAL_ARRAY);
    glEnableClientState(GL_TEXTURE_COORD_ARRAY);

            glVertexPointer(3, GL_FLOAT, 0, &mesh->unindexedVertices[0]->x);
            glNormalPointer(GL_FLOAT, 0, &mesh->unindexedNormals[0]->x);
            glTexCoordPointer(2, GL_FLOAT, 0, &mesh->unindexedTextureCoords[0]->u);

            glDrawArrays(GL_TRIANGLES, 0, 3);
    glDisableClientState(GL_VERTEX_ARRAY);
    glDisableClientState(GL_NORMAL_ARRAY);
    glDisableClientState(GL_TEXTURE_COORD_ARRAY);

这是我删除索引列表后的绘制方式,结果如下: enter image description here

有人可以帮助我将顶级代码转换为底部代码吗?

1 个答案:

答案 0 :(得分:3)

更改为指针方法可能不会有太多帮助,因为这里最大的问题是你每帧发送顶点数据。

如果你的网格是静态的,你可以使用VBO和VAO:你只需要将你的顶点数据发送到OpenGL实现一次并用它绘制你只需要绑定VAO你的网格,然后调用正确的绘制调用。这是&#34;现代&#34;方法。您可以在此处阅读更多内容:https://www.opengl.org/wiki/Vertex_Specification

如果您无法使用VBO,那么您可以尝试display lists