WebGPU 中的新变化(Chrome 142)

François Beaufort
François Beaufort

发布时间:2025 年 10 月 22 日

扩展了纹理格式支持功能

借助新的 "texture-formats-tier1" GPU 功能,开发者可以将现有内容移植到 Web,而无需针对 WebGPU 的较低功能重新编写内容。它支持新的 "r16unorm""r16snorm""rg16unorm""rg16snorm""rgba16unorm""rgba16snorm" 纹理格式,这些格式具有渲染附件、可混合、多重采样功能,以及 "read-only""write-only" 存储纹理访问权限。它还允许使用具有渲染附件、可混合、多重采样和解析功能的现有 "r8snorm""rg8snorm""rgba8snorm" 纹理格式。更多纹理格式也可用于 "read-only""write-only" 存储纹理访问。

新的 "texture-formats-tier2" GPU 功能可实现对特定格式的 "read-write" 存储纹理访问,这对于将 Unreal Engine 移植到 Web 等项目至关重要。请注意,在创建设备时启用 "texture-formats-tier2" 会自动启用 "texture-formats-tier1"

请参阅以下代码段和 chromestatus 条目

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

const requiredFeatures = [];
if (adapter.features.has("texture-format-tier1")) {
  requiredFeatures.push("texture-format-tier1");
}
if (adapter.features.has("texture-format-tier2")) {
  requiredFeatures.push("texture-format-tier2");
}
const device = await adapter.requestDevice({ requiredFeatures });

// Later on, when dealing with "r8unorm" texture formats for example...
if (device.features.has("texture-format-tier2")) {
  // Use "read-write" storage texture access...
} else if (device.features.has("texture-format-tier1")) {
  // Use "read-only" or "write-only" storage texture access...
} else {
  // Fallback: Use another texture format...
}

非常感谢 Intel 团队所做的工作!

WGSL 中的图元索引

primitive_index 是一个内置 WGSL 值,用于唯一标识片段着色器正在处理的当前图元(例如点、线或三角形)。它从 0 开始,在每次处理完一个图元后递增 1,并在每次绘制实例之间重置为 0。

如果 GPUAdapter 中提供了 "primitive-index" 功能,请请求具有此功能的 GPUDevice,以在 WGSL 中获得基元索引支持,并使用 enable primitive_index; 在 WGSL 代码中显式启用此扩展。启用后,您可以使用片段着色器中的 primitive_index 内置整数值来访问每个图元的数据,或执行因每个正在渲染的不同几何形状而异的逻辑。

以下代码段展示了一个片段着色器,该着色器以红色渲染第二个图元,以蓝色渲染所有其他图元。

const adapter = await navigator.gpu.requestAdapter();
if (!adapter.features.has("primitive-index")) {
  throw new Error("Primitive index support is not available");
}
// Explicitly request primitive index support.
const device = await adapter.requestDevice({
  requiredFeatures: ["primitive-index"],
});

const fragmentShaderModule = device.createShaderModule({ code: `
  enable primitive_index;

  @fragment
  fn main(@builtin(primitive_index) i : u32) -> @location(0) vec4f {
    if (i == 1) {
      return vec4f(1, 0, 0, 1);
    }
    return vec4f(0, 1, 0, 1);
  }`,
});
// Send the appropriate commands to the GPU...

如需了解详情,请查看基元选择示例,并参阅 chromestatus 条目

3D 茶壶模型三角形根据其图元索引值着色。
处于“原初索引”模式的原初拾取示例。

Dawn 更新

用于处理要构建的整体式库类型的 DAWN_BUILD_MONOLITHIC_LIBRARY CMake 变量已将其默认值从 OFF 更改为 STATIC,这样默认情况下将生成 libwebgpu* 文件。

Dawn 现在可以在配置 wgpu::Surface 时正确处理 wgpu::PresentMode::Undefined 默认值。请参阅问题 441410668

这仅涵盖了部分重要亮点。查看详尽的提交列表

WebGPU 的新变化

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

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