假设我有一个带有UniformBlock的着色器程序,索引为0
。
绑定UniformBuffer,显然足以将UniformBuffer绑定到块:
glUseProgram(program);
glBindBuffer(GL_UNIFORM_BUFFER, buffer);
glBindBufferBase(GL_UNIFORM_BUFFER, 0, buffer);
当我将缓冲区绑定到与着色器程序中使用的索引不同的索引时,我只需要使用glUniformBlockBinding
。
//...
glBindBufferBase(GL_UNIFORM_BUFFER, 1, buffer)
glUniformBlockBinding(program, 0, 1); // bind uniform block 1 to index 0
我明白了吗?如果我在不同的程序中使用缓冲区,相应的块具有不同的索引,我是否只需要使用glUniformBlockBinding
?
答案 0 :(得分:8)
这里的一般想法是假设您使用正确的布局,您可以将统一缓冲区绑定到GL中的一个位置,并在多个GLSL程序中使用它。但是,每个程序的各个缓冲区块索引和GL的全局绑定点之间的映射需要通过该命令建立。
采样器具有与任何其他制服相同的均匀位置,但该位置实际上没有说明采样器使用的纹理图像单元。例如,您仍然将纹理绑定到GL_TEXTURE7
,而不是采样器均匀的位置。
在这方面,采样器和统一缓冲区之间唯一的概念差异是您不使用glUniform1i (...)
分配绑定位置来设置索引。有一个特殊的命令可以为统一缓冲区执行此操作。
从GLSL 4.20开始(并由GL_ARB_shading_language_420pack
追溯应用),您还可以在着色器中明确地建立统一块的绑定位置。
layout (std140, binding = 0) uniform MyUniformBlock
{
vec4 foo;
vec4 bar;
};
通过这种方式,你永远不必确定 MyUniformBlock
的统一块索引;此块将在链接时绑定到 0 。