是否需要使用glDisableClientState?

4

我遇到的所有渲染数组数据的例子都类似于以下代码,在您的绘图循环中,您首先调用glEnableClientState来启用您将要使用的内容,完成后再调用glDisableClientState:

void drawScene(void) {
    glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
    glEnableClientState(GL_VERTEX_ARRAY);
    glEnableClientState(GL_TEXTURE_COORD_ARRAY);

    glBindTexture(GL_TEXTURE_2D, texturePointerA);
    glTexCoordPointer(2, GL_FLOAT, 0,textureCoordA);
    glVertexPointer(3, GL_FLOAT, 0, verticesA);
    glDrawElements(GL_QUADS, numPointsDrawnA, GL_UNSIGNED_BYTE, drawIndicesA);

    glBindTexture(GL_TEXTURE_2D, texturePointerB);
    glTexCoordPointer(2, GL_FLOAT, 0,textureCoordB);
    glVertexPointer(3, GL_FLOAT, 0, verticesB);
    glDrawElements(GL_QUADS, numPointsDrawnB, GL_UNSIGNED_BYTE, drawIndicesB);

    glDisableClientState(GL_TEXTURE_COORD_ARRAY);
    glDisableClientState(GL_VERTEX_ARRAY);
}

在我的程序中,我总是使用纹理坐标和顶点数组,所以我认为每帧都启用和禁用它们是毫无意义的。我将glEnableClientState移到了循环外面,像这样:

bool initGL(void) {
    //...
    glEnableClientState(GL_VERTEX_ARRAY);
    glEnableClientState(GL_TEXTURE_COORD_ARRAY);
}
void drawScene(void) {
    glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);

    glBindTexture(GL_TEXTURE_2D, texturePointerA);
    glTexCoordPointer(2, GL_FLOAT, 0,textureCoordA);
    glVertexPointer(3, GL_FLOAT, 0, verticesA);
    glDrawElements(GL_QUADS, numPointsDrawnA, GL_UNSIGNED_BYTE, drawIndicesA);

    glBindTexture(GL_TEXTURE_2D, texturePointerB);
    glTexCoordPointer(2, GL_FLOAT, 0,textureCoordB);
    glVertexPointer(3, GL_FLOAT, 0, verticesB);
    glDrawElements(GL_QUADS, numPointsDrawnB, GL_UNSIGNED_BYTE, drawIndicesB);
}

看起来运行正常。我的问题是:

我需要在某个地方调用glDisableClientState吗?也许在程序关闭时?

同时,这样做可以吗?是否有什么我错过的东西,因为其他人都会在每帧启用和禁用?

2个回答

6
一旦您设置了某些OpenGL状态,它将保持设置不变。您不需要每次绘制都重新设置它。
尽可能少地手动设置状态可能会出现错误 - 这可能是许多人不这样做的原因。

5
良好的性能和良好的示例并不一定是相同的。示例代码存在的目的是向您展示如何做某事,清楚地解释事物的工作原理。良好的示例向您展示如何最小化代码中出错的机会等。
性能通常来自于做“冒险”的事情,但由于您正在正确地做每件事情,所以它可以正常工作。
在合理范围内设置所需状态,并在完成后取消该状态是一个好习惯。这将最小化搞砸事情的机会。但这可能会牺牲一些性能。
再说了,对于简单的启用/禁用,可能并不会有影响。虽然说实话,从客户端内存中提取顶点而不是缓冲对象,并且没有使用glDrawRangeElements,在性能上可能比一些额外的启用/禁用更加拖累。
简而言之:不要担心它。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接