web-dev-qa-db-ja.com

glUseProgram(0)は何をしますか?

glUseProgramのOpenGLドキュメントzeroの引数を指定して呼び出すと、シェーダーの結果が発生すると主張しています実行はundefinedになります。

ただし、少し検索した後、glUseProgramを使用して現在のシェーダープログラムをuninstallする人々の例をいくつか見てきました。

この動作は信頼できますか?そうでない場合、glUseProgram(0)は正確に何をしますか?

18
user11171

glUseProgramは、指定されたプログラムオブジェクトが、プログラム(glUniform、レンダリングコマンドなど)を使用するものに使用される現在のプログラムであることを意味します。 0は、OpenGLオブジェクトのNULLによく似ています。 not an object(ほとんどのオブジェクト)を表します。したがって、glUseProgramは、noプログラムが最新であることを意味します。したがって、プログラムを使用するものにはプログラムは使用されません。

現在のプログラムがないときにglUniform関数を呼び出そうとすると、エラーで失敗します。現在のプログラムがないときにレンダリングしようとすると、次の2つのいずれかが発生します。

  • OpenGL 3.1+、コアプロファイルでは、コアOpenGLmustレンダリングが必要なため、GL_INVALID_OPERATIONエラーが発生します。プログラム。
  • 互換性プロファイルまたはバージョン3.0以下では、固定機能のレンダリングが行われます。
22
Nicol Bolas

ここや他の場所での多くの回答とは異なり、glUseProgram(0)は安全ではありません。これを使用して、レンダリング状態を無効なプログラムオブジェクトに設定できますが、レンダリングが発生したときにまだこれにバインドされている場合、動作はundefinedです。

これは、誤って間違ったプログラムを使用することを避けるのに役立つ場合がありますが、「固定機能モードを使用する」という意味で使用しないでください。ほとんどの場合、これが発生しますが、仕様で定義されていないため、信頼するべきではありません。

doc から:

「プログラムがゼロの場合、現在のレンダリング状態は無効なプログラムオブジェクトを参照しており、シェーダー実行の結果はundefinedです。」

したがって、結果はOS、ドライバー、およびグラフィックカードに完全に固有です。多くの場合、固定機能モードに戻っているように見えます。ただし、最後のシェーダーを簡単に保持したり、ガベージをレンダリングしたり、セグメンテーション違反を引き起こしたりする可能性があります(これが発生するのを確認しました)。

3
SystemParadox

OpenGLに固定機能パイプラインを使用するように指示します。

2
Aaron

glUseProgram(myShader)を使用すると、それ以降のすべてのレンダリングは、シェーダーID myShaderを使用して実行されます。

_modern openGL 3.1+_に重要な変更があるたびにこれを呼び出す場合、glUseProgram(0)はほとんど使用されません。

ただし、glVertex3f(..)などの固定関数レンダリングをそこに統合することを計画している場合、glUseProgram(0)は、最後に使用されたシェーダーがアクティブでなくなったことを確認し、 glColor3f(...)のような固定関数パイプライン

0
neo_glMatrix