【问题标题】:How does glGetUniformBlockIndex know whether to look in the vertex shader or the fragment shader?glGetUniformBlockIndex 如何知道是查看顶点着色器还是片段着色器?
【发布时间】:2012-04-04 23:28:31
【问题描述】:

我首先将两个着色器附加到我的程序,然后调用glGetUniformBlockIndex 来绑定统一缓冲区。我希望glBindShader 函数可以让我指定要解析哪个着色器以找到制服,但没有这样的事情。 如何告诉 OpenGL 它应该查看哪个着色器?

【问题讨论】:

  • "我首先将两个着色器附加到我的程序,然后调用 glGetUniformBlockIndex 来绑定统一缓冲区" 您需要在这些步骤之间成功调用glLinkProgram
  • 我刚刚确认glLinkProgram是在着色器编译和调用glGetUniformBlockIndex之间进行的。它成功了。

标签: opengl glsl shader uniform


【解决方案1】:

假设程序已经完全链接,没关系。以下是glGetUniformBlockIndex 的可能性及其后果:

  • 给定的统一块名称不在任何着色器中。然后你回GL_INVALID_INDEX
  • 给定的统一块名称用于其中一个着色器。然后你取回它的块索引,用于glUniformBlockBinding
  • 给定的统一块名称用于多个着色器。然后你会取回表示所有的块索引,用于glUniformBlockBinding

最后一部分是关键。如果您在两个着色器中指定同名的统一块,则 GLSL 要求这些统一块的定义相同。如果不是,那么您会在glLinkProgram 中收到错误消息。由于它们是相同的(否则你不会到这里),GLSL 认为它们是 same 统一块。

即使它们处于两个着色器阶段,它们仍然是同一个统一块。因此,您可以在阶段之间共享统一的块,所有这些都具有一个块绑定。只要它确实是相同的统一块。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-05-24
    • 1970-01-01
    • 2019-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多