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