簡體   English   中英

OpenGL中即時模式的性能問題

[英]Performance issue with immediate mode in OpenGL

這段即時代碼如何轉換為VBO?

我的代碼存在性能問題,我需要幫助,通過使用VBO而不是即時模式來使其更快。 有人可以告訴我如何將其轉換為VBO以提高性能嗎?

此代碼在主循環中執行, while(true)代碼的while(true)繪制一系列正方形,這些正方形可以更改其顏色以表示稱為cmp的矩陣。 cmp矩陣表示來自蛇類游戲的字段,該字段可能具有NADA(無),Snake,Apple或MURO(牆),並且根據矩陣的值,它會在開關上更改顏色。

我是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();
    }
}

你應該采取的教程就這更好的。 無論如何,使用VBO實現的目標是一次僅使用一個opengl調用而不是調用很多glVertex一次上傳所有幾何。

如果幾何圖形不斷變化,則可以選擇在每幀上更新GPU上的所有幾何圖形,這肯定比在每幀上進行所有這些調用更快。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM