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 团队正在改进 WebGPU 着色器语言编译器 Tint,为支持 WebGPU 且采用 Metal 后端的设备引入中间表示法 (IR)。此 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 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