数週間、私は有名なOpenGLを学ぶ http://learnopengl.com 複数のマテリアル(シェイダー)を整理することについて質問があります。 このチュートリアルでは、シェイダープログラムを、vert / fragシェーダーのリストから作成するShaderクラスを使用しています。
Shader shader("vert.glsl", "frag.glsl");
その後シェイダーのために私は制服を作る:
glUniformMatrix4fv(glGetUniformLocation(shader.Program, "model"), 1, GL_FALSE, glm::value_ptr(model));
glUniformMatrix4fv(glGetUniformLocation(shader.Program, "view"), 1, GL_FALSE, glm::value_ptr(view));
etc.
最後に、Shaderプログラムが1つ提供されます。この場合、私は複数のシェーダを作ることができますか? 私はしようとする:
Shader shader("vertDiff.glsl", "fragDiff.glsl");
Shader shaderGlass ("vertGlass.glsl", "fragGlass.glsl");
Shader shaderLight("vertLight.glsl", "fragLight.glsl")
その後、各シェーダーの.glslの制服を作っています。
glUniformMatrix4fv(glGetUniformLocation(shader.Program, "model"), 1, GL_FALSE, glm::value_ptr(model));
glUniformMatrix4fv(glGetUniformLocation(shaderGlass.Program, "model"), 1, GL_FALSE, glm::value_ptr(model));
しかし、シェーディングは正しく機能しません。 シェイダーごとに同じユニフォームを数回宣言する必要があり、プログラムを間違えてしまいます。 この部分を正しく作るにはどうすればいいですか?ありがとう、私のばかげた質問を申し訳ありません:)
回答:
回答№1は4もちろん、それは動作しません。 glUniform*
コールによって 現在結ばれている プログラムの統一された状態。 glUseProgram
つい最近。
別のプログラムでユニフォームを変更したい場合は、別のプログラムに切り替える必要があります。または つかいます glProgramUniform*
.