【发布时间】:2022-01-14 05:41:51
【问题描述】:
我在一个结构中有一组相关的变量,每个结构成员都是基本类型。我声明了该结构类型的制服,并希望在我的着色器中使用foo.a、foo.b 等。
struct Foo {
vec3 a;
vec4 b;
bool c;
mat3 d;
uint e;
};
layout(location = 1001) uniform Foo foo;
文档说foo 占用了 5 个统一位置,所以我假设我可以像这样简单地设置统一值?
unsigned int e = 1;
glUniform1i(1005, e); // e corresponds to uniform location 1005
// do sth with foo.e
我的问题是,我必须在这里明确查询统一位置吗?我需要担心内存布局和填充问题吗?我使用结构的目的是以更简洁的方式对这些变量进行分组,但我不想显式查询统一位置。
我知道如果变量对所有着色器程序都是全局的,那么使用具有std140 布局的统一缓冲区对象会更容易。不过,由于 UBO 在 OpenGL 中非常珍贵,我不想在这里浪费它,我宁愿保留 UBO 用于照明输入。是否可以只使用原始统一结构? (我的意思是 precious 我的意思是,与宽松的制服相比,可用的 UBO 数量相对较少,显卡通常最多只能支持 15 或 16 个 UBO)
【问题讨论】:
-
统一位置依次递增
-
“我必须在这里明确地查询统一位置吗?”允许您使用
layout(location)的全部意义是这样您不必必须这样做。 “因为 UBO 在 OpenGL 中非常珍贵” “珍贵”是什么意思?大多数硬件每个阶段提供 14 个 UBO 绑定点。如果你使用了其中的一半,你可能正在做一些病态的事情。 -
"我可以简单地设置统一值" 不,这是一个
uint变量,所以你必须匹配gl(Program)Uniform1ui。 -
@NicolBolas 感谢您指出这一点。这确实是病态的,因为我意识到我对 UBO 的使用效率非常低,例如,我应该将所有点光源分组到一个 UBO 中,而不是为每个光源使用一个 UBO……这将改变这一点