WebGPU 原理與加速條件:WebGL 的差異、GPUDevice、Pipeline 與 WGSL
DDEVELOPER
開發發布: 12 分鐘閱讀

WebGPU 原理與加速條件:WebGL 的差異、GPUDevice、Pipeline 與 WGSL

WebGPU 不只是比 WebGL 更新的 3D API。它讓瀏覽器中的 JavaScript 以更接近現代 GPU 的模型處理繪圖與運算,可用於 3D 遊戲、CAD 類介面、影像處理、粒子效果,以及瀏覽器內的 AI 推論。

支援情況仍取決於作業系統、GPU、驅動程式與瀏覽器設定。日文原文於 2026 年 11 月 11 日確認時,MDN 仍將 WebGPU 標示為 Limited availability。本文依序整理 WebGL 的差異、GPUDevice、管線、WGSL、運算著色器與替代方案。

日文原文發布: 2026-07-07

WebGPU 是什麼 API?

WebGPU API 讓網頁使用裝置的 GPU 執行高效能運算與複雜繪圖。MDN 將它介紹為可透過底層系統 GPU,在瀏覽器中進行高效能運算及繪製複雜影像的 API。

重點在於它不只是繪圖 API。WebGL 主要以圖形處理介面普及,而 WebGPU 從設計上就同時涵蓋繪製(render)與運算(compute)。

表格若超出畫面寬度,可左右捲動。

用途 WebGPU 適合處理的工作
3D 繪圖 大量物件、後製效果、以物理為基礎的繪製(PBR)及粒子
2D/影像處理 濾鏡、模糊、色彩轉換、邊緣偵測及縮圖處理
運算 矩陣運算、物理模擬及部分機器學習工作
瀏覽器內 AI 中小型模型推論、向量運算及量化張量處理

不過,使用 WebGPU 不代表任何工作都會變快。CPU 與 GPU 之間的資料傳輸、管線建立、同步、記憶體使用與瀏覽器驗證都有成本。對於規模很小的工作,Canvas 2D、WebGL、WebAssembly 或一般 JavaScript 反而可能更簡單、更快。

與 WebGL 的差異不只是新舊

WebGL 將 OpenGL ES 的設計帶到網頁,讓瀏覽器可以呈現 3D 遊戲與視覺化內容。它也承襲了較早期圖形 API 的狀態管理方式:應用程式持續變更目前狀態,再送出繪圖指令。

WebGPU 的設計接近 Vulkan、Metal、Direct3D 12 等現代 GPU API。應用程式先準備繪圖或運算所需的設定,再透過命令編碼器(Command Encoder)記錄指令,最後提交至佇列(Queue)。

WebGL 的流程:
  bindBuffer()
  useProgram()
  enableVertexAttribArray()
  drawArrays()

WebGPU 的流程:
  adapter -> device
  shaderModule -> pipeline
  commandEncoder -> renderPass / computePass
  queue.submit()

差異不只在寫法。WebGPU 要求更明確地描述資料格式、使用的著色器,以及讀取的紋理(Texture)與緩衝區(Buffer)。初始化程式碼可能較長,但瀏覽器與驅動程式也能更早進行驗證與最佳化。

因此,WebGPU 並不是「更簡單的 WebGL」,而是讓開發者接觸更多底層設定。Three.js、Babylon.js 等函式庫,以及遊戲引擎或視覺化框架,可將 WebGPU 作為後端;應用程式開發者不一定要直接撰寫每一項 GPU 操作。

GPUAdapter 與 GPUDevice:取得 GPU 存取介面

WebGPU 的入口是 navigator.gpu。在支援的環境中,先取得 GPUAdapter,再要求 GPUDevice。以下函式依序檢查 API、要求配接器及裝置,並處理取得失敗的情況。

async function requestWebGPUDevice() {
  if (!navigator.gpu) return null;
  try {
    const adapter = await navigator.gpu.requestAdapter();
    if (!adapter) return null;
    return await adapter.requestDevice();
  } catch (error) {
    console.warn("WebGPU 初始化失敗", error);
    return null;
  }
}

這個函式只負責初次取得裝置。如果 API 不存在、沒有可用的配接器,或要求失敗,就傳回 null。若應用程式需要額外功能或較高上限,應先檢查配接器的 features 與 limits,再指定對應的 requiredFeatures 與 requiredLimits。傳回的 Device 可能已經失效,因此要求成功不保證現在或之後都能使用。應監看 device.lost,在裝置失效時停止繪圖迴圈,再重新取得 Adapter 與 Device 並重建資源,或改用替代顯示。主動呼叫 destroy() 時不應自動重試,復原嘗試也應設上限。

GPUAdapter 代表瀏覽器選用的 GPU 實作及其提供的功能與上限。它可能對應整合式或獨立顯示晶片,也可能是軟體實作,不一定等同某個實體 GPU。GPUDevice 則是應用程式用來建立資源與指令的邏輯介面。

