什么是glUniformBlockBinding用于?

App*_*ell 5 opengl

假设我有一个在索引处带有UniformBlock的着色器程序0.

绑定UniformBuffer以下显然足以将UniformBuffer绑定到块:

glUseProgram(program);
glBindBuffer(GL_UNIFORM_BUFFER, buffer);
glBindBufferBase(GL_UNIFORM_BUFFER, 0, buffer);
Run Code Online (Sandbox Code Playgroud)

glUniformBlockBinding当我将缓冲区绑定到与着色器程序中使用的索引不同的索引时,我只需要使用它.

//...
glBindBufferBase(GL_UNIFORM_BUFFER, 1, buffer)
glUniformBlockBinding(program, 0, 1); // bind uniform block 1 to index 0
Run Code Online (Sandbox Code Playgroud)

我明白了吗?glUniformBlockBinding如果我使用缓冲区在适当的块具有不同索引的不同程序中,我是否只需要使用?

And*_*man 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;
};
Run Code Online (Sandbox Code Playgroud)

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