WebGPU(Chrome 130)中的新变化

François Beaufort
François Beaufort

双来源混合

将两个 fragment 着色器输出合并到单个帧缓冲区中称为双源混合。此技术对于需要执行复杂混合操作的应用特别有用,例如基于 Porter-Duff 混合模式的应用。通过将后续渲染传递替换为单个渲染传递,双源混合可以提高性能和灵活性。

借助新的 "dual-source-blending" WebGPU 功能,您可以在 @location(0) 中使用 WGSL @blend_src 属性来表示混合源索引和以下混合因子"src1""one-minus-src1""src1-alpha""one-minus-src1-alpha"。请参阅以下代码段、chromestatus 条目问题 341973423

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

const code = `
  enable dual_source_blending;

  struct FragOut {
    @location(0) @blend_src(0) color : vec4f,
    @location(0) @blend_src(1) blend : vec4f,
  }

  @fragment fn main() -> FragOut {
    var output : FragOut;
    output.color = vec4f(1.0, 1.0, 1.0, 1.0);
    output.blend = vec4f(0.5, 0.5, 0.5, 0.5);
    return output;
  }
`;

const shaderModule = device.createShaderModule({ code });
// Create a render pipeline with this shader module
// and run the shader on the GPU...

缩短了 Metal 的着色器编译时间

Chrome 团队正在为通过 Metal 后端支持 WebGPU 的设备引入中间表示法 (IR),从而增强 WebGPU 着色器语言编译器 Tint。此 IR 位于 Tint 的抽象语法树 (AST) 和 Metal 后端写入程序之间,将使编译器更高效且更易于维护,最终使开发者和用户都受益。初始测试表明,在将 Unity 的 WGSL 着色器转换为 MSL 时,新版本的 Tint 的速度最高提高了 10 倍。

一个流程图显示了将 WGSL 着色器代码转换为低阶 GPU 指令的过程。
在 macOS 中创建渲染流水线。

这些改进已在 Android 和 ChromeOS 上推出,并且正在逐步扩展至支持带有 Metal 后端的 WebGPU 的 macOS 设备。请参阅问题 42251016

弃用了 GPUAdapter requestAdapterInfo()

GPUAdapter requestAdapterInfo() 异步方法是多余的,因为开发者已经可以使用 GPUAdapter info 属性同步获取 GPUAdapterInfo。因此,非标准 GPUAdapter requestAdapterInfo() 方法现已废弃。请参阅要弃用的 intent

开发者工具控制台会针对 requestAdapterInfo() 显示废弃警告。
Chrome DevTools 中针对 requestAdapterInfo() 显示的功能已废弃警告。

Dawn 更新

webgpu.h C API 为扩展结构体定义了一些命名惯例。请参阅以下名称变更和问题 42241174

WGPURenderPassDescriptor 扩展程序
WGPURenderPassDescriptorMaxDrawCount -> WGPURenderPassMaxDrawCount
WGPUShaderModuleDescriptor 扩展程序
WGPUShaderModuleSPIRVDescriptor -> WGPUShaderSourceSPIRV
WGPUShaderModuleWGSLDescriptor -> WGPUShaderSourceWGSL
WGPUSurfaceDescriptor 个扩展程序
WGPUSurfaceDescriptorFromMetalLayer -> WGPUSurfaceSourceMetalLayer
WGPUSurfaceDescriptorFromWindowsHWND -> WGPUSurfaceSourceWindowsHWND
WGPUSurfaceDescriptorFromXlibWindow -> WGPUSurfaceSourceXlibWindow
WGPUSurfaceDescriptorFromWaylandSurface -> WGPUSurfaceSourceWaylandSurface
WGPUSurfaceDescriptorFromAndroidNativeWindow -> WGPUSurfaceSourceAndroidNativeWindow
WGPUSurfaceDescriptorFromXcbWindow -> WGPUSurfaceSourceXCBWindow
WGPUSurfaceDescriptorFromCanvasHTMLSelector -> WGPUSurfaceSourceCanvasHTMLSelector_Emscripten

WGPUDepthStencilStatedepthWriteEnabled 属性类型从布尔值切换为 WGPUOptionalBool,以更好地反映其三种可能的状态(true、false 和 undefined),就像在 JavaScript API 中一样。如需了解详情,请参阅以下代码段和 webgpu-headers PR

wgpu::DepthStencilState depthStencilState = {};
depthStencilState.depthWriteEnabled = wgpu::OptionalBool::True; // Undefined by default

本文仅介绍了一些主要亮点。查看详尽的提交内容列表

WebGPU 中的新变化

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

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