经纬志
首页 / luma.gl / API 文档

ComputePass

先看结论

计算派发的记录单元:绑定一条计算管线,按工作组数量发起 dispatch, 结束后交回编码器统一提交。

最后验证 2026-11-03 · luma.gl 9.4 · 更新 2026-10-29 · 引用本文
device.beginComputePass(props?) → ComputePass

创建参数

参数说明
timestampQuerySet写入起止时间戳的查询集
beginTimestampIndex开始时间戳的槽位,未提供则不写
endTimestampIndex结束时间戳的槽位,未提供则不写
id调试标识

方法

方法说明
setPipeline(pipeline)选择后续派发使用的计算管线
dispatch(x, y?, z?)按工作组数量派发,三个方向可分别指定
dispatchIndirect(buffer, offset?)从缓冲区读取三个 32 位无符号整数作为工作组数量
pushDebugGroup(label) / popDebugGroup()给命令流打标签
insertDebugMarker(label)插入单点标记
end()结束通道

核心层的计算通道只暴露管线与派发命令,缓冲区、纹理绑定在管线之外准备。 需要完整的 GPU 数据流封装时,看 @luma.gl/gpgpu 模块。

工作组数量的算法

workgroup_size(64) 表示每个工作组 64 个调用。 处理 n 个元素要派发 Math.ceil(n / 64) 个工作组:

const COUNT = 65536;
const WORKGROUP_SIZE = 64;

const pass = device.beginComputePass();

pass.setPipeline(pipeline);
pass.dispatch(Math.ceil(COUNT / WORKGROUP_SIZE));
pass.end();

device.submit();

少派一个工作组会漏掉尾部元素,多派则必须让着色器自己判断下标越界。 上面 WGSL 里的 if (i < arrayLength(&values)) 就是为此准备的。

间接派发

/* 缓冲区里依次是 x、y、z 三个 u32 工作组数量 */
const args = device.createBuffer({
  data: new Uint32Array([1024, 1, 1])
});

const pass = device.beginComputePass();
pass.setPipeline(pipeline);
pass.dispatchIndirect(args, 0);
pass.end();
device.submit();

间接派发让 GPU 根据缓冲区内容决定工作量,适合前缀和、剔除后计数这类 结果规模在运行期才能确定的任务。缓冲区必须是紧密排列的 12 个字节。

后端限制

WebGL 2 没有计算通道,beginComputePass 在该后端直接抛错。 WebGPU 才支持 dispatch 与间接派发。 另外 dispatchIndirect 需要存储缓冲用途,WebGL 无法模拟。

派发不会自动等待前序结果。 两段计算需要串行时,放在同一编码器的两次通道里按顺序记录; 跨帧或跨提交的依赖要自己拆成两次提交,中间用回读或栅栏同步。

引用本文

经纬志(2026)。《ComputePass》。https://www.jingweizhi.com/lumagl/api/compute-pass.html(访问日期 2026-11-03)。