不同着色器中的统一块索引

时间:2015-11-13 13:32:54

标签: opengl glsl

查看uniform_buffer_object规范,无法保证在多个着色器程序中以相同方式定义的某个统一块将具有glGetUniformBlockIndex()返回的相同索引。这意味着每次切换着色器程序时,我都必须调用glBindBufferBase()为UBO分配相关索引。

然而,从某些测试来看,似乎统一块 在不同的着色器程序中具有相同的索引,即使统一块以不同的顺序声明。 看看这两个顶点着色器:onetwo。 (注意我使用v1v2等的值来避免非活动的统一消除)

查询这样的索引时:

std::cout << glGetUniformBlockIndex(prog1, "var1") << "\n";
std::cout << glGetUniformBlockIndex(prog2, "var1") << "\n";

我得到相同的索引值。查询"var2""var3"等时,我得到的结果相同。

这是打算吗?为什么会这样?我可以依靠这种情况发生吗?

1 个答案:

答案 0 :(得分:3)

获得索引后,您应该设置绑定点:

glUniformBlockBinding(prog1, glGetUniformBlockIndex(prog1, "var1"), 1);
glUniformBlockBinding(prog2, glGetUniformBlockIndex(prog2, "var1"), 1);

现在1是每个程序中var1的绑定点。

您还可以明确地在glsl中设置绑定:

layout(binding = 3) uniform MatrixBlock
{
  mat4 projection;
  mat4 modelview;
};