OpenGL绘制基元

时间:2016-06-24 08:46:50

标签: c++ opengl draw primitive vertices

请帮忙。 我无法理解绘制图元的哪种方法更好?

glBegin()
...
glEnd()
or
glEnableClientState(GL_VERTEX_ARRAY);
...
glDisableClientState(GL_VERTEX_ARRAY);

在许多来源中,glEnableClientState/glDisableClientStateglBegin/glEnd更好,因为在第一种情况下函数调用的数量较小。 在实际情况glEnableClientState/glDisableClientStateglBegin/glEnd使用相同大小的内存,但glEnableClientState/glDisableClientState使用了更多的处理器时间。

在此示例中,仅绘制四边形,glEnableClientState/glDisableClientState显示的结果比glBegin/glEnd更差。也许我误会了什么?

以下代码路径:

struct stTexturedPoint
{
    float p[2];
    float t[2];
};
struct stTexturedQuad
{
    stTexturedPoint P[4];
};

struct stTexturedQuadArray
{
    vector<stTexturedQuad> TQ;
    unsigned int TextureId;
};

vector<stTexturedQuadArray> TQA;

void DrawTexturedQuad(stTexturedQuad TexturedQuad)
{
    glTexCoord2fv(TexturedQuad.P[0].t);
    glVertex2fv(TexturedQuad.P[0].p);
    glTexCoord2fv(TexturedQuad.P[1].t);
    glVertex2fv(TexturedQuad.P[1].p);
    glTexCoord2fv(TexturedQuad.P[2].t);
    glVertex2fv(TexturedQuad.P[2].p);
    glTexCoord2fv(TexturedQuad.P[3].t);
    glVertex2fv(TexturedQuad.P[3].p);
}

DrawAllMethod1()
{
    for(int j=0; j&lt;TQACount; j++) //vertex array count
    {
        glBindTexture(GL_TEXTURE_2D, TQA[j].TextureId);
        glBegin(GL_QUADS);
        for(int k=0; k&lt;TQA[j].TQ.size(); k++)
        {
            DrawTexturedQuad(TQA[j].TQ[k]);
        }
        glEnd();
    }
}

DrawAllMethod2()
{
    glEnableClientState(GL_VERTEX_ARRAY);
    glEnableClientState(GL_TEXTURE_COORD_ARRAY);
    for(int j=0; j&lt;TQACount; j++)
    {
        glVertexPointer(2, GL_FLOAT, sizeof(float) * 4, &TQA[j].TQ[0].P[0].p[0]);
        glTexCoordPointer(2, GL_FLOAT, sizeof(float) * 4, &TQA[j].TQ[0].P[0].t[0]);
        glBindTexture(GL_TEXTURE_2D, TQA[j].TextureId);
        glDrawElements(GL_QUADS, (TQA[j].TQ.size() &lt;&lt; 2), GL_UNSIGNED_SHORT, Indicies);
    }
    glDisableClientState(GL_TEXTURE_COORD_ARRAY);
    glDisableClientState(GL_VERTEX_ARRAY);
}

0 个答案:

没有答案