我正在尝试测试计算着色器,因此我尝试将 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
错误信息给了你一个提示。 您将 32 字节写入 16 字节大小的缓冲区中:
compute_worker.write("firstArray", &[2.0, 3.0, 4.0, 5.0]);
类型不受约束的整数文字将默认为 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]);