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 に答える