【问题标题】:Best way to use multiple shaders使用多个着色器的最佳方式
【发布时间】:2016-06-01 23:53:16
【问题描述】:

几周后,我在著名的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("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));

但是阴影不能正常工作。每个着色器需要多次声明相同的制服,这会使程序不正确。 如何正确制作这部分?谢谢你,对不起我的愚蠢问题。:)

【问题讨论】:

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


    【解决方案1】:

    这当然行不通。 glUniform* 调用更改当前绑定 程序的统一状态。因此,无论最近传递给glUseProgram 的程序是什么。

    如果你想在另一个程序中修改制服,你必须切换到另一个程序。或use glProgramUniform*

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-10-19
      • 2014-06-05
      • 2012-03-15
      • 2012-12-14
      • 1970-01-01
      • 1970-01-01
      • 2020-02-19
      • 1970-01-01
      相关资源
      最近更新 更多