2017-09-21 7 views
0

私は現在、OpenGL(セパラブルシェーダステージ)のシェーダパイプラインオブジェクトと、より古いスタイルのシングルプログラムglUseProgram()を使用しています。最初glUseProgramPipelineを呼び出す前にglUseProgram(0)を設定せずにOpenGLバインディングシェーダのステージとプログラムの混乱

glUseProgram(6); // Render using the single program 
glBindProgramPipeline(pipeline_ID); 
glUseProgramStages(pipeline_ID, GL_VERTEX_SHADER_BIT, shaderID); 
glUseProgramStages(pipeline_ID, GL_FRAGMENT_SHADER_BIT, shaderID); 

If there is a current program object established by `glUseProgram`, 
the bound program pipeline object has no effect on rendering or uniform updates. 

私が行うことができるように思われるので、これは私に混乱して:私は、ドキュメントにそれが言う、思ったんだけど。私が思ったドキュメンテーションは、それがうまくいかないことを暗示していましたが、私はこのようにうまく表現できます。 glBindProgramPipelineを呼び出す前にglUseProgram(0)を設定する必要がありますか?

+0

@BDLああ、私はそれを理解していなかった。うまくいけば誰かが明らかにすることができます。 – Zebrafish

答えて

2

は、あなたが「レンダリング」または「均一のアップデート」を扱うことが示されているコードで

何をレンダリングしていないか、均一なアップデートには影響を与えません。 glUniformに電話をかけると、プログラムオブジェクト6に行きます。パイプライン内のものではありません(6がパイプラインに存在しない限り)。レンダリングすると、プログラムオブジェクト6内のシェーダーを使用します(パイプライン内に6がない限り、再びパイプライン内のシェーダーは使用しません)。

プログラムが使用されている限り、パイプラインはレンダリングに影響しません。

glUseProgramStagesは、コンテキストにバインドされているため、pipeline_IDには影響しません。それはパラメーターとして渡すので、パイプラインに影響します。最初に縛る必要はありませんでした。実際、パイプラインをバインドする唯一の理由は、にレンダリングすることです。;すべての状態設定関数はDSAスタイルを使用します。

+0

シェーダステージを取り付ける前にバインディングパイプラインが不要なので、シェイダープログラム6がバインドされていて、フラグメントと頂点シェーダーをパイプラインに接続すると、次の呼び出しでシェーダープログラム6が使用されます。まず、パイプラインをバインドする必要があります。しかし、私のオリジナルの質問では、私のパイプラインをバインドする前にglUseProgramを(0)に設定する必要がありますか?私は推測していない。 – Zebrafish

+0

@Zebrafish:あなたの質問は、 "ポインタ変数' B'を設定する前にポインタ変数 'A'をNULLに設定する必要がありますか? –

+0

私はちょうどいくつかのものをテストしています。シェーダパイプラインをバインドするのは本当に遅いですが、シェーダステージを取り付けることはほとんど無視できます。パイプラインをバインドすることで、たとえばテクスチャスイッチやVBOをバインドするよりもシステムが遅くなるようです。奇妙な。 – Zebrafish