使用多个着色器的最佳方法

时间:2016-06-01 23:53:17

标签: c++ opengl shader fragment-shader vertex-shader

几周后,我在着名的http://learnopengl.com上学习OpenGL,并对组织多种材质(着色器)提出疑问。 在本教程中使用Shader类,它从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程序。在这种情况下我如何制作多个着色器? 我试着做:

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 个答案:

答案 0 :(得分:5)

当然这不起作用。 glUniform*调用会更改当前绑定的程序的统一状态。所以无论最近哪个程序传递给glUseProgram

如果要在其他程序中修改制服,则必须切换到其他程序。或use glProgramUniform*