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

标签 opengl rust glsl shader gfx

我正在尝试使用 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 中,顶点缓冲区不能“绑定(bind)”到统一数组。

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

如果你想将某种缓冲区绑定(bind)到某种制服,那么你必须使用 Uniform Buffer Object从 OpenGL 3.1 和 GLSL 版本 1.40 开始可用。

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

例如:

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

另见 Using Shader Storage Buffer Objects (SSBOs)

关于opengl - 如何将顶点缓冲区绑定(bind)到 Gfx-rs 中的统一数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56842153/

相关文章:

C++ OpenGL 从文件渲染简单的 OBJ

rust - IntoIterator 类型的特征对象可以装箱并保存在结构内吗?

javascript - 如何渲染不同颜色的点?

javascript - 在 WebGL 中的两个着色器之间使用相同的统一变量

python - 在 OpenGL 中在 3D 模型后面绘制背景视频

c++ - 使用 opencl 将软件渲染到 opengl 2d View

c++ - 计算每个顶点的法线 OpenGL

rust - 如何使用 conservative_impl_trait 返回对迭代器的引用?

linux - 从 64 位 arch linux 为树莓派 `armv7-unknown-linux-gnueabihf` 编译 Rust 程序

opengl - 如何实现地面雾 GLSL 着色器