gpt4 book ai didi

opengl - glUniformBlockBinding 是做什么用的?

转载 作者:行者123 更新时间:2023-12-04 14:13:06 26 4
gpt4 key购买 nike

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

绑定(bind) UniformBuffer 显然足以将 UniformBuffer 绑定(bind)到 block :

glUseProgram(program);
glBindBuffer(GL_UNIFORM_BUFFER, buffer);
glBindBufferBase(GL_UNIFORM_BUFFER, 0, buffer);

我只需要使用 glUniformBlockBinding当我将缓冲区绑定(bind)到不同于着色器程序中使用的索引时。
//...
glBindBufferBase(GL_UNIFORM_BUFFER, 1, buffer)
glUniformBlockBinding(program, 0, 1); // bind uniform block 1 to index 0

我理解对了吗?我只需要使用 glUniformBlockBinding如果我在适当的 block 具有不同索引的不同程序中使用缓冲区?

最佳答案

每个程序的事件统一 block 索引与全局绑定(bind)位置不同。
这里的总体思路是,假设您使用正确的布局,您可以将统一缓冲区绑定(bind)到 GL 中的一个位置,并在多个 GLSL 程序中使用它。但是每个程序的单独缓冲区 block 索引和GL的全局绑定(bind)点之间的映射需要通过这个命令来建立。
为了正确看待这一点,请考虑采样员制服。
采样器具有与任何其他制服相同的统一位置,但该位置实际上并没有说明采样器使用的纹理图像单元。你仍然将你的纹理绑定(bind)到 GL_TEXTURE7例如,而不是采样器制服的位置。
在这方面,采样器和统一缓冲区之间的唯一概念区别是您不使用 glUniform1i (...) 分配绑定(bind)位置。设置索引。有一个特殊的命令可以对统一缓冲区执行此操作。

从 GLSL 4.20 开始(由 GL_ARB_shading_language_420pack 追溯应用),您还可以从着色器中显式建立统一 block 的绑定(bind)位置。
GLSL 4.20(或适当的扩展)允许您编写以下内容:

layout (std140, binding = 0) uniform MyUniformBlock
{
vec4 foo;
vec4 bar;
};
这样一来,您就不必确定 MyUniformBlock 的统一 block 索引。 ;此 block 将绑定(bind)到 0 在链接时。

关于opengl - glUniformBlockBinding 是做什么用的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23203095/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com