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 后端写入器之间,将使编译器更高效且更易于维护,最终使开发者和用户受益。初始测试表明,新版 Tint 在将 Unity 的 WGSL 着色器转换为 MSL 时速度最多可提高 10 倍。

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

这些改进已在 Android 和 ChromeOS 上提供,目前正逐步扩展到支持 WebGPU(使用 Metal 后端)的 macOS 设备。请参阅问题 42251016

弃用 GPUAdapter requestAdapterInfo()

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

开发者工具控制台显示了针对 requestAdapterInfo() 的弃用警告。
Chrome 开发者工具中针对 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 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