配列データをレンダリングするために私が遭遇したすべての例は、次のコードに似ています。このコードでは、描画ループで最初に使用するものに対して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を呼び出す必要がありますか。おそらくプログラムが閉じられたとき?
また、このようにしても大丈夫ですか?他のみんなが各フレームを有効または無効にしているので、私が見逃しているものはありますか?