WebGPU 中的新变化(Chrome 149-150)

François Beaufort
François Beaufort

发布时间:2026 年 6 月 17 日

立即数

立即数(也称为推送常量或根常量)可让您将少量频繁变化的数据直接传递给着色器。此过程可避免创建 GPU 缓冲区和管理绑定组的开销。

更新每次绘制调用都会更改的数据(例如数百个对象的唯一对象 ID 或 3D 转换矩阵)的统一缓冲区绑定会产生 CPU 开销。将原始值直接注入到 pass 编码器中,以避免将数据写入内存和管理 GPU 查找。

立即数可为微小的高度动态变量提供快速路径。对于大型数据数组、复杂的光照结构或大型矩阵,请使用统一缓冲区或存储缓冲区。

在 WGSL 着色器中,<immediate> 地址空间可用于定义可直接传递给通道编码器的即时数据。在 JavaScript 中,在绘制调用之前调用 setImmediates() 以提供此数据,而无需绑定组。如需检查支持情况,请通过 navigator.gpu.wgslLanguageFeatures 检测 immediate_address_space WGSL 语言扩展功能。请参阅以下示例和发布意向

if (!navigator.gpu.wgslLanguageFeatures.has('immediate_address_space')) {
   throw new Error(`WGSL immediate address space is not available`);
}

const adapter = await navigator.gpu.requestAdapter();
const device = await adapter.requestDevice();

const module = device.createShaderModule({ code: `
  requires immediate_address_space;

  var<immediate> color: vec4f;

  @vertex fn vertexMain(@builtin(vertex_index) i : u32) -> @builtin(position) vec4f {
    const pos = array(vec2f(0, 1), vec2f(-1, -1), vec2f(1, -1));
    return vec4f(pos[i], 0, 1);
  }

  @fragment fn fragmentMain() -> @location(0) vec4f {
    return color;
  }`,
});

// Create render pass encoder (omitted)...

// By using layout: 'auto', WebGPU will automatically infer the `immediateSize`
// required by the pipeline layout from the WGSL module.
const pipeline = device.createRenderPipeline({
  layout: 'auto',
  vertex: { module },
  fragment: { module, targets: [{ format }] },
});
myRenderPassEncoder.setPipeline(pipeline);

// Send immediate data to the GPU, then issue a draw call
myRenderPassEncoder.setImmediates(/*rangeOffset=*/0, new Float32Array([255, 0, 0, 255]));
myRenderPassEncoder.draw(3);
myRenderPassEncoder.end();

如需深入了解此功能,请参阅 WebGPUFundamentals Immediates

感谢 Microsoft 团队的贡献!

对临时附件进行更严格的验证

WebGPU 最近引入了 TRANSIENT_ATTACHMENT GPUTextureUsage 标志,开发者可以使用该标志创建临时渲染附件,例如深度模版缓冲区或多重采样目标。这些附件会保留在快速的片上 tile 内存中,而不会分配主 VRAM。

最近的更新(#6248#6267)完善了验证规则,以防止滥用以下节省内存的纹理附件:

  • 由于平台限制,创建临时纹理时,viewFormats 必须为空数组。由于临时纹理仅用于渲染,因此不需要其他视图格式。
  • 创建纹理视图不会缩小使用标志的范围。在临时纹理上调用 createView() 时,视图无法更改其用途。
  • 临时附件不能用作渲染通道内的 resolveTarget

Dawn 更新

以下仅介绍了一些重点内容。查看详尽的提交列表

WebGPU 最新动态

WebGPU 新变化系列中涵盖的所有内容。

Chrome 149-150

Chrome 147-148

Chrome 146

Chrome 145

Chrome 144

Chrome 143

Chrome 142

Chrome 141

Chrome 140

Chrome 139

Chrome 138

Chrome 137

Chrome 136

Chrome 135

Chrome 134

Chrome 133

Chrome 132

Chrome 131

Chrome 130

Chrome 129

Chrome 128

Chrome 127

Chrome 126

Chrome 125

Chrome 124

Chrome 123

Chrome 122

Chrome 121

Chrome 120

Chrome 119

Chrome 118

Chrome 117

Chrome 116

Chrome 115

Chrome 114

Chrome 113