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 可以做甚麼?

WebGPU API 讓網頁透過裝置的 GPU 進行高效能運算及複雜繪圖。MDN 的介紹亦指出,它使用底層系統的 GPU,在瀏覽器內處理這兩類工作。

關鍵是 WebGPU 並非只供繪圖。WebGL 主要作為圖形 API 普及,而 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、取得 Adapter 及 Device,並處理要求失敗的情況。

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 不存在、沒有可用的 Adapter,或要求失敗時,會回傳 null。若需要額外功能或較高的限制值,應先檢查 Adapter 的 features 與 limits,再指定相應的 requiredFeatures 與 requiredLimits。回傳的 Device 可能已經失效,要求成功並不保證當下或日後均可使用。應監察 device.lost:裝置失效時先停止繪圖迴圈,再重新取得 Adapter 與 Device 並重建資源,或轉用後備顯示。主動呼叫 destroy() 時不應自動重試,復原嘗試亦應設有上限。

GPUAdapter 代表瀏覽器選用的 GPU 實作,以及它提供的功能與限制。它可能對應內置或獨立 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,以及包含目標紋理視圖(TextureView)、格式與管線輸出一致的 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 存在,不代表 Adapter、Device 要求或應用程式初始化必定成功。初始化失敗或裝置失效時,也須有後備路徑。同一 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 協助編輯,並在發布前由編輯核對。內容仍可能包含事實、理解或時效上的錯誤;作出重要決定前,請查閱所列的一手資料或官方文件。

相關文章