WGSL fragment_depth 扩展
在几何图形密集型渲染通道中,早期 Z 优化是开发者的最佳帮手。它们让 GPU 能够在运行耗费资源的片段着色器之前舍弃隐藏像素,从而大幅提升性能。如果光栅化深度未通过深度测试,GPU 会完全跳过 fragment 着色器,前提是该着色器没有其他副作用。
如果您想深入了解硬件如何处理此问题,MJP 撰写了一篇精彩的文章,介绍了何时必须停用 Early-Z?。
虽然自定义深度操作很有用,但在片段着色器中执行此操作会产生隐性开销。在片段着色器内写入 @builtin(frag_depth) 通常会强制驱动程序针对整个绘制调用停用这些早期 Z 优化。这是因为驱动程序启发式方法无法保证着色器计算的输出深度与光栅化器插值的深度相匹配。
为了解决此性能损失问题,WGSL 扩展程序 fragment_depth 允许您在 @builtin(frag_depth) 上指定 less 或 greater 深度模式名称,以明确说明写入的深度与插值深度之间的比较方式,从而使 GPU 能够安全地应用早期 Z 优化。
可以使用 navigator.gpu.wgslLanguageFeatures 在 JavaScript 中检测此语言扩展功能。建议在 WGSL 着色器代码的顶部使用 requires 指令来表明 requires fragment_depth; 可能会导致不兼容。请参阅以下示例和发布意向。
if (!navigator.gpu.wgslLanguageFeatures.has("fragment_depth")) {
throw new Error(`WGSL fragment depth is not available`);
}
const adapter = await navigator.gpu.requestAdapter();
const device = await adapter.requestDevice();
const shaderModule = device.createShaderModule({ code: `
requires fragment_depth;
@fragment
fn main() -> @builtin(frag_depth, less) f32 {
// Explicitly states that the output fragment depth is less than early-Z depth,
// allowing the GPU to safely preserve early-Z optimizations.
return 0.0f;
}`,
});
纹理压缩未对齐
借助“texture-compression-unaligned”GPU 功能,您可以创建尺寸不是块大小(例如 BC、ETC2 和 ASTC 格式的 4x4)的整数倍的压缩纹理。以前,WebGPU 严格要求纹理大小与这些块边界对齐。此功能无需填充或缩放纹理即可适应块对齐,因此可保留原始压缩保真度,而不会引入缩放失真。请参阅发布意向。
以下代码段用于检查适配器是否支持未对齐的纹理压缩,如果支持,则请求使用支持该功能的设备。
const adapter = await navigator.gpu.requestAdapter();
if (!adapter.features.has("texture-compression-unaligned")) {
throw new Error("Texture compression unaligned support is not available");
}
// Explicitly request texture compression unaligned support.
const device = await adapter.requestDevice({
requiredFeatures: ["texture-compression-unaligned"],
});
非常感谢 spark.js 的外部贡献者 Ignacio Castaño 推动了此功能、规范和 CTS 工作!
srgb-linear 和 display-p3-linear 颜色空间
随着“srgb-linear”和“display-p3-linear”预定义色彩空间的添加,WebGPU 画布上下文现在可以直接渲染到扩展范围的线性色彩空间中,以支持广色域显示屏。这些色彩空间在像素值和物理亮度之间保持线性关系。这使得它们非常适合游戏中的物理光照渲染以及抗锯齿、插值和抽取等空间处理任务。请参阅发布意向和 Particles (HDR) 示例 PR #574。
const adapter = await navigator.gpu.requestAdapter();
const device = await adapter.requestDevice();
const canvas = document.querySelector("canvas");
const context = canvas.getContext("webgpu");
context.configure({
device,
format: "rgba16float",
colorSpace: "display-p3-linear",
});
添加了额外的 snorm10-10-10-2 顶点格式
“snorm10-10-10-2”顶点格式是一种打包的 32 位格式,包含四个有符号的归一化值:三个 10 位分量 (r, g, b) 和一个 2 位分量 (a)。借助此格式,您可以高效存储属性,例如具有额外 2 位标量或对齐标志的 3D 法线向量,同时节省内存带宽。请参阅规范 PR 6491。
在 Linux 上为 NVIDIA 提供 f16 支持
可选的“shader-f16”功能(可在 WGSL 中支持 16 位浮点值)现在在 Linux 上受支持,适用于最新的 NVIDIA GPU 驱动程序。请参阅问题 chromium:42251215。
Dawn 更新
现在,您可以使用 WGPUAdapterPropertiesD3D 结构查询给定 GPU 适配器的底层 DXGIAdapter 的 LUID。请参阅问题 chromium:562849566。
以下内容涵盖了一些关键亮点。查看完整的提交列表。
WebGPU 最新动态
WebGPU 新动态系列中涵盖的所有内容。
Chrome 155-156
- WGSL fragment_depth 扩展程序
- 纹理压缩未对齐
- srgb-linear 和 display-p3-linear 色彩空间
- 其他 snorm10-10-10-2 顶点格式
- 在 Linux 上为 NVIDIA 提供 f16 支持
- Dawn 更新
Chrome 153-154
Chrome 151-152
Chrome 149-150
Chrome 147-148
Chrome 146
Chrome 145
Chrome 144
- WGSL subgroup_id 扩展程序
- WGSL uniform_buffer_standard_layout 扩展程序
- Linux 上的 WebGPU
- 更快的 writeBuffer 和 writeTexture
- Dawn 更新
Chrome 143
Chrome 142
Chrome 141
Chrome 140
- 设备请求会消耗适配器
- 使用纹理(在纹理视图中使用)的简写
- WGSL textureSampleLevel 支持一维纹理
- 弃用 bgra8unorm 只读存储纹理用法
- 移除 GPUAdapter isFallbackAdapter 属性
- Dawn 更新
Chrome 139
Chrome 138
Chrome 137
- 使用纹理视图进行 externalTexture 绑定
- 复制缓冲区,但不指定偏移量和大小
- 使用指向原子变量的指针的 WGSL workgroupUniformLoad
- GPUAdapterInfo powerPreference 属性
- 移除 GPURequestAdapterOptions compatibilityMode 属性
- Dawn 更新
Chrome 136
Chrome 135
- 允许创建具有 null bind 组布局的流水线布局
- 允许视口超出渲染目标边界
- 更轻松地访问 Android 上的实验性兼容性模式
- 移除 maxInterStageShaderComponents 限制
- Dawn 更新
Chrome 134
Chrome 133
- 新增了 unorm8x4-bgra 和 1 分量顶点格式
- 允许使用未定义的值请求未知限额
- WGSL 对齐规则变更
- 使用 discard 获得的 WGSL 性能提升
- 针对外部纹理使用 VideoFrame displaySize
- 使用 copyExternalImageToTexture 处理具有非默认方向的图片
- 改善开发者体验
- 启用与 featureLevel 的兼容模式
- 清理实验性子群组功能
- 弃用 maxInterStageShaderComponents 限制
- Dawn 更新
Chrome 132
- 纹理视图使用情况
- 32 位浮点纹理混合
- GPUDevice adapterInfo 属性
- 使用无效格式配置画布上下文时抛出 JavaScript 错误
- 过滤纹理上的采样器限制
- 扩展子群组实验
- 改善开发者体验
- 对 16 位归一化纹理格式的实验性支持
- Dawn 更新
Chrome 131
- 剪裁 WGSL 中的距离
- GPUCanvasContext getConfiguration()
- 点和线图元不得具有深度偏移
- 子群组的包含性扫描内置函数
- 对多重绘制间接的实验性支持
- 着色器模块编译选项 strict math
- 移除了 GPUAdapter requestAdapterInfo()
- Dawn 更新
Chrome 130
Chrome 129
Chrome 128
Chrome 127
Chrome 126
Chrome 125
Chrome 124
Chrome 123
Chrome 122
Chrome 121
- 在 Android 上支持 WebGPU
- 在 Windows 上使用 DXC 而不是 FXC 进行着色器编译
- 计算和渲染通道中的时间戳查询
- 着色器模块的默认入口点
- 支持将 display-p3 用作 GPUExternalTexture 色彩空间
- 内存堆信息
- Dawn 更新
Chrome 120
Chrome 119
Chrome 118
Chrome 117
Chrome 116
- WebCodecs 集成
- 由 GPUAdapter
requestDevice()返回的丢失设备 - 在调用
importExternalTexture()时保持视频播放流畅 - 规范一致性
- 改善开发者体验
- Dawn 更新