Mer*_*ous 5 opengl glsl gfx rust
我正在尝试Uniform使用gfx-rs 将s 的列表传递给顶点着色器。数据定义如下
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",
}
}
Run Code Online (Sandbox Code Playgroud)
顶点着色器如下:
#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);
}
Run Code Online (Sandbox Code Playgroud)
当我在中引入第一行时main(),应用程序因错误而崩溃:
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",
}
}
Run Code Online (Sandbox Code Playgroud)
如何将顶点缓冲区绑定到统一数组 [...]
在 OpenGL 中,顶点缓冲区不能“绑定”到统一数组。
顶点属性可以寻址命名的顶点缓冲区对象(存储在顶点数组对象的状态向量中),但统一不能。请参阅顶点规范。
如果您想将某种缓冲区绑定到某种制服,那么您必须使用统一缓冲区对象,该对象自 OpenGL 3.1 和 GLSL 版本 1.40 起可用。
或者您可以使用Shader Storage Buffer Object,其中缓冲区的最后一个元素可以是可变大小的数组。自 OpenGL 4.3(GLSL 版本 4.30)起,SSBO 分别通过扩展名可用ARB_shader_storage_buffer_object。
例如:
layout(std430, binding = 0) buffer MyConst
{
uint my_const[];
};
Run Code Online (Sandbox Code Playgroud)