2017-02-21 14 views
0

私はC++およびGLSLでのOpenGL 4.5 410ユニフォームを設定する前にシェーダプログラムを「使用する」必要があるのはなぜですか?

を使用しています私が最初にglUseProgramとシェーダプログラムを使用せずに、シェーダプログラムの制服変数を設定しようとしたところ、私は最近、問題に出くわしました。私は、に添付されたinput_color(出力色を設定するvec4)という統一変数を​​持つフラグメントシェーダを持っていました。私はを実行してください私のメインドローループでglUseProgram(shader_program)を呼び出す必要があります何かを描画する前に。

// set uniforms 
GLint input_color = glGetUniformLocation(shader_program, "input_color"); 
glUniform4f(input_color, 0.5f, 0.3f, 0.2f, 1.0f); 

このプログラムで描かれた三角形はすべて黒で、私が期待していた結果ではありませんでした。いくつかの実験の後、私はその制服を設定する前にプログラムを使用する必要があることを認識しました。

// set uniforms 
glUseProgram(shader_program); // my change 
GLint input_color = glGetUniformLocation(shader_program, "input_color"); 
glUniform4f(input_color, 0.5f, 0.3f, 0.2f, 1.0f); 

正しい色の三角形が描かれます。

なぜ私はこのプログラムを最初に使用する必要がありますか? OpenGLはステートマシンとして動作しますが、このインスタンスでは現在のシェーダプログラムの状態はなぜ必要なのですか?結局のところ、のメモリインデックスを取得するために、shader_programインデックスをパラメータとして明示的にglGetUniformLocationに渡します。

私はこれがOpenGLの状態をよりよく理解し、GPU上のシェーダプログラムを表すメモリのブロックがどのように利用され、管理されているのかを知りたいと考えています。

+0

"* OpenGL 4.5 for C++とGLSL 410. *"なぜGLSL 4.10で4.5を使用していますか? GLSL 4.50を使用できませんか? –

+0

私が使っているガイドは少し古いので、彼らは4.10を指定しました。私は4.50を使い始めるでしょう。 – Rob

答えて

3

あなたはそうする必要はありません。 GL 4.1以上はglProgramUniform()を提供します。これは変更したいプログラムオブジェクトを取ります。

+0

ありがとうございます - このオプションが存在するかどうかはわかりませんでした。 'glUniform'は、' glProgramUniform'が異なるプログラムインデックスのためのパラメータを持っているのに対し、 'glUniform'は" in use "を見てメモリ上のプログラムを見つける方法しか知っていませんか? – Rob

+1

はい、それは、OpenGLが常に(歴史的に)持っていた "bind to use"または "bind to modify"アプローチの全体のポイントです。幸運なことに、OpenGLはオブジェクトから直接移動し始め、変更するオブジェクトを直接取る関数を利用しました。これは、OpenGL 4.5では 'ARB_direct_state_access'拡張の採用により完全に実現されています。 https://www.khronos.org/opengl/wiki/Direct_State_Accessも参照してください。 – peppe

関連する問題