什么是glUniformBlockBinding用于?

时间:2014-04-21 18:09:18

标签: opengl

假设我有一个带有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

1 个答案:

答案 0 :(得分:8)

每个程序的活动统一块索引与全局绑定位置不同。

这里的一般想法是假设您使用正确的布局,您可以将统一缓冲区绑定到GL中的一个位置,并在多个GLSL程序中使用它。但是,每个程序的各个缓冲区块索引和GL的全局绑定点之间的映射需要通过该命令建立。

为了正确看待这一点,请考虑采样器制服。

采样器具有与任何其他制服相同的均匀位置,但该位置实际上没有说明采样器使用的纹理图像单元。例如,您仍然将纹理绑定到GL_TEXTURE7,而不是采样器均匀的位置。

在这方面,采样器和统一缓冲区之间唯一的概念差异是您不使用glUniform1i (...)分配绑定位置来设置索引。有一个特殊的命令可以为统一缓冲区执行此操作。


从GLSL 4.20开始(并由GL_ARB_shading_language_420pack追溯应用),您还可以在着色器中明确地建立统一块的绑定位置。

GLSL 4.20 (或适当的扩展名)允许您编写以下内容:

layout (std140, binding = 0) uniform MyUniformBlock
{
  vec4 foo;
  vec4 bar;
};

通过这种方式,你永远不必确定 MyUniformBlock 的统一块索引;此块将在链接时绑定到 0