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 吗?也许当程序关闭时?

另外,这样可以吗?由于其他人都启用和禁用每一帧,我是否缺少一些东西?

4

2 回答 2

6

一旦你设置了一些 OpenGL 状态,它就会保持设置状态。您无需在每次绘制时都设置它。

尽可能少地手动设置状态可能容易出错——这可能是很多人不这样做的原因。

于 2012-10-07T21:34:35.177 回答
5

好的性能和好的例子不一定是一回事。存在示例代码来向您展示如何做某事,以清楚地解释事情是如何工作的。好的示例向您展示了如何最大限度地减少代码中出现错误的机会。等等。

性能通常来自于做“有风险”的事情,但既然你做的一切都是正确的,它就会奏效。

最好设置当时需要的任何状态(在合理范围内),并在完成后取消设置该状态。这将把事情搞砸的可能性降到最低。但这可能是以牺牲一些性能为代价的。

再说一次,对于简单的启用/禁用,它可能不会。虽然坦率地说,您从客户端内存而不是缓冲区对象中提取顶点,并且您在glDrawRangeElements这样做时没有使用,这可能比一些额外的启用/禁用对性能的拖累更大。

简而言之:不用担心。

于 2012-10-07T21:39:46.857 回答