【问题标题】:How to set a uniform struct in GLSL 4.6如何在 GLSL 4.6 中设置统一结构
【发布时间】:2022-01-14 05:41:51
【问题描述】:

我在一个结构中有一组相关的变量,每个结构成员都是基本类型。我声明了该结构类型的制服,并希望在我的着色器中使用foo.afoo.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……这将改变这一点

标签: opengl glsl


【解决方案1】:

对于结构,统一的位置是连续的和升序的。见4.4.3. Uniform Variable Layout Qualifiers

位置可以分配给默认块统一数组和结构。第一个最里面的标量、向量或矩阵成员或元素采用指定的位置,编译器为下一个最里面的成员或元素分配下一个增量位置值。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多