rust - 如何将动态值传递到 WGPU 顶点着色器?

标签 rust gpu shader wgpu-rs

我是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/

相关文章:

string - 你如何按字符迭代字符串

rust - 为什么创建对取消引用的可变引用的可变引用有效?

linux - 如何使用nix的ioctl?

cuda - Tensorflow:CUDA_VISIBLE_DEVICES似乎不起作用

shader - 使用 SCN 技术的运动模糊

functional-programming - 如何创建 `FnOnce` 函数

opengl - 什么是GPU驱动的渲染?

opencv - SURF_GPU 和 BruteForceMatcher_GPU 与 knnMatch 的奇怪结果

opengl-es-2.0 - 在着色器中禁用/跳过顶点

ios - OpenGL - 计算着色器 - iOS - 选项?