使用计算着色器进行 0.12 时出现问题

问题描述 投票:0回答:1

我正在尝试测试计算着色器,因此我尝试将 2 个数组添加在一起,但在运行时出现此错误:

    thread 'Compute Task Pool (6)' panicked at C:\Users\bramb\.cargo\registry\src\index.crates.io-6f17d22bba15001f\wgpu-0.17.2\src\backend\direct.rs:3056:5:
wgpu error: Validation Error

Caused by:
    In Queue::write_buffer
    Copy of 0..32 would end up overrunning the bounds of the Destination buffer of size 16

这是我在 bevy 中的代码:

(calc_gpu_things is run every frame)

    fn calc_gpu_things(mut compute_worker: ResMut<AppComputeWorker<SimpleComputeWorker>>) {
    if !compute_worker.ready() {
        return;
    };

    compute_worker.write("firstArray", &[2.0, 3.0, 4.0, 5.0]);
    compute_worker.write("secondArray", &[2.0, 3.0, 4.0, 5.0]);
    let result: [f32; 4] = compute_worker.read("resultArray");

    println!("got {:?}", result);
}

    #[derive(TypeUuid)]
    #[uuid = "2545ae14-a9bc-4f03-9ea4-4eb43d1075a7"]
    struct SimpleShader;

impl ComputeShader for SimpleShader {
    fn shader() -> ShaderRef {
        "compute1.wgsl".into()
    }
}
    
    #[derive(Resource)]
    struct SimpleComputeWorker;
    
    impl ComputeWorker for SimpleComputeWorker {
        fn build(world: &mut World) -> AppComputeWorker<Self> {
            let worker = AppComputeWorkerBuilder::new(world)
                // Add a staging buffer, it will be available from
                // both CPU and GPU land.
                .add_staging("firstArray", &[2.0, 3.0, 4.0, 5.0])
                .add_staging("secondArray", &[2.0, 3.0, 4.0, 5.0])
                .add_staging("resultArray", &[0.0, 0.0, 0.0, 0.0])
                // Create a compute pass from your compute shader
                // and define used variables
                .add_pass::<SimpleShader>([1, 1, 1], &["firstArray", "secondArray", "resultArray"])
                .build();
    
            worker
        }
    }

这是我用 WEBGPU 在 Babylonjs 中编写的着色器代码:

    @group(0) @binding(0) var<storage,read> firstArray: array<f32>;
@group(0) @binding(1) var<storage,read> secondArray: array<f32>;
@group(0) @binding(2) var<storage,read_write> resultArray: array<f32>;

@compute @workgroup_size(1, 1, 1)
fn main(@builtin(global_invocation_id) global_id: vec3<u32>) {
    let index: u32 = global_id.x;

    resultArray[index] = firstArray[index] + secondArray[index];
}

我用它来连接CPU和GPU:

https://github.com/Kjolnyr/bevy_app_compute
rust compute-shader bevy
1个回答
0
投票

错误信息给了你一个提示。 您将 32 字节写入 16 字节大小的缓冲区中:

compute_worker.write("firstArray", &[2.0, 3.0, 4.0, 5.0]);

RFC 212

类型不受约束的整数文字将默认为 i32 [...] 浮点文字将默认为 f64。

所以这是 4 个

f64
,又名 32 字节。你的缓冲区期望
f32
但:

@group(0) @binding(0) var<storage,read> firstArray: array<f32>;

4

f32
s 将是 16 个字节。


您可以通过指定您正在编写的浮点类型来解决此问题:

compute_worker.write("firstArray", &[2.0f32, 3.0, 4.0, 5.0]);
© www.soinside.com 2019 - 2024. All rights reserved.