如何将顶点缓冲区绑定到 Gfx-rs 中的统一数组?

How to bind a vertex buffer to a uniform array in Gfx-rs?

我正在尝试使用 gfx-rs 将 Uniform 的列表传递给顶点着色器。数据定义如下

gfx_defines! {
    vertex Vertex { ... }

    constant MyConst {
        valoo: i32 = "my_val",
    }

    pipeline pipe {
        my_const: gfx::ConstantBuffer<MyConst> = "my_const",
        vbuf: gfx::VertexBuffer<Vertex> = (),
        out: gfx::RenderTarget<ColorFormat> = "Target0",
    }
}

顶点着色器如下:

#version 150 core

struct MyConst
{
    uint my_val;
};

in vec2 a_Pos;
in vec3 a_Color;
uniform MyConst my_const[];
out vec4 v_Color;

void main() {
    MyConst cc = my_const[0];
    v_Color = vec4(a_Color, 1.0);
    gl_Position = vec4(a_Pos, 0.0, 1.0);
}

当我在 main() 中引入第一行时,应用程序崩溃并出现错误:

thread 'main' panicked at 'called `Result::unwrap()` on an `Err` value: DescriptorInit(GlobalConstant("my_const[0].my_val", None))'

Full code

How to bind a vertex buffer to a uniform array [...]

在 OpenGL 中,顶点缓冲区不能 "bound" 到统一数组。

顶点属性可以寻址命名的顶点缓冲区对象(存储在顶点数组对象的状态向量中),但制服不能。参见 Vertex Specification

如果您想将某种缓冲区绑定到某种制服,那么您必须使用自 OpenGL 3.1 和 GLSL 1.40 版本起可用的 Uniform Buffer Object

或者您可以使用 Shader Storage Buffer Object, where the last element of the buffer can be an array of variable size. SSBOs are available since OpenGL 4.3 (GLSL version 4.30) respectively by the extension ARB_shader_storage_buffer_object

例如:

layout(std430, binding = 0) buffer MyConst
{
    uint my_const[];
};

另见 Using Shader Storage Buffer Objects (SSBOs)