1

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

4

1 回答 1

4

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

  • 给定的统一块名称不在任何着色器中。然后你回来GL_INVALID_INDEX
  • 给定的统一块名称用于其中一个着色器。然后你取回它的块索引,用于glUniformBlockBinding.
  • 给定的统一块名称用于多个着色器。然后你得到块索引,这意味着所有这些,要与glUniformBlockBinding.

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

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

于 2012-04-04T23:53:41.130 回答