1

私は OpenGL ES の周りに単純な OOP ラッパーを書いています。render- と framebuffer を書きながら、それを操作するためにバッファをバインドする必要があります:

- (void) setupSomething
{
    …
    glBindRenderbufferOES(GL_RENDERBUFFER_OES, myBufferID);
    …
}

このセットアップ コードが、既に別のレンダー バッファーがバインドされているコンテキストで呼び出された場合はどうなるでしょうか。上記の私の単純なバージョンでは、現在のバッファを切り替えるという厄介な副作用があり、非常に脆弱に聞こえます。私はコードをもっと防御的に書くべきだと考えました:

- (void) setupSomething
{
    // Store current state
    GLint previousRenderBuffer = 0;
    glGetIntegerv(GL_RENDERBUFFER_BINDING_OES, &previousRenderBuffer);
    // Do whatever I want to do
    glBindRenderbufferOES(GL_RENDERBUFFER_OES, myBufferID);
    …
    // Restore previous state
    glBindRenderbufferOES(GL_RENDERBUFFER_OES, previousRenderBuffer);
}

私の質問は次のとおりです:このように前の状態を保存することは本当に必要/賢明/慣習glPushSomethingですか?

4

1 に答える 1

1

OpenGL のようなグラフィックス API を使用する場合、通常、API 呼び出しの数を最小限に抑えることをお勧めします。一部の呼び出しは非常に高価になる可能性があります- glBindRenderBuffer についてはわかりませんが、1つを保存するだけで安価になる可能性がありますint。しかし、それは複雑な状態切り替え操作である可能性があります。あなたはそれを自分で処理したほうがいいです-独自のバッファの「スタック」を使用するか(glPushAttribOpenGL ESのレンダーバッファにはこのようなものはありません)、または私の謙虚な意見では、これらの状況を回避することをお勧めします-常に作業を終了するようにしてください別のバッファに渡す前に、バインドしたバッファをレンダーします。

于 2013-01-15T17:13:08.147 に答える