/ /複数のシェーダを使用する最良の方法 - c ++、OpenGL、シェーダ、フラグメントシェーダ、頂点シェーダ

複数のシェーダを使用する最良の方法 - c ++、OpenGL、シェーダ、フラグメントシェーダ、頂点シェーダ

数週間、私は有名な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*.