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...

如需了解详情,请查看原始对象选择示例,并参 2}chromestatus 条目。

3D 茶壶模型三角形根据其图元索引值着色。
处于“原始索引”模式的原始对象选择示例。

Dawn 更新

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

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

这仅涵盖了一些关键亮点。请查看提交的详尽列表

WebGPU 的新变化

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

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