iT邦幫忙

2025 iThome 鐵人賽

DAY 11
0
Software Development

渲染與GPU編程系列 第 11

Day 10|Vulkan 是什麼?與 OpenGL 的差異與優勢(零基礎友善版)

  • 分享至 

  • xImage
  •  

先講一句大白話:Vulkan 就像「自己開餐車」——食材、火候、動線全自己管;OpenGL 像「去餐廳點菜」——說需求、等端菜
自己管事情多一點,但 效率、擴充性、可預測性 都能更好。以下用不繞口的方式,帶你一次看懂。


1)Vulkan 是什麼?(它解決什麼痛點)

Vulkan 是由 Khronos Group 制定的**跨平台、低開銷(low-overhead)、顯式(explicit)**圖形與計算 API。關鍵字是「顯式」:

  • 過去在 OpenGL,很多事(記憶體配置、資源同步、驅動最佳化)都由驅動程式偷偷幫你做
  • Vulkan,你要自己說清楚怎麼配置、怎麼同步、何時做什麼——所以可控、可預測,也更能吃滿多核心 CPU 的能力。

跨平台:Windows、Linux、Android 原生支援;macOS/iOS 可透過 MoltenVK(把 Vulkan 呼叫轉到 Metal)使用。遊戲引擎(如 UE、Unity)與多數引擎工具都早已支援。


2)心智模型:OpenGL「狀態機」vs Vulkan「你來規劃流程」

  • OpenGL:狀態機(state machine)
    你呼叫 glBind...glEnable... 改變全域狀態,然後 glDraw...。驅動在背後決定最佳做法,好上手黑箱,多執行緒不容易用滿。

  • Vulkan:你錄命令(command buffer),排流程(queue/同步),說清資源(descriptor/pipeline)
    換來的是CPU 開銷低、可平行錄製、多核伸縮好。代價是程式碼比較多(初始化特別多),但大部分是「明確告訴驅動」的樣板。


3)最關鍵的差異總表(把名詞對上)

主題 OpenGL(直覺) Vulkan(顯式) 這代表什麼
API 風格 即時呼叫 + 全域狀態 Command Buffer → 提交 Queue 容易做多執行緒、CPU 開銷低
記憶體 驅動自動配 你自己向顯存池顯式配置/綁定 可預測、能針對平台最佳化
同步 驅動多半幫你 你用 barrier / semaphore / fence 明講 不再「莫名卡頓/冒 hazard」
Shader GLSL 即時編譯 SPIR-V 中介碼(GLSL/HLSL 轉來) 啟動更穩、可做離線管控
管線狀態 零碎設定 + 變更 Pipeline State Object(PSO) 事先 bake,切換更快
資源綁定 glBind / 單一 Slot Descriptor Set / Binding 清楚定義誰要用什麼
Render Pass 隱含 Render Pass / Subpass(或 Dynamic Rendering) 對行動瓦片式 GPU 友善
除錯 glGetError + 工具 Validation Layers + RenderDoc 錯誤訊息明確、抓問題快
多執行緒 難(狀態機競爭) 容易(每執行緒錄命令) 吃滿多核心 CPU

4)Vulkan 的「一幀」長什麼樣?

用地圖看流程(極簡化,抓重點):

CPU 端(一次性初始化)
  建裝置/實體(VkInstance/VkDevice) → 建Swapchain → 配顯存、建Buffer/Texture
  編譯Shader→SPIR-V → 建Pipeline(VS/FS、固定功能狀態打包)
  建Descriptor Set Layout/Pool,寫入綁定的資源

每幀:
  1) 從Swapchain取一張可畫的影像
  2) 在多條CPU執行緒「錄製」Command Buffer(Draw/Barrier/Copy…)
  3) 提交到GPU Queue,附上 Semaphore/Fence 做同步
  4) 呈現(Present)到螢幕

對比 OpenGL:不再邊畫邊改全域狀態,而是先把要做的事錄成一卷膠片,一次交給 GPU 放映。


5)「顯式記憶體」為什麼重要?(效能與穩定的來源)

OpenGL 裡你丟個 glBufferData,驅動會幫你找地方放,什麼時候搬家你不知道;
Vulkan 要你清楚地:從哪個記憶體池(VRAM/Host 可見)分多大塊、綁定到哪個 Image/Buffer、怎麼做佈局轉換。

  • 優點:少了隱形搬移與鎖,避免「突然一幀爆卡」。
  • 你可用像 VMA(Vulkan Memory Allocator) 這類開源工具,省去手刻配置細節。

6)管線與資源綁定:一次講懂 PSO、Descriptor

  • Pipeline State Object(PSO):把「這個 Pass 的所有固定狀態」打包(著色器、輸入格式、Raster、Blend、Depth、MSAA…)。好處是切換快,壞處是初始化多
  • Descriptor Set:你把要用的 Buffer/Texture/Sampler 整包整理好,一次綁給著色器。
  • Push Constant:給每次 Draw 的超小快速參數(幾十 bytes),像極速便條紙。

對 OpenGL 轉來的人:把「零碎的 glBind」→「一次定義清楚(Descriptor Set + PSO)」,GPU 更容易最佳化。


