4

重複の可能性:
glDisableClientStateは必要ですか?

OpenGLでは、このパターンに従うこのコードを頻繁に見ました。

glUseProgram(prog_id);
// ... do some stuff
glUseProgram(0);

glUseProgram(0)シェーダープログラムの選択を解除することを理解しています。さて、私の質問は、シェーダープログラムの選択を解除するとはどういう意味ですか?

たとえば、レンダリングループでこのようなことを行う必要があるのはなぜですか?

while(render_loop_condition)
{
    glUseProgram(prog_id);
    // do some stuff
}
// various cleanup code
glUseProgram(0);

複数のシェーダープログラムを使用するレンダリングループでは、次のようなことができますか?

while(render_loop_condition)
{
    glUseProgram(prog_id1);
    // do some stuff
    glUseProgram(prog_id2);
    // do some other stuff
}
// various cleanup code
glUseProgram(0);
4

1 に答える 1

5

これは、後で描画されるものに対する意図しない副作用を回避するために使用されます。メソッド内でプログラムを切り替えることはまったく問題ありませんが(私の意見では望ましいです)、0メソッドの最後でデフォルトのプログラム()を選択します。そうすれば、そのメソッドを呼び出した後に奇妙な副作用が発生することはありません。

私が考えることができる副作用はそれほど多くありませんが、固定機能の方法で何かを描画している場合、最後にバインドしたプログラムで誤って描画してしまうと思います。

また、投稿したコードの2番目のブロックを使用して、最初のglUseProgram呼び出しをwhileループの外に移動して、同じプログラムが複数回バインドされるのを防ぐことができます。

于 2012-10-08T02:16:58.463 に答える