WebGPU 中的新变化(Chrome 146)

François Beaufort
François Beaufort

发布时间:2026 年 2 月 25 日

在 OpenGL ES 3.1 上支持 WebGPU 兼容模式

虽然 WebGPU 的设计旨在与 Vulkan、Metal 和 D3D12 等现代图形 API 保持一致,但许多用户使用的硬件较旧,不支持这些标准。为了弥合这一差距并确保广泛的可访问性,Chrome 推出了一项新的选择启用功能,称为兼容模式。

此模式可让您在较旧的图形 API(例如 OpenGL ES 3.1)上运行 WebGPU。通过定位到 WebGPU 规范中略微受限的子集,您可以确保所有用户(无论是使用最新游戏装备还是较旧的笔记本电脑和移动设备)都能访问您的 Web 应用。虽然目前先从 Android 开始,但该团队正在探索对其他设备的支持,例如支持 OpenGL ES 3.1 的 ChromeOS 和支持 Direct3D 11 的 Windows。

对于许多 Web 应用,您可以在调用 requestAdapter() 时传递 featureLevel: "compatibility" 来启用兼容模式。如果您的设备支持 Core WebGPU,Chrome 将返回一个支持 Core 的适配器,但您的 Web 应用会知道要保持在兼容性限制范围内,除非它启用了 "core-features-and-limits" 功能(或启用了所有可用功能)。对于更复杂的应用,可能需要进行细微调整才能符合该模式的限制。

// Request a GPUAdapter in compatibility mode.
const adapter = await navigator.gpu.requestAdapter({ featureLevel: "compatibility" });
const device = await adapter.requestDevice();

如需详细了解此模式的特定架构限制,请参阅 WebGPU 基础知识指南。此外,所有 WebGPU 示例现在都支持兼容性模式。您还可以阅读发货意向

临时附件

您可以使用新的 TRANSIENT_ATTACHMENT GPUTextureUsage 标志来创建节省内存的附件。这样可让渲染通道操作保留在 tile 内存中,从而避免 VRAM 流量,并可避免为纹理分配 VRAM。

通过将纹理声明为瞬态(或“无内存”),GPU 便知道它只需要纹理的内容暂时存储在内存中,具体来说,仅在当前渲染通道内需要。此外,由于纹理的内容在渲染通道之后会被舍弃,因此驱动程序可能根本不需要为其分配 VRAM。

以下示例展示了如何创建临时纹理。

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

if ('TRANSIENT_ATTACHMENT' in GPUTextureUsage) {

  const transientTexture = device.createTexture({
    size: [42, 42],
    // The TRANSIENT_ATTACHMENT flag indicates the texture content is temporary,
    // potentially keeping it in fast on-chip memory.
    usage: GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.TRANSIENT_ATTACHMENT,
    format: 'rgba8unorm',
  });
}

请参阅 Hello Triangle MSAA - WebGPU 示例发布意向

WGSL texture_and_sampler_let 扩展程序

借助 WGSL 语言扩展程序 texture_and_sampler_let,您可以将纹理或采样器变量分配给 WGSL 着色器中的 let。此功能目前提供了一种替代命名机制,并为无绑定支持做好准备,届时返回纹理或采样器的方法可以直接存储到局部变量中。

请参阅以下示例和发货意向

@group(0) @binding(0) var tex: texture_2d<f32>;
@group(1) @binding(0) var store : texture_storage_2d<r32float, read_write>;

@fragment fn main() {
    let a = tex;
    var res: vec4f = textureLoad(a, vec2i(1i), 0);

    textureStore(store, vec2i(0i), res);
}

“黎明”更新

以下新的限额层级可供使用:

  • maxStorageBuffersPerShaderStage 最多支持 16 个。请参阅问题 366151398

  • maxSampledTexturesPerShaderStage 最多支持 48 个。请参阅问题 475255737

Android 上默认启用 SPIR-V 验证,以提供额外的安全层并防止驱动程序因输入格式错误而变得不稳定。请参阅问题 473526182

以下仅介绍了一些关键亮点。查看详尽的提交列表

WebGPU 最新动态

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

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