请帮忙。 我无法理解绘制图元的哪种方法更好?
glBegin()
...
glEnd()
or
glEnableClientState(GL_VERTEX_ARRAY);
...
glDisableClientState(GL_VERTEX_ARRAY);
在许多来源中,glEnableClientState/glDisableClientState
比glBegin/glEnd
更好,因为在第一种情况下函数调用的数量较小。
在实际情况glEnableClientState/glDisableClientState
和glBegin/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<TQACount; j++) //vertex array count
{
glBindTexture(GL_TEXTURE_2D, TQA[j].TextureId);
glBegin(GL_QUADS);
for(int k=0; k<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<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() << 2), GL_UNSIGNED_SHORT, Indicies);
}
glDisableClientState(GL_TEXTURE_COORD_ARRAY);
glDisableClientState(GL_VERTEX_ARRAY);
}