OpenGLのドキュメントでglUseProgram
は、引数をゼロにして呼び出すと、シェーダーの実行結果が。になると主張していますundefined
。
ただし、少し検索した後、現在のシェーダープログラムをアンインストールglUseProgram
するために使用している人々の例をいくつか見ました。
この動作は信頼できますか?そうでない場合、正確には何をしglUseProgram(0)
ますか?
OpenGLのドキュメントでglUseProgram
は、引数をゼロにして呼び出すと、シェーダーの実行結果が。になると主張していますundefined
。
ただし、少し検索した後、現在のシェーダープログラムをアンインストールglUseProgram
するために使用している人々の例をいくつか見ました。
この動作は信頼できますか?そうでない場合、正確には何をしglUseProgram(0)
ますか?
glUseProgram
glUniform
指定されたプログラムオブジェクトが、プログラム( 、レンダリングコマンドなど)を使用するものに使用される現在のプログラムであることを意味します。0はNULL
OpenGLオブジェクトによく似ています。これはオブジェクトではありません(ほとんどのオブジェクトの場合)。したがって、現在のプログラムがないglUseProgram(0)
ことを意味します。したがって、プログラムを使用するものにプログラムが使用されることはありません。
glUniform
現在のプログラムがないときに関数を呼び出そうとすると、エラーで失敗します。現在のプログラムがないときにレンダリングしようとすると、次の2つのいずれかが発生します。OpenGL 3.1以降のコアプロファイルでは、コアOpenGLはプログラムでレンダリングする必要があるため、未定義の動作が発生します。互換性プロファイルまたはバージョン3.0以下では、固定機能のレンダリングが提供されます。
ここや他の場所での多くの回答とは異なり、固定機能モードには戻りglUseProgram(0)
ません。このように使用するのは安全ではありません。これを使用して、レンダリング状態を無効なプログラムオブジェクトに設定できますが、レンダリングが発生したときにまだこれにバインドされている場合、動作は未定義です。
ドキュメントから:
「プログラムがゼロの場合、現在のレンダリング状態は無効なプログラムオブジェクトを参照しており、シェーダーの実行結果は次のようになります
undefined
。」
したがって、結果はOS、ドライバー、およびグラフィックカードに完全に固有です。多くの場合、固定機能モードに戻っているように見えますが、これは仕様で定義されていないため、信頼するべきではありません。最後のシェーダーを簡単に保持したり、ガベージをレンダリングしたり、セグメンテーション違反を引き起こしたりする可能性があります(これが発生するのを見たことがあります)。
固定機能パイプラインを使用するようにOpenGLに指示します。
使用glUseProgram(myShader)
すると、以降のすべてのレンダリングはシェーダーIDを使用して実行されますmyShader
。
に重要な変更があるたびにこれを呼び出す場合、のmodern openGL 3.1+
使用はほとんどありませんglUseProgram(0)
。
glVertex3f(..)
ただし、のように固定関数のレンダリングをそこに統合することを計画している場合はglUseProgram(0)
、最後に使用したシェーダーがアクティブでなくなったことを確認し、のように固定関数のパイプラインを使用します。glColor3f(...)