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

3

我在著名的http://learnopengl.com学习OpenGL已经几周了,现在有一个关于组织多个材料(着色器)的问题。 在这个教程中,使用Shader类从vert/frag着色器列表中组合着色器程序:

Shader shader("vert.glsl", "frag.glsl");

然后,对于着色器,我创建了uniform变量:

    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("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));

但是阴影效果没有正确显示。每个着色器都需要声明相同的uniform变量,这使得程序不正确。应该如何正确处理?谢谢您并对我愚蠢的问题表示抱歉。:)

1个回答

6
当然这样不行。调用glUniform*函数会改变当前绑定程序的uniform状态。因此,它会影响最近传递给glUseProgram的程序。
如果你想修改另一个程序的uniform,你需要切换到另一个程序或者可以使用glProgramUniform*函数。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接