WebGPU 新功能 (Chrome 155-156)

WGSL fragment_depth 擴充功能

在幾何密集型算繪通道中,早期 Z 最佳化是開發人員的好幫手。這項技術可讓 GPU 在執行耗費資源的片段著色器之前,先捨棄隱藏的像素,大幅提升效能。如果點陣化深度未通過深度測試,GPU 會完全略過片段著色器,前提是著色器沒有其他副作用。

如要深入瞭解硬體如何處理這項問題,請參閱 MJP 撰寫的這篇文章。

雖然自訂深度操控功能很有用,但在片段著色器中執行這項操作時,會產生隱藏的稅金。在片段著色器內寫入 @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"],
});

非常感謝外部貢獻者 Ignacio Castaño 協助推動這項功能!

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。

黎明更新

現在可以使用 WGPUAdapterPropertiesD3D 結構體,查詢指定 GPU 介面的基礎 DXGIAdapter LUID。請參閱問題 chromium:562849566。

這涵蓋了幾項重點。請參閱完整的提交清單。

WebGPU 新功能

「WebGPU 最新消息」系列涵蓋的所有主題清單。

Chrome 155-156

Chrome 153-154

Chrome 151-152

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