這項區分也與安全性有關。網頁不能直接、不受限制地控制 GPU;瀏覽器會管理存取條件、功能、限制與相容性,再提供邏輯裝置介面。WebGPU 的設計同時考量效能與網頁安全模型。

Pipeline 是 GPU 處理的設定組合

管線(Pipeline)是初學 WebGPU 時容易卡住的概念。它是一組描述 GPU 如何處理工作的設定,主要分為繪製管線(Render Pipeline)與運算管線(Compute Pipeline)。

表格若超出畫面寬度,可左右捲動。

管線 作用 典型用途
繪製管線 透過頂點與片段處理,繪製到畫面或紋理 3D 顯示、介面效果及後製處理
運算管線 執行不限於繪圖的平行運算 影像處理、物理運算及部分 AI 推論

繪製管線指定頂點與片段著色器、頂點資料格式、色彩輸出格式,以及深度測試等設定。運算管線則指定要執行的運算著色器。

WebGL 的狀態變更可能累積到繪圖前一刻,造成非預期的狀態沿用。WebGPU 將許多設定集中在管線中,較容易掌握。但建立管線本身也可能很耗時,通常應在初始化或需要時建立並快取,而不是每一幀都重建。

WGSL:WebGPU 的著色器語言

WebGPU 在 GPU 上執行的程式以 WGSL(WebGPU Shading Language)撰寫。日文原文於 2026 年 11 月 11 日確認的 W3C 文件,是 2026 年 11 月 6 日發布的 Candidate Recommendation Draft,內容定義 WebGPU 的著色器語言。

WGSL 使用屬性標示著色器入口。主要的階段屬性為 @vertex、@fragment 與 @compute。

@vertex
fn vs(@builtin(vertex_index) i: u32) -> @builtin(position) vec4f {
  let positions = array<vec2f, 3>(
    vec2f(0.0, 0.6), vec2f(-0.6, -0.6), vec2f(0.6, -0.6)
  );
  return vec4f(positions[i], 0.0, 1.0);
}

@fragment
fn fs() -> @location(0) vec4f {
  return vec4f(0.2, 0.7, 1.0, 1.0);
}

@compute @workgroup_size(64)
fn cs(@builtin(global_invocation_id) id: vec3u) {
  // 僅示範入口語法,不進行運算或輸出。
}

上方頂點範例用於 draw(3),且第一個頂點索引為 0,以三個位置繪製三角形。運算入口刻意留空,只示範語法,不會產生運算結果。實際運算還需要綁定緩衝區等資源,並呼叫 dispatchWorkgroups()。

WGSL 考量了網頁環境的驗證需求,明確描述型別、位址空間、資源綁定與入口點,讓瀏覽器能在執行前檢查。這些限制有助於避免網頁依賴不安全的 GPU 操作。

瀏覽器不會把 WGSL 原始碼字串原封不動地交給 GPU。瀏覽器實作會依平台進行驗證與轉換,透過 Metal、Direct3D 12、Vulkan 等底層圖形介面執行。開發者使用的是 WebGPU 與 WGSL 提供的抽象層。

CommandEncoder 與 Queue:先記錄,再提交

以下片段假設已備妥可用的 device、由 WGSL 建立的 renderPipeline,以及包含目標紋理檢視、且格式與管線輸出相符的 renderPassDescriptor。若要繪製到 Canvas,還需要取得並設定 WebGPU 繪圖環境;這個片段本身不是完整的繪圖程式。

WebGPU 將繪圖與運算指令記錄在 GPUCommandEncoder 中,再把完成的命令緩衝區提交至 GPUQueue。

const encoder = device.createCommandEncoder();

const pass = encoder.beginRenderPass(renderPassDescriptor);
pass.setPipeline(renderPipeline);
pass.draw(3);
pass.end();

device.queue.submit([encoder.finish()]);

這個流程乍看比較迂迴,但 CPU 與 GPU 是不同的執行單元。CPU 先組合指令,再整批提交給 GPU,有助於瀏覽器與驅動程式管理執行順序及資源狀態。

queue.submit() 呼叫返回,不代表 GPU 已完成工作。如果 CPU 需要讀取結果,必須使用適當的同步機制,例如緩衝區的 mapAsync()。WebGL 也不是每次呼叫都等待 GPU 完成;關鍵差異在於明確的指令記錄與設定方式。

設計 WebGPU 程式時,應思考如何將工作整理成批次交給 GPU。它需要調整工作組織方式,而不只是逐一替換 API 呼叫。

Compute Shader 如何擴大應用範圍

WebGPU 與 WebGL 的重要差異之一,是將運算著色器(Compute Shader)列為核心功能。它在 GPU 上執行平行運算,不必以直接繪製畫面為目的。

以影像處理為例,對一千萬個像素套用相同濾鏡時,各像素的運算往往有很大部分能獨立進行。CPU 也能平行處理,但 GPU 特別適合大量相似的運算。

  • 影像模糊、銳利化與色彩轉換
  • 粒子模擬與物理運算
  • 大量頂點或實例資料的前處理
  • 神經網路的矩陣與張量運算

