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

5

我正在尝试使用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))'

完整代码


为了使 Stack Overflow 成为一个有用的资源,可以超越您的存储库的上下文,请编辑您的问题,在问题本身中添加 [MRE],以及链接到您的存储库。 - Shepmaster
1个回答

4
如何将顶点缓冲绑定到统一数组中[...]
在OpenGL中,顶点缓冲不能被“绑定”到统一数组中。
一个顶点属性可以寻址一个命名的顶点缓冲对象(存储在顶点数组对象的状态向量中),但一个统一变量不能。请参见顶点规范
如果您想要将某种类型的缓冲绑定到某种类型的统一变量,则必须使用统一缓冲对象,它自OpenGL 3.1或GLSL版本1.40以来可用。

或者您可以使用Shader Storage Buffer Object,其中缓冲区的最后一个元素可以是可变大小的数组。自OpenGL 4.3(GLSL版本4.30)以来,通过扩展ARB_shader_storage_buffer_object提供了SSBO。

e.g.:

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

另请参阅 使用着色器存储缓冲对象(SSBOs)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接