如何在WGSL中传递storage引用?示例代码及编译报错咨询
在WGSL中传递Storage数组的正确方式
编译报错的核心原因是:运行时大小的数组(未指定长度的array<f32>)仅允许存在于storage地址空间,不能直接作为普通函数参数传递。你需要通过指针或引用来传递这类数组,同时明确指定其地址空间与访问权限。
正确实现方式一:指针传递
@group(0) @binding(0) var<storage> srcData: array<f32>; @group(0) @binding(1) var<storage, read_write> dstData: array<f32>; // 接收只读storage数组的指针 fn getData(u: ptr<storage, read, array<f32>>, i: i32) -> f32 { return (*u)[i]; } // 接收读写storage数组的指针 fn setData(u: ptr<storage, read_write, array<f32>>, i: i32, value: f32) { (*u)[i] = value; } fn test(i: i32) -> void { // 传递数组的地址 setData(&dstData, i, getData(&srcData, i)); }
正确实现方式二:引用传递
WGSL支持引用类型,语法更简洁,无需手动解引用:
@group(0) @binding(0) var<storage> srcData: array<f32>; @group(0) @binding(1) var<storage, read_write> dstData: array<f32>; // 接收只读storage数组的引用 fn getData(u: ref<storage, read, array<f32>>, i: i32) -> f32 { return u[i]; } // 接收读写storage数组的引用 fn setData(u: ref<storage, read_write, array<f32>>, i: i32, value: f32) { u[i] = value; } fn test(i: i32) -> void { // 直接传递数组,自动转为对应引用 setData(dstData, i, getData(srcData, i)); }
关键注意点
- 指针类型
ptr<address-space, access-mode, type>:需通过*解引用后访问数组元素 - 引用类型
ref<address-space, access-mode, type>:可直接像原数组一样访问元素 - 函数参数的访问权限必须与原storage变量一致:只读数组对应
read,读写数组对应read_write
内容的提问来源于stack exchange,提问作者Lenny
相关产品推荐
相关产品推荐

