假设我有一个索引处带有 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
如果我在不同的程序中使用缓冲区,其中适当的块具有不同的索引?
每个程序的活动统一块索引与全局绑定位置不同。
这里的总体想法是,假设您使用正确的布局,您可以将统一缓冲区绑定到 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在链接时。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)