我是this rust 中的 wgpu 教程,并通过定义如下静态数组成功在屏幕上渲染了一个三角形:
const VERTICES: &[Vertex] = &[
Vertex { position: [-0.0868241, 0.49240386, 0.0], color: [0.1, 0.0, 0.5] },
Vertex { position: [-0.49513406, 0.06958647, 0.0], color: [0.5, 0.0, 0.9] },
Vertex { position: [-0.21918549, -0.44939706, 0.0], color: [0.5, 0.0, 0.5] }
];
然后将该数组形成一个名为 vertex_buffer 的 wgpu 缓冲区,然后使用 vertex_buffer 数组将其传递给我的着色器,如下所示:
const ATTRIBS: [wgpu::VertexAttribute; 3] = wgpu::vertex_attr_array![0 => Float32x3, 1 => Float32x3];
. . .
render_pass.set_vertex_buffer(0, self.vertex_buffer.slice(..));
我的问题是:如何让三角形随时间旋转?我最初的方法是创建第二个缓冲区,并将其传递给着色器,并使用顶点着色器来调整基于输入值的顶点位置。但这种方法只会给我带来错误。
具体来说,我在每一帧创建一个新的缓冲区,其中包含帧号,如下所示
let frame_num = self.device.create_buffer_init(
&wgpu::util::BufferInitDescriptor {
label: Some("Control Num Buffer"),
contents: bytemuck::cast_slice(&[
self.frame_num,
self.frame_num,
self.frame_num
]),
usage: wgpu::BufferUsages::VERTEX,
}
);
然后尝试像这样传递它:
render_pass.set_vertex_buffer(1, frame_num.slice(..));
我的着色器现在看起来像这样:
struct VertexInput {
[[location(0)]] position: vec3<f32>;
[[location(1)]] color: vec3<f32>
};
struct VertexOutput {
[[builtin(position)]] clip_position: vec4<f32>;
[[location(0)]] color: vec3<f32>;
};
[[stage(vertex)]]
fn vs_main(
[[location(0)]] model: VertexInput,
[[location(1)]] numb : f32 )
-> VertexOutput {
. . .
我收到的错误是以下内容的变体
Entry point vs_main at Vertex is invalid
Argument 0 varying error
The type [2] does not match the varying
着色器是否设置为接受这样的多个缓冲区?有更好的方法来解决这个问题吗?
最佳答案
继续学习本教程 - 您将学到您需要的内容。
两章之后,您将到达创建相机的部分,其中将介绍统一缓冲区。统一缓冲区与顶点缓冲区一样,是一个 wgpu::Buffer
,但它不是用它来定义顶点,而是可供着色器读取。 (“统一”意味着它不会因每个顶点或每个三角形而变化 - 它在整个绘制调用中都是相同的。)
您还需要了解绑定(bind)组,这是将统一缓冲区(和纹理)传递到着色器的方法。这是在您正在学习的章节之后、设置相机的章节之前的章节中。
关于rust - 如何将动态值传递到 WGPU 顶点着色器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72135066/