簡體   English   中英

如何將頂點緩沖區綁定到 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))'

完整代碼

如何將頂點緩沖區綁定到統一數組 [...]

在 OpenGL 中,頂點緩沖區不能“綁定”到統一數組。

一個頂點屬性可以尋址一個命名的頂點緩沖區對象(存儲在頂點數組對象的狀態向量中),但一個uniform 不能。 請參閱頂點規范

如果您想將某種緩沖區綁定到某種統一,那么您必須使用統一緩沖區對象,該對象從 OpenGL 3.1 和 GLSL 1.40 版開始可用。

或者您可以使用Shader Storage Buffer Object ,其中緩沖區的最后一個元素可以是可變大小的數組。 自 OpenGL 4.3(GLSL 版本 4.30)起, ARB_shader_storage_buffer_object分別通過擴展ARB_shader_storage_buffer_object

例如:

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

另請參閱使用着色器存儲緩沖區對象 (SSBO)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM