File tree Expand file tree Collapse file tree 11 files changed +170
-0
lines changed Expand file tree Collapse file tree 11 files changed +170
-0
lines changed Original file line number Diff line number Diff line change @@ -24,4 +24,5 @@ endfunction()
24
24
file (COPY "${CMAKE_CURRENT_SOURCE_DIR} /theme" DESTINATION "${CMAKE_CURRENT_SOURCE_DIR} /translations" )
25
25
26
26
BuildBook ("en" "${CMAKE_CURRENT_SOURCE_DIR} " "${CMAKE_CURRENT_SOURCE_DIR} /book" )
27
+ BuildBook ("zh-TW" "${CMAKE_CURRENT_SOURCE_DIR} /translations/zh-TW" "${CMAKE_CURRENT_SOURCE_DIR} /book/zh-TW" )
27
28
BuildBook ("ko-KR" "${CMAKE_CURRENT_SOURCE_DIR} /translations/ko-KR" "${CMAKE_CURRENT_SOURCE_DIR} /book/ko-KR" )
Original file line number Diff line number Diff line change 143
143
</button >
144
144
<ul id =" lang-list" class =" theme-popup" aria-label =" Languages" role =" menu" >
145
145
<li role =" none" ><button role =" menuitem" class =" theme" data-lang =" en" >English</button ></li >
146
+ <li role =" none" ><button role =" menuitem" class =" theme" data-lang =" zh-TW" >中文</button ></li >
146
147
<li role =" none" ><button role =" menuitem" class =" theme" data-lang =" ko-KR" >한글</button ></li >
147
148
</ul >
148
149
{{ #if search_enabled }}
Original file line number Diff line number Diff line change
1
+ [book ]
2
+ authors = [" Karnage" , " Mes" ]
3
+ language = " zh-TW"
4
+ src = " src"
5
+ title = " Learn Vulkan"
6
+
7
+ [output .html ]
8
+ theme = " ../theme"
9
+ additional-js = [" ../theme/lang_toggle.js" ]
10
+ additional-css = [" ../theme/lang_toggle.css" ]
Original file line number Diff line number Diff line change
1
+ # Intro
2
+
3
+ Vulkan 一向以顯式(explicit)與冗長著稱。 不過,這種「必要的冗長」隨著每一個版本的演進,以及新功能與舊有的 extension 被納入核心 API 後,正逐漸地在減少。 同樣地,RAII 自 C++ 發展以來就是其核心概念之一,但多數 Vulkan 教學卻沒有活用它,而是選擇用手動釋放資源的方式來延續這種「顯式性」
4
+
5
+ 為了填補這個缺口,本教學有以下幾個目標:
6
+
7
+ - 善用現代 C++、VulkanHPP,以及 Vulkan 1.3 的特性
8
+ - 著重在簡潔與易懂,而不是效能
9
+ - 建立一個基礎但具有動態特性的 rendering 架構
10
+
11
+ 要注意的是,這份教學的重點不是效能,而是快速介紹目前標準的跨平台繪圖 API,並配合當代主流的程式設計模式與工具(以本文撰寫當下為準)。 就算不考慮效能上的潛在優勢,Vulkan 的設計本身也比 OpenGL 更現代化、更完善,例如:沒有全域狀態機、所有參數都透過 struct 傳遞且欄位名稱具語意、多執行緒的支援非常直接(沒錯,在 Vulkan 上其實比 OpenGL 更好做),還有提供一整套的 validation layer,讓你開發的時候可以在不需改動任何程式碼的情況下捕捉到一些誤用(misuse)
12
+
13
+ ## Target Audience
14
+
15
+ 如果你符合以下條件,那這份教學會很適合你:
16
+
17
+ - 了解現代 C++ 的原則與用法
18
+ - 有建立過使用第三方函式庫的 C++ 專案
19
+ - 對繪圖領域有一些基本認識
20
+ - 如果已做過 OpenGL 的教學會很好
21
+ - 有使用過像 SFML / SDL 這類 framework 的經驗也很好
22
+ - 不介意教學不會涵蓋所有細節的話
23
+
24
+ 這份教學「不會」對以下主題做太多著墨:
25
+
26
+ - 由 GPU 主導的 rendering 架構
27
+ - 從零開始打造即時繪圖引擎
28
+ - 專為 tile-based GPU 考量的實作(例如行動裝置 / Android)
29
+
30
+ ## Source
31
+
32
+ 本專案的原始碼(以及這份教學的內容)都放在[ 這個 repository] ( https://github.com/cpp-gamedev/learn-vulkan ) 裡。 repo 中的每個 ` section/* ` 分支(branch)會對應到教學中特定章節結束時的程式狀態。 一般來說修正的 bug 與後續的更新都會回補進這些分支,但仍可能會與主分支(` main ` )上的最新程式碼有些出入。 教學本身的文章內容只有在 ` main ` 分支上是最新的,這些變更並不會被回補進其他分支
33
+
34
+ ## 譯者的話(by Mes)
35
+
36
+ 感謝 karnage 寫的文章,他是一位非常厲害的工程師,非常熟悉現代 C++ 與遊戲引擎相關的技術,問他問題時他也都回的非常有耐心,人很 nice
37
+
38
+ 翻譯時我會盡量還原原文的意思,但有時候會斟酌對譯文做一些增減以更符合其原語意。 如果發現翻譯部分有錯,歡迎直接發 issue 或 PR 過來。 如果閱讀上有什麼問題,也可以直接發 issue 或是到我們的 Discord 中詢問
39
+
40
+ 譯文的排版上基本以[ 中文文案排版指北] ( https://github.com/sparanoid/chinese-copywriting-guidelines ) 為主,但由於本人的習慣,在段落的句尾並不會加上句號,另外在全形標點符號的前後我會視情況加上空格以方便閱讀。 每個段落的行數會盡量控制在 2~ 4 行,因此視情況會對原文中較長的段落進行分段。 對於一些較難翻的詞意我會於其第一次出現的地方以括號的形式補上原文,而對於標題、TOC 與程式碼中的註解,則會統一直接保留原文
Original file line number Diff line number Diff line change
1
+ # Summary
2
+
3
+ [ Introduction] ( README.md )
4
+
5
+ # Basics
6
+
7
+ - [ Getting Started] ( getting_started/README.md )
8
+ - [ Project Layout] ( getting_started/project_layout.md )
9
+ - [ Validation Layers] ( getting_started/validation_layers.md )
10
+ - [ class App] ( getting_started/class_app.md )
Original file line number Diff line number Diff line change
1
+ # Getting Started
2
+
3
+ Vulkan 是跨平台的 API,這也是它之所以冗長的一個主要原因:它的 API 必須涵蓋各式各樣的實作方式。 我們這裡會將範圍限縮在 Windows 和 Linux(x64 或 aarch64),並專注於獨立顯示卡,這樣可以避開不少冗長的細節,而且這些桌面平台與近幾代的顯示卡上都已廣泛支援 Vulkan 1.3 了
4
+
5
+ > 這並不代表像是整合型顯示晶片(integrated graphics)就不被支援,只是它們的設計或最佳化方向通常不是針對 Vulkan 而來
6
+
7
+ ## Technical Requirements
8
+
9
+ 1 . 支援 Vulkan 1.3 以上的 GPU 與 loader
10
+ 2 . [ Vulkan 1.3+ SDK] ( https://vulkan.lunarg.com/sdk/home )
11
+ 1 . 在開發 Vulkan 的應用程式時 validation layer 是必要的組件/工具,但本專案本身不會直接使用 SDK
12
+ 2 . 建議始終使用最新版的 SDK(撰寫本文時為 1.4.x)
13
+ 3 . 原生支援(natively support)Vulkan 的桌面作業系統
14
+ 1 . 推薦使用 Windows 或有新套件庫的 Linux 發行版
15
+ 2 . MacOS 並不原生支援 Vulkan。 雖然可以透過 MoltenVk 使用,但撰寫本文時 MoltenVk 尚未完整支援 Vulkan 1.3,因此如果你選擇走這條路,可能會遇到一些阻礙
16
+ 4 . 支援 C++23 的編譯器與標準函式庫
17
+ 1 . 推薦使用 GCC14+、Clang18+ 或最新版本的 MSVC。 不推薦使用 MinGW/MSYS
18
+ 2 . 也可以使用 C++20 並搭配替代方案來補齊 C++23 的功能,例如將 ` std::print() ` 改成 ` fmt::print() ` ,或是在 lambda 後面加上 ` () ` 等等
19
+ 5 . CMake 3.24 以上的版本
20
+
21
+ ## Overview
22
+
23
+ 雖然 C++ modules 正慢慢的開始普及了,但於我們的目標平台與 IDE 上,其工具鏈仍不夠完善,因此目前仍會使用傳統的 header 檔。 未來這情況可能會改變,到時這份教學也會跟著重構
24
+
25
+ 本專案採用「Build the World」的方式,這讓我們可以使用 sanitizer、在所有目標平台上都能重現編譯結果,並且不必於目標機器上預先安裝太多東西。 當然你也可以選擇使用預先編好的 binary,這不會影響你使用 Vulkan 的方式
26
+
27
+ ## Dependencies
28
+
29
+ 1 . [ GLFW] ( https://github.com/glfw/glfw ) 用來建立視窗、處理輸入與建立 Vulkan Surface
30
+ 2 . [ VulkanHPP] ( https://github.com/KhronosGroup/Vulkan-Hpp ) (透過 [ Vulkan-Headers] ( https://github.com/KhronosGroup/Vulkan-Headers ) )用來與 Vulkan 互動
31
+ 1 . 雖然 Vulkan 是 C 的 API,但官方提供了 C++ 的 wrapper library,加入了許多提升開發體驗的功能。 本教學幾乎都使用 C++ 版本的包裝,只有在需要與其他使用 C API 的函式庫互動時(如 GLFW 和 VMA)才會使用原生的 C API
32
+ 3 . [ Vulkan Memory Allocator] ( https://github.com/GPUOpen-LibrariesAndSDKs/VulkanMemoryAllocator/ ) 用來處理 Vulkan 的記憶體配置與管理
33
+ 4 . [ GLM] ( https://github.com/g-truc/glm ) 提供類似 GLSL 的線性代數功能給 C++ 使用
34
+ 5 . [ Dear ImGui] ( https://github.com/ocornut/imgui ) 用來建立 UI 介面
Original file line number Diff line number Diff line change
1
+ # Application
2
+
3
+ ` class App ` 會作為整個應用程式的擁有者與執行者。 雖然其實際上只會建立一個實例,但使用 class 可以讓我們善用 RAII,自動且按正確順序釋放所有資源,並避免使用全域變數
4
+
5
+ ``` cpp
6
+ // app.hpp
7
+ namespace lvk {
8
+ class App {
9
+ public:
10
+ void run();
11
+ };
12
+ } // namespace lvk
13
+
14
+ // app.cpp
15
+ namespace lvk {
16
+ void App::run() {
17
+ // TODO
18
+ }
19
+ } // namespace lvk
20
+ ```
21
+
22
+ ## Main
23
+
24
+ `main.cpp` 不會負責太多事:它主要的工作是將控制權交給真正的進入點,並攔截致命的例外錯誤
25
+
26
+ ```cpp
27
+ // main.cpp
28
+ auto main() -> int {
29
+ try {
30
+ lvk::App{}.run();
31
+ } catch (std::exception const& e) {
32
+ std::println(stderr, "PANIC: {}", e.what());
33
+ return EXIT_FAILURE;
34
+ } catch (...) {
35
+ std::println("PANIC!");
36
+ return EXIT_FAILURE;
37
+ }
38
+ }
39
+ ```
Original file line number Diff line number Diff line change
1
+ # Project Layout
2
+
3
+ 本頁說明這份教學中所使用的程式碼結構。 這些安排只是本教學採用的一種主觀選擇,與 Vulkan 的使用方式本身無關
4
+
5
+ 外部的依賴庫會被打包成一個 zip 檔,並在 CMake 的 configure 階段中被解壓縮。 你也可以考慮將 FetchContent 作為替代方案
6
+
7
+ 預設使用的建構器(generator)是 ` Ninja Multi-Config ` ,不論哪個作業系統或編譯器都是如此。 這會在專案根目錄下的 ` CMakePresets.json ` 中設定。 你也可以透過 ` CMakeUserPresets.json ` 加入自定的 preset 設定
8
+
9
+ > 在 Windows 上,Visual Studio 的 CMake 模式會使用這個建構器並自動載入 preset。 若使用 Visual Studio Code,CMake Tools 擴充套件也會自動使用這些 preset。 至於其他 IDE 則請參考它們對於 CMake preset 的使用說明
10
+
11
+ ** 檔案系統結構**
12
+
13
+ ```
14
+ .
15
+ |-- CMakeLists.txt <== executable target
16
+ |-- CMakePresets.json
17
+ |-- [other project files]
18
+ |-- ext/
19
+ │ |-- CMakeLists.txt <== external dependencies target
20
+ |-- src/
21
+ |-- [sources and headers]
22
+ ```
Original file line number Diff line number Diff line change
1
+ # Validation Layers
2
+
3
+ Vulkan 中與應用程式互動的部分為 Vulkan loader,其本身非常強大且具有彈性。 你可以在[ 這裡] ( https://github.com/KhronosGroup/Vulkan-Loader/blob/main/docs/LoaderInterfaceArchitecture.md ) 讀取更詳細的說明。 它的設計使我們能夠透過可配置的「layer」來串接 API 的呼叫,像是 overlay,或對我們來說最重要的「[ Validation Layers] ( https://github.com/KhronosGroup/Vulkan-ValidationLayers/blob/main/docs/README.md ) 」
4
+
5
+ ![ Vulkan Loader] ( high_level_loader.png )
6
+
7
+ 根據 Khronos Group 的[ 建議] ( https://github.com/KhronosGroup/Vulkan-ValidationLayers/blob/main/docs/khronos_validation_layer.md#vkconfig ) ,我們推薦使用 [ Vulkan Configurator (GUI)] ( https://github.com/LunarG/VulkanTools/tree/main/vkconfig_gui ) 來啟用 validation layer。 這個應用程式會隨 Vulkan SDK 一起提供,只要在開發 Vulkan 應用時讓它保持執行,並確保它被設定為會將 validation layer 注入所有被偵測到的應用程式中,並啟用 Synchronization Validation 即可
8
+
9
+ 這樣的做法能提供極高的執行期彈性,例如可以讓 VkConfig 在遇到錯誤時觸發中斷進入除錯器,而不需要在應用程式中撰寫任何與 validation layer 有關的程式碼
10
+
11
+ > 注意:記得修改你開發環境(或桌面環境)的 ` PATH ` (在支援的系統上也可以用 ` LD_LIBRARY_PATH ` ),確保 SDK 的執行檔能優先被系統找到
12
+
13
+ ![ Vulkan Configurator] ( ./vkconfig_gui.png )
You can’t perform that action at this time.
0 commit comments