jav*_*uez 2 c++ opengl shader vertex-shader fragment-shader
几个星期以来,我在著名的http://learnopengl.com上学习OpenGL,并且对组织多种材料(着色器)有疑问。在本教程中,将使用Shader类,该类将从vert / frag着色器列表中构成Shader程序:
Shader shader("vert.glsl", "frag.glsl");
Run Code Online (Sandbox Code Playgroud)
之后,为着色器创建制服:
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.
Run Code Online (Sandbox Code Playgroud)
最后,我们收到一个Shader程序。在这种情况下,如何制作多个着色器?我尝试使:
Shader shader("vertDiff.glsl", "fragDiff.glsl");
Shader shaderGlass ("vertGlass.glsl", "fragGlass.glsl");
Shader shaderLight("vertLight.glsl", "fragLight.glsl")
Run Code Online (Sandbox Code Playgroud)
之后,我为每个着色器制作.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));
Run Code Online (Sandbox Code Playgroud)
但是阴影无法正常工作。每个着色器需要声明几次相同的制服,这会使程序不正确。如何正确制作这部分?谢谢你,很抱歉我的愚蠢问题。
当然那行不通。该glUniform*呼叫改变当前绑定的程序的均匀状态。因此,无论glUseProgram最近传递给什么程序。
如果要在另一个程序中修改制服,则必须切换到另一个程序。或使用glProgramUniform*。