假设我有一个在索引处带有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如果我使用缓冲区在适当的块具有不同索引的不同程序中,我是否只需要使用?
这里的一般想法是,假设您使用正确的布局,您可以将统一缓冲区绑定到GL中的一个位置,并在多个GLSL程序中使用它.但是,需要通过此命令建立每个程序的各个缓冲区块索引与GL的全局绑定点之间的映射.
采样器具有与任何其他制服相同的均匀位置,但该位置实际上没有说明采样器使用的纹理图像单元.您仍然可以将纹理绑定到GL_TEXTURE7例如而不是采样器均匀的位置.
在这方面,采样器和统一缓冲区之间唯一的概念差异是您不使用glUniform1i (...)设置索引来分配绑定位置.有一个特殊的命令可以为统一缓冲区执行此操作.
从GLSL 4.20开始(并追溯应用GL_ARB_shading_language_420pack),您还可以在着色器中明确地建立统一块的绑定位置.
layout (std140, binding = 0) uniform MyUniformBlock
{
vec4 foo;
vec4 bar;
};
Run Code Online (Sandbox Code Playgroud)
通过这种方式,你永远不必确定统一块索引MyUniformBlock; 此块将在链接时绑定为0.
| 归档时间: |
|
| 查看次数: |
2678 次 |
| 最近记录: |