查看uniform_buffer_object规范,无法保证在多个着色器程序中以相同方式定义的某个统一块将具有glGetUniformBlockIndex()
返回的相同索引。这意味着每次切换着色器程序时,我都必须调用glBindBufferBase()
为UBO分配相关索引。
然而,从某些测试来看,似乎统一块 在不同的着色器程序中具有相同的索引,即使统一块以不同的顺序声明。
看看这两个顶点着色器:one,two。 (注意我使用v1
,v2
等的值来避免非活动的统一消除)
查询这样的索引时:
std::cout << glGetUniformBlockIndex(prog1, "var1") << "\n";
std::cout << glGetUniformBlockIndex(prog2, "var1") << "\n";
我得到相同的索引值。查询"var2"
,"var3"
等时,我得到的结果相同。
这是打算吗?为什么会这样?我可以依靠这种情况发生吗?
答案 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;
};