使用運算著色器不會自動帶來加速。資料傳輸成本、工作群組的大小、記憶體配置、管線重用,以及是否需要把結果讀回 CPU,都會影響效能。

WebGPU 也可用於瀏覽器內的 AI 推論,但不是所有模型都能流暢執行。模型大小、量化格式、記憶體需求、瀏覽器實作與裝置 GPU 效能,都會左右實際表現。

安全性:瀏覽器仍負責把關

GPU 不只服務某個網頁。作業系統、瀏覽器、其他應用程式及其他分頁,都可能共用同一個 GPU。因此,即使 WebGPU 提供較底層的高效能介面,仍須遵循網頁安全模型。

WebGPU 會驗證緩衝區與紋理的用途、著色器型別、資源綁定及管線設定等。驗證錯誤(Validation Error)表示某項操作未符合 API 的驗證規則。

初學時,這些檢查可能讓「為什麼沒有畫面」更難理解;不過,它們是避免網頁依賴非法 GPU 記憶體存取或未定義行為的重要機制。

WebGPU 在 HTTPS 等安全環境(secure context)中提供。即使本機開發時能使用,正式環境的傳送條件或瀏覽器設定仍可能讓它不可用。使用 WebGPU 的功能應包含支援判定與替代顯示。

支援狀況:必須準備替代方案

截至日文原文 2026 年 11 月 11 日的確認,MDN 仍將 WebGPU API 標示為 Limited availability,表示部分廣泛使用的瀏覽器環境仍不支援。因此,不宜直接宣稱「WebGL 已經不需要了」。

實務上可從以下分支結構開始設計:

// 使用上方定義的 requestWebGPUDevice() 函式。
const device = await requestWebGPUDevice();
if (device) {
  // 初始化 WebGPU 繪圖程式,並處理設定錯誤與裝置失效。
} else {
  const fallbackCanvas = document.createElement("canvas");
  const gl = fallbackCanvas.getContext("webgl2");
  if (gl) {
    // 將 fallbackCanvas 加入頁面,並以 gl 初始化 WebGL2 繪圖程式。
  } else {
    // 提供 Canvas 2D、靜態圖片或伺服器端替代方案。
  }
}

這只是控制流程片段,註解中的繪圖與替代介面仍須另外實作。navigator.gpu 存在,不代表配接器、裝置要求或應用程式初始化一定成功。初始化失敗與裝置失效,也都需要替代路徑。相同 Canvas 取得一種繪圖環境後,不能再取得不同種類;切換繪圖後端時應改用新的 Canvas。

教育內容、公共服務、醫療與業務系統,以及購物結帳等重要流程,不宜只提供 WebGPU 路徑。WebGPU 可以改善體驗,但基本功能能否使用,仍須依服務對象的環境評估。

對於能明確告知支援環境的專業編輯器、3D 檢視器、遊戲、影像處理及 AI 輔助功能,WebGPU 則是值得評估的選項。裝置條件合適時,瀏覽器本身就能處理相當複雜的工作。

哪些情境適合使用 WebGPU?

WebGPU 很強大,但是否採用,仍應依工作負載與維護條件判斷。

表格若超出畫面寬度,可左右捲動。

較適合 較不適合
處理大量像素或頂點 少量 DOM 操作或一般表單處理
3D、粒子、影像濾鏡及 AI 推論 少數圖表或簡單動畫
可明確告知支援環境的專業工具 必須讓所有使用者完成的核心流程
能投入管線與緩衝區設計的專案 時程短且維護者不熟悉 WebGPU 的專案

WebGPU 並不是 Canvas 2D 或 CSS 動畫的通用替代品。當資料與運算流程都能配合 GPU 的執行方式設計時,才較容易發揮優勢。

總結:讓 GPU 工作的設定與提交更明確

WebGPU 的重點不只是「瀏覽器可以使用 GPU」——WebGL 早已做到這件事。它讓 GPU 工作的設定、記錄與提交方式更加明確。

  • WebGL 讓網頁 3D 普及,也承襲 OpenGL ES 的狀態管理方式。
  • WebGPU 透過 GPUAdapter、GPUDevice、Pipeline、CommandEncoder 與 Queue 明確組織工作。
  • WGSL 提供 vertex、fragment 與 compute 入口。
  • 除了繪圖,也支援運算,因此可用於影像處理與 AI 工作負載。
  • 支援仍有限,實務上需要判定可用性並準備替代方案。

WebGPU 不會立刻取代 WebGL,而是把瀏覽器的 GPU 使用方式拓展到現代圖形與運算模型。面對大量繪圖或運算需求時,值得把它與實作成本、維護能力及支援環境一起評估。

參考資料與來源

編輯說明

本文使用 AI 協助編輯,並於發布前由編輯確認。內容仍可能包含事實、解讀或時效上的錯誤;進行重要判斷前,請查閱所列的一手資料或官方文件。

相關文章