OpenGL中即时模式的性能问题

Performance issue with immediate mode in OpenGL

本文关键字:性能 问题 模式 OpenGL      更新时间:2023-10-16

如何将这段即时代码转换为vbo ?

我有性能问题与我的代码,我需要帮助,使其更快,通过使用VBO而不是直接模式。有人能告诉我如何将其转换为VBO以提高性能吗?

此代码在代码的主循环while(true)中执行,以绘制一系列正方形,这些正方形可以改变其颜色以表示称为cmp的矩阵。这个cmp矩阵代表一个来自蛇游戏的领域,可能有NADA(Nothing), snake, Apple或MURO(Wall),并且根据矩阵的值,它会在开关上改变颜色。

我是GLFW和Opengl的新手,所以我不知道如何使用vbo和高级图形技术。

完整的注释代码可以在这里找到。

for(it a=0;a<(camp.Getlar())/2;a++)//line of quadrant -+
{
    for(int b=0;b<(camp.Getalt())/2;b++)//column
    {
        glBegin(GL_POLYGON);
        switch (cmp[a][b])
        {
        case camp.NADA:
            glColor3f(0,0,0);
            break;
        case camp.SNAKE:
            glColor3f(0,0.85f,0.20f);
            break;
        case camp.APPLE:
            glColor3f(1.0f,0,0.1f);
            break;
        case camp.MURO:
            glColor3f(0.3f,0.3f,0.3f);
            break;
        }
        glVertex2f(-1.0f+a/(camp.Getlar()/2.0f),        1.0f-b/(camp.Getalt()/2.0f) );
        glVertex2f(-1.0f+a/(camp.Getlar()/2.0f),        1.0f-(1+b)/(camp.Getalt()/2.0f) );
        glVertex2f(-1.0f+((1+a)/(camp.Getlar()/2.0f)),  1.0f-(1+b)/(camp.Getalt()/2.0f));
        glVertex2f(-1.0f+((1+a)/(camp.Getlar()/2.0f)),  1.0f-b/(camp.Getalt()/2.0f ));
        glEnd();
    }
}

for(int a=0;a<(camp.Getlar())/2;a++)//line of quadrant ++
{
    for(int b=0;b<(camp.Getalt())/2;b++)//column
    {
        glBegin(GL_POLYGON);
        switch (cmp[a+camp.Getlar()/2][b])
        {
        case camp.NADA:
            glColor3f(0,0,0);
            break;
        case camp.SNAKE:
            glColor3f(0,0.85f,0.20f);
            break;
        case camp.APPLE:
            glColor3f(1.0f,0,0.1f);
            break;
        case camp.MURO:
            glColor3f(0.3f,0.3f,0.3f);
            break;
        }
        glVertex2f(a/(camp.Getlar()/2.0f),        1.0f-b/(camp.Getalt()/2.0f) );
        glVertex2f(a/(camp.Getlar()/2.0f),        1.0f-(1+b)/(camp.Getalt()/2.0f) );
        glVertex2f(((1+a)/(camp.Getlar()/2.0f)),  1.0f-(1+b)/(camp.Getalt()/2.0f));
        glVertex2f(((1+a)/(camp.Getlar()/2.0f)),  1.0f-b/(camp.Getalt()/2.0f) );
        glEnd();
    }
}
for(int a=0;a<(camp.Getlar())/2;a++)//line of quadrant +-
{
    for(int b=0;b<(camp.Getalt())/2;b++)//column
    { 
        glBegin(GL_POLYGON);
        switch (cmp[a+camp.Getlar()/2][b+camp.Getlar()/2])
        {
        case camp.NADA:
            glColor3f(0,0,0);
            break;
        case camp.SNAKE:
            glColor3f(0,0.85f,0.20f);
            break;
        case camp.APPLE:
            glColor3f(1.0f,0,0.1f);
            break;
        case camp.MURO:
            glColor3f(0.3f,0.3f,0.3f);
            break;
        }
        glVertex2f(a/(camp.Getlar()/2.0f),        -b/(camp.Getalt()/2.0f) );
        glVertex2f(a/(camp.Getlar()/2.0f),        -(1+b)/(camp.Getalt()/2.0f) );
        glVertex2f(((1+a)/(camp.Getlar()/2.0f)),  -(1+b)/(camp.Getalt()/2.0f));
        glVertex2f(((1+a)/(camp.Getlar()/2.0f)),  -b/(camp.Getalt()/2.0f ));
        glEnd();
    }
}
for(int a=0;a<(camp.Getlar())/2;a++)//line of quadrant --
{
    for(int b=0;b<(camp.Getalt())/2;b++)//column
    {    
        glBegin(GL_POLYGON);
        switch (cmp[a][b+camp.Getlar()/2])
        {
        case camp.NADA:
            glColor3f(0,0,0);
            break;
        case camp.SNAKE:
            glColor3f(0,0.85f,0.20f);
            break;
        case camp.APPLE:
            glColor3f(1.0f,0,0.1f);
            break;
        case camp.MURO:
            glColor3f(0.3f,0.3f,0.3f);
            break;
        }
        glVertex2f(-1.0f+a/(camp.Getlar()/2.0f),        -b/(camp.Getalt()/2.0f) );
        glVertex2f(-1.0f+a/(camp.Getlar()/2.0f),        -(1+b)/(camp.Getalt()/2.0f) );
        glVertex2f(-1.0f+((1+a)/(camp.Getlar()/2.0f)),  -(1+b)/(camp.Getalt()/2.0f));
        glVertex2f(-1.0f+((1+a)/(camp.Getlar()/2.0f)),  -b/(camp.Getalt()/2.0f ));
        glEnd();
    }
}

您应该更好地学习这方面的教程。无论如何,你用VBOs实现的是一次上传所有的几何图形,只使用一个opengl调用,而不是调用大量的glVertex

如果你的几何图形是不断变化的,选项是在每一帧上更新GPU的所有几何图形,这肯定会比在每一帧上进行所有这些调用快。