WebGPU 新功能 (Chrome 132 版)

François Beaufort
François Beaufort

發布日期:2025 年 1 月 8 日

紋理檢視畫面用法

GPU 紋理檢視畫面目前會繼承來源 GPU 紋理的所有用法旗標。但這可能會造成問題,因為某些檢視格式與特定用途不相容。如要解決這個問題,請使用選用的 usage 成員,搭配呼叫 createView(),即可明確指定與所選檢視畫面格式相容的來源材質使用標記子集。

這項異動可讓您事先驗證,並進一步控管檢視畫面的使用方式。這項功能也與其他圖形 API 保持一致,在建立檢視畫面時,使用標記是常見的參數,可提供最佳化機會。

請參閱以下程式碼片段、chromestatus 項目問題 363903526

const texture = myDevice.createTexture({
  size: [4, 4],
  format: "rgba8unorm",
  usage:
    GPUTextureUsage.RENDER_ATTACHMENT |
    GPUTextureUsage.TEXTURE_BINDING |
    GPUTextureUsage.STORAGE_BINDING,
  viewFormats: ["rgba8unorm-srgb"],
});

const view = texture.createView({
  format: 'rgba8unorm-srgb',
  usage: GPUTextureUsage.RENDER_ATTACHMENT, // Restrict allowed usage.
});

32 位元浮點紋理混合

32 位元浮點紋理對於 HDR 算繪至關重要,可保留多種顏色值,並防止色帶現象。例如科學可視化。

新的 "float32-blendable" GPU 功能可讓格式為 "r32float""rg32float""rgba32float" 的 GPU 紋理可進行混合。在要求具有這項功能的 GPU 裝置時,現在可以建立使用混合與任何 float32 格式附件的算繪管道。

請參閱以下程式碼片段、chromestatus 項目問題 369649348

const adapter = await navigator.gpu.requestAdapter();
if (!adapter.features.has("float32-blendable")) {
  throw new Error("32-bit float textures blending support is not available");
}
// Explicitly request 32-bit float textures blending support.
const device = await adapter.requestDevice({
  requiredFeatures: ["float32-blendable"],
});

// ... Creation of shader modules is omitted for readability.

// Create a render pipeline that uses blending for the rgba32float format.
device.createRenderPipeline({
  vertex: { module: myVertexShaderModule },
  fragment: {
    module: myFragmentShaderModule,
    targets: [
      {
        format: "rgba32float",
        blend: { color: {}, alpha: {} },
      },
    ],
  },
  layout: "auto",
});

// Create the GPU texture with rgba32float format and
// send the appropriate commands to the GPU...

GPUDevice adapterInfo 屬性

對於使用者提供的 GPUDevice 物件,存取實體 GPU 相關資訊的程式庫非常重要,因為這些程式庫可能需要根據 GPU 架構進行最佳化或實作因應措施。雖然可以透過 GPUAdapter 物件存取這項資訊,但無法單獨從 GPUDevice 取得這項資訊。這可能會造成不便,因為使用者可能需要在 GPUDevice 旁提供額外資訊。

為解決這個問題,GPUAdapterInfo 現在會透過 GPUDevice adapterInfo 屬性公開。這些屬性類似現有的 GPUAdapter info 屬性。

請參閱以下程式碼片段、chromestatus 項目問題 376600838

function optimizeForGpuDevice(device) {
  if (device.adapterInfo.vendor === "amd") {
    // Use AMD-specific optimizations.
  } else if (device.adapterInfo.architecture.includes("turing")) {
    // Optimize for NVIDIA Turing architecture.
  }
}

使用無效格式設定無格式內容時,會擲回 JavaScript 錯誤

先前,使用無效的紋理格式搭配 GPU 畫布內容的 configure() 方法,會導致 GPU 驗證錯誤。這項設定已變更為擲回 JavaScript TypeError。這可避免以下情況:即使 GPU 畫布背景設定錯誤,getCurrentTexture() 仍會傳回有效的 GPU 材質。詳情請參閱問題 372837859

篩選紋理上的取樣器限制

先前允許使用 "sint""uint" 和「depth"」格式紋理搭配篩選樣本。系統現在可正確禁止使用 "sint""uint" 格式紋理搭配篩選取樣器。請注意,如果您使用「depth" 紋理搭配篩選取樣器」,系統目前會發出警告,因為這項做法將在日後禁止。請參閱問題 376497143

這些限制表示,如果要使用深度紋理搭配非篩選取樣器,就必須手動建立繫結群組版面配置。這是因為「自動」產生的繫結群組版面配置目前不支援這種組合。規格問題 4952 包含正在考慮的提案,以便日後解決此限制。

擴大子群組實驗

子群組實驗原本預計在 Chrome 131 結束,但已延長至 Chrome 133,並將於 2025 年 4 月 16 日結束。雖然第一個原始來源測試著重於效能,但缺乏重要的可移植性安全防護措施。這些安全防護措施現在會加入,可能會導致現有程式碼出現錯誤。

改善開發人員使用體驗

在 Windows 上,如果 powerPreference 選項與 requestAdapter() 搭配使用,開發人員工具現在會顯示警告。當 Chrome 瞭解如何使用兩個不同的 GPU 並將結果合成時,就會移除這項警告。請參閱問題 369219127

建立過大的 GPU 緩衝區時,錯誤訊息中現在會顯示 GPU 緩衝區的大小。請參閱問題 374167798

實驗性支援 16 位元規格化紋理格式

16 位元帶正負號和不帶正負號的紋理格式現在可在 "chromium-experimental-snorm16-texture-formats""chromium-experimental-unorm16-texture-formats" GPU 功能背後進行實驗,同時這些功能正在討論標準化

這些功能新增了對 16 位元標準化紋理格式的支援,包括 COPY_SRCCOPY_DSTTEXTURE_BINDINGRENDER_ATTACHMENT 用途、多重取樣和解析功能。其他格式為 "r16unorm""rg16unorm""rgba16unorm""r16snorm""rg16snorm""rgba16snorm"

在這些實驗功能標準化之前,請在 chrome://flags/#enable-unsafe-webgpu 中啟用「Unsafe WebGPU Support」旗標,讓 Chrome 提供這些功能。

請參閱以下程式碼片段和 問題 374790898

const adapter = await navigator.gpu.requestAdapter();
if (!adapter.features.has("chromium-experimental-snorm16-texture-formats")) {
  throw new Error("16-bit signed normalized formats support is not available");
}
// Explicitly request 16-bit signed normalized formats support.
const device = await adapter.requestDevice({
  requiredFeatures: ["chromium-experimental-snorm16-texture-formats"],
});

// Create a texture with the rgba16snorm format which consists of four
// components, each of which is a 16-bit, normalized, signed integer value.
const texture = device.createTexture({
  size: [4, 4],
  format: "rgba16snorm",
  usage: GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.TEXTURE_BINDING,
});

// Send the appropriate commands to the GPU...

黎明更新

wgpu::Adapterwgpu::DeviceEnumerateFeatures(FeatureName * features) 方法已淘汰,改用 GetFeatures(SupportedFeatures * features)。請參閱問題 368672123

webgpu.h C API 已將所有 char const * 變更為 WGPUStringView 結構,該結構定義了 UTF-8 編碼字串的檢視畫面。它就像字串資料的指標,並搭配長度。這樣一來,您就能使用字串的部分內容,而無需複製整個字串。請參閱問題 42241188

這份文件僅涵蓋部分重點。請查看完整的修訂版本清單

WebGPU 新功能

以下是「WebGPU 最新消息」系列文章中涵蓋的所有內容。

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