7)同步與多執行緒:讓多核 CPU 真正上工

  • Command Buffer 可以在多個 CPU 執行緒同時錄製,把一個場景切成幾塊,每條線並行準備。
  • Pipeline Barrier 說明「誰先寫、誰後讀」,避免資源 hazard。
  • Semaphore / Fence 控管 GPU 與 GPU、GPU 與 CPU 之間的工作完成時機
    結果:CPU 開銷更低、調度更可控;不會像 OpenGL 那樣常被「驅動內部鎖」卡住。

8)行動裝置與桌機:Render Pass 為什麼加分?

多數行動 GPU(例如手機)使用瓦片式(TBDR):把畫面切成小塊在片上記憶體完成再一次寫回。
Vulkan 的 Render Pass / Subpass(或 Dynamic Rendering)讓你告訴驅動:這次要怎麼用顏色/深度附件、載入和儲存策略是什麼。

  • 好處:更少外部記憶體流量、更省電。
  • 在桌機上也能讓驅動更清楚知道你的意圖,減少猜測。

9)優勢總結(為什麼團隊會選 Vulkan?)

  1. CPU 開銷低、可多核伸縮:大型場景、上萬物件時很有感。
  2. 可預測:顯式同步 + 顯式記憶體 → 少了「驅動黑箱」造成的卡頓。
  3. 跨平台:Windows / Linux / Android 原生一致,macOS/iOS 走 MoltenVK。
  4. 工具齊全Validation Layers(錯誤訊息超直白)、RenderDoc(逐 draw 偵錯)、各家驅動 profiling 工具。
  5. 與現代資源管線契合:離線編譯 SPIR-V、PSO 預烘焙、Descriptor Set 批次綁定,都利於大型專案管理。

10)也談缺點:什麼情況 OpenGL 反而好?

  • 學習成本:初始化樣板多、名詞多(Instance/Device/Queue/Swapchain/Pipeline/Descriptor…)。
  • 小專案/工具:只是快速畫幾個模型或做研究,OpenGL 更快上手
  • 舊硬體/舊驅動:某些古老平台只有穩定的 OpenGL。
  • macOS/iOS 原生:要走 MoltenVK;如果你已經有成熟的 Metal/GL 架構,直接用那條也未嘗不可。

總之:追求穩定高效的大型即時內容(遊戲、視覺化、引擎)→ 值得用 Vulkan;小工具/課堂 Demo → OpenGL 更輕鬆。


11)把名詞對上:你在 OpenGL 做的事,Vulkan 這樣做

你在做什麼 OpenGL 做法 Vulkan 等價
建立視窗/交換鏈 OS + WGL/GLX/EGL + glSwapBuffers VkInstance + VkSurfaceKHR + VkSwapchainKHR
建 Buffer/Texture glGen*, glBufferData, glTexImage2D vkCreateBuffer/Image + 顯式分配/綁定
綁定資源 glBindTexture, glBindBuffer Descriptor Set(一次性描述)
設定管線狀態 glEnable, glBlendFunc Pipeline(PSO) 預先打包
glDraw* vkCmdDraw*Command Buffer,再 vkQueueSubmit
同步 驅動幫你猜 barrier/semaphore/fence 你自己講清楚
Shader GLSL 即時編譯 GLSL/HLSL → SPIR-VvkCreate*ShaderModule

12)初學 Vulkan 的「不崩潰指南」

  1. 先用教學框架:像 Vulkan-Tutorial 的專案結構,跑通最小三角形。
  2. 一步步抽象:把記憶體配置、Descriptor、命令錄製包成小模組(或直接用 VMA)。
  3. 善用 Validation Layers:錯誤訊息會告訴你「哪個步驟、哪個參數、應該怎麼修」。
  4. 用 RenderDoc:逐 draw 看資源與狀態,超好用的顯示卡除錯顯微鏡。
  5. 從單一 Queue、單一 Pass 開始:跑穩了再加多執行緒、多 Pass、Compute、Async。

13)給 OpenGL 使用者的「遷移心法」

  • 把「到處 glBind」的想法,轉成「我先定義一包 Descriptor Set,需要的 Buffer/Texture 都在裡面」。
  • 把「動態改狀態」轉成「PSO 預先烘焙,多準備幾個可重用」。
  • 把「一邊改一邊畫」轉成「先錄再交出去」,並分配到多執行緒錄製。

14)一句話總結

Vulkan = 顯式、可控、低開銷、可預測。
它把「驅動黑箱」打開,讓你自己規劃資源、同步與管線,換來更穩的幀時間、更好的多核伸縮與跨平台一致性。
若你要做的是大型即時渲染大量物件行動裝置也要穩的產品,Vulkan 值得投資;如果只是快速原型或教學 Demo,OpenGL 仍然是舒服的起點。


上一篇
Day 9|數大便是美:GPU Instancing 實作(零基礎+Unity 範例)
下一篇
Day 11|Vulkan 專案骨架與初始化(零基礎友善版|程式碼精簡)
系列文
渲染與GPU編程13
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言