You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 20:52:40