私は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上のシェーダプログラムを表すメモリのブロックがどのように利用され、管理されているのかを知りたいと考えています。
"* OpenGL 4.5 for C++とGLSL 410. *"なぜGLSL 4.10で4.5を使用していますか? GLSL 4.50を使用できませんか? –
私が使っているガイドは少し古いので、彼らは4.10を指定しました。私は4.50を使い始めるでしょう。 – Rob