WebGPU 中的新变化(Chrome 153-154)

François Beaufort
François Beaufort

发布时间:2026 年 9 月 15 日

WGSL buffer_view 扩展

WGSL 语言扩展 buffer_view 允许将 uniform、storage 或 workgroup 变量的数据解释为多种不同的类型。这具有广泛的实用性,从传统的类型双关用法到将变量划分为多个逻辑变量。

为了确保安全性和简化实现,只能使用以下内置函数访问重新解释的类型:

  • bufferView<T>() 将特定字节偏移处的内存解释为指向类型 T 的指针。
  • bufferArrayView<T>() 创建具有显式元素数量的限定数组指针。
  • bufferLength() 返回缓冲区的大小(以字节为单位)。

可以使用 navigator.gpu.wgslLanguageFeatures 在 JavaScript 中检测此语言扩展功能。建议在 WGSL 着色器代码的顶部使用 requires 指令来表明 requires buffer_view 可能存在不兼容问题。请参阅以下 WGSL 示例和发布意向

requires buffer_view;

//  +-------------------+-----------------------------+----------------------------+
//  | Byte 0 .. 3       | Byte 4 .. (4 + N - 1)       | Byte (4 + N) .. End        |
//  +-------------------+-----------------------------+----------------------------+
//  | indices_size (u32)| indices (array<u32, count>) | vertices (array<f32>)      |
//  +-------------------+-----------------------------+----------------------------+
@group(0) @binding(0) var<storage> indices_and_vertices : buffer;

fn unpack_and_process_geometry() {
  let indices_size = *bufferView<u32>(&indices_and_vertices, 0);

  let indices = bufferArrayView<array<u32>>(&indices_and_vertices, 4, indices_size);
  let vertices = bufferView<array<f32>>(&indices_and_vertices, indices_size + 4);
  ...
}

您还可以查看缓冲区视图提案,了解更多详情,并试用 Wireframe WebGPU 示例

WGSL swizzle_assignment 扩展程序

为了满足社区最热门的功能请求,WGSL 扩展程序 swizzle_assignment 可让您直接写入向量分量重排,从而在单个语句中更新多个分量。它大幅减少了样板代码,提高了着色器可读性,同时使 WGSL 与其他着色语言保持一致。

可以使用 navigator.gpu.wgslLanguageFeatures 在 JavaScript 中检测此语言扩展功能。建议在 WGSL 着色器代码的顶部使用 requires 指令来表明 requires swizzle_assignment 可能存在不兼容问题。请参阅以下 WGSL 示例和发布意向

if (!navigator.gpu.wgslLanguageFeatures.has("swizzle_assignment")) {
  throw new Error(`WGSL swizzle assignment is not available`);
}

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

const shaderModule = device.createShaderModule({ code: `
  requires swizzle_assignment;

  @vertex
  fn main(@builtin(vertex_index) vertex_index: u32) -> @builtin(position) vec4f {
    var position = vec4f(0.0, 0.0, 0.0, 1.0);
    position.xy = vec2f(10.0, 20.0); // Swizzle assignment

    return position;
  }`,
});

WGSL 扩展程序更新

texture-formats-tier1 语言扩展虽然在 WGSL 代码中受支持,但之前在 JavaScript 中未正确映射到 navigator.gpu.wgslLanguageFeatures(作为 texture_formats_tier1)。此映射问题现已解决。请参阅 Chromium CL 8159562

现在,当在 WGSL 中启用 subgroup_size_control 时,系统会自动启用 subgroups 语言扩展程序。请参阅问题 dawn:545285663

Dawn 更新

借助新的 wgpu::FeatureName::BufferMapWriteExtendedUsages 实验性功能,您可以创建具有 wgpu::BufferUsage::MapWrite 的缓冲区,并将其与任何其他 wgpu::BufferUsagewgpu::BufferUsage::MapRead 除外)相结合,直接写入可映射且 GPU 可用的缓冲区,从而在 Vulkan 和 D3D12 后端中消除暂存缓冲区和额外的复制。如需了解详情,请参阅缓冲区映射写入扩展用法和问题 dawn:386255678

现在,您可以在任何 webgpu.h 实现方案之上使用 webgpu_cpp.h 绑定,而无需使用新的 webgpu_upstream_cpp_headers 绑定到 Dawn 的风格。请参阅 webgpu-headers 问题 #596

Dawn 现在需要使用 macOS 13.0 或更高版本。请参阅 Dawn CL 334415

以下仅介绍了一些关键亮点。如需了解详情,请查看完整的提交列表

WebGPU 最新动态

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

Chrome 153-154

Chrome 151-152

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