《Vulkan學習指南》是2020年機械工業出版社出版的圖書,作者是帕敏德·辛格(Parminder Singh)。本書介紹Vulkan系統的基本原理,嘗試與硬體設備進行連線並查詢可用的佇列、記憶體類型,以及提供的功能。
基本介紹
- 中文名:Vulkan學習指南
- 作者:帕敏德·辛格(Parminder Singh)
- 出版社:機械工業出版社
- ISBN:9787111647867
內容簡介,圖書目錄,作者簡介,
內容簡介
Vulkan是新一代的圖形和計算API,是Khronos推出的產品。該API繼承自OpenGL,為開發者提供了極大的靈活性與高性能。本書將首先介紹Vulkan系統的基本原理,嘗試與硬體設備進行連線並查詢可用的佇列、記憶體類型,以及提供的功能。Vulkan很冗長,所以在深入編程之前,開發者需要首先理解相關的調試技巧,這樣即使是新手也可以使用Vulkan的層和擴展特性來排除一些常見錯誤。通過閱讀本書,你將學到:
- 學習Vulkan編程模型的基本知識,理解現代GPU設備的基本功能。
- 實現設備、指令快取,以及佇列的功能,與物理硬體設備進行連線。
- 了解Vulkan中的驗證層概念,學習調試方法與技巧。
- 深入理解記憶體管理的知識,控制宿主機和設備端的記憶體操作。
- 理解和實現快取與圖像資源的類型。使用線性和最佳化類型的紋理。
- 定義渲染通道中的繪製操作,實現完整的圖形流水線。
- 通過SPIR-V管理GLSL著色器,使用描述符集和推送常數來更新著色器資源。
- 學習繪製的過程、同步資源,並通過交換鏈將3D場景渲染到螢幕上。
圖書目錄
- 第1章 開始學習新一代3D圖形API 1
1.1 Vulkan及其演化史1
1.2 Vulkan與OpenGL的對比2
1.3 重要術語4
1.4 Vulkan的原理5
1.4.1 Vulkan的執行模型5
1.4.2 Vulkan的佇列6
1.4.3 對象模型7
1.4.4 對象生命周期與指令語法7
1.4.5 錯誤檢查與驗證8
1.5 理解Vulkan應用程式8
1.5.1 驅動8
1.5.2 應用程式9
1.5.3 WSI9
1.5.4 SPIR-V9
1.5.5 LunarG SDK9
1.6 開始學習Vulkan編程模型9
1.6.1 硬體初始化10
1.6.2 視窗展示表面11
1.6.3 資源設定12
1.6.4 流水線設定14
1.7 總結18
- 第2章 你的個Vulkan偽代碼程式19
2.1 Vulkan的安裝19
2.2 Hello World偽代碼20
2.2.1 初始化—與設備握手的過程21
2.2.2 交換鏈初始化—查詢WSI擴展24
2.2.3 著色器支持—將著色器編譯到SPIR-V32
2.2.4 構建布局—描述符與流水線布局33
2.2.5 創建渲染通道—定義通道屬性34
2.2.6 幀快取—將繪製圖像關聯到渲染通道35
2.2.7 產生幾何體—在GPU記憶體中保存一個頂點36
2.2.8 流水線狀態管理—創建流水線38
2.2.9 執行渲染通道—顯示Hello World!!!41
2.2.10 佇列的提交和同步—傳送任務43
2.2.11 使用展示層進行顯示—渲染三角形44
2.3 全部整合到一起45
2.4 總結46
- 第3章 連線硬體設備47
3.1 學習使用LunarG SDK48
3.2 使用CMake設定我們的個工程49
3.3 擴展簡介53
3.4 創建一個Vulkan實例58
3.5 理解物理設備和邏輯設備65
3.5.1 物理設備65
3.5.2 邏輯設備69
3.6 理解佇列和佇列族71
3.6.1 查詢佇列族72
3.6.2 創建佇列74
3.7 整合設備和佇列的代碼76
3.8 總結78
- 第4章 調試Vulkan程式80
4.1 初探Vulkan中的調試方法81
4.2 了解LunarG驗證層及其特性82
4.3 在Vulkan程式中實現調試83
4.4 總結90
- 第5章 Vulkan中的指令快取和記憶體管理91
5.1 開始使用指令快取91
5.1.1 顯式同步92
5.1.2 指令快取中的指令類型93
5.1.3 指令快取與佇列94
5.2 理解指令池和指令快取API94
5.2.1 創建指令池95
5.2.2 指令快取的分配97
5.3 記錄指令快取99
5.3.1 佇列提交100
5.3.2 佇列等待101
5.4 實現指令快取的封裝類101
5.4.1 實現指令快取的分配過程102
5.4.2 記錄指令快取的分配過程103
5.4.3 提交指令到佇列104
5.5 管理Vulkan記憶體105
5.5.1 宿主機記憶體105
5.5.2 設備記憶體106
5.5.3 分配設備記憶體108
5.5.4 釋放設備記憶體110
5.5.5 從宿主機訪問設備記憶體110
5.5.6 延遲分配記憶體111
5.6 總結112
- 第6章 圖像資源分配與交換鏈構建113
6.1 什麼是圖像資源113
6.2 了解圖像資源116
6.2.1 創建圖像116
6.2.2 理解圖像的布局120
6.2.3 創建圖像視圖121
6.3 記憶體分配和圖像資源的綁定122
6.3.1 獲取記憶體分配的需求條件123
6.3.2 在設備端分配物理記憶體123
6.3.3 將分配的記憶體綁定到圖像對象124
6.4 交換鏈簡介124
6.4.1 了解交換鏈實現的工作流125
6.4.2 交換鏈實現類的框圖127
6.4.3 渲染器—視窗管理的自定義類127
6.4.4 VulkanSwapChain—交換鏈的管理類132
6.4.5 使用WSI創建表面並關聯到視窗135
6.4.6 支持畫面展示的圖形佇列137
6.4.7 查詢交換鏈的圖像格式138
6.4.8 創建交換鏈139
6.5 創建一個深度圖147
6.5.1 平鋪簡介147
6.5.2 創建深度快取圖像對象149
6.5.3 獲取深度圖的記憶體需求150
6.5.4 判斷記憶體的類型151
6.5.5 將物理記憶體分配並綁定到深度圖像151
6.5.6 圖像布局變換152
6.5.7 圖像布局變換與記憶體屏障152
6.5.8 創建圖像視圖156
6.6 總結程式流程157
6.6.1 初始化157
6.6.2 渲染—顯示輸出視窗158
6.7 總結158
- 第7章 快取資源、渲染通道、幀快取以及SPIR-V著色器160
7.1 理解Vulkan的快取資源類型161
7.1.1 創建快取資源對象161
7.1.2 創建快取視圖162
7.2 使用快取資源創建幾何體164
7.2.1 準備幾何體數據164
7.2.2 創建頂點快取164
7.2.3 快取創建概述165
7.2.4 實現一個快取資源—創建幾何體的頂點快取166
7.2.5 理解代碼流線169
7.3 理解渲染通道171
7.3.1 附屬檔案171
7.3.2 子通道172
7.3.3 渲染通道對應的Vulkan API172
7.3.4 實現渲染通道176
7.4 使用渲染通道來創建幀快取179
7.5 清除背景顏色182
7.5.1 設定渲染通道實例的背景顏色183
7.5.2 渲染顏色背景185
7.6 在Vulkan中實現著色器186
7.6.1 SPIR-V簡介187
7.6.2 將GLSL著色器編譯為SPIR-V188
7.6.3 實現著色器190
7.7 總結197
- 第8章 流水線和流水線狀態管理199
8.1 開始學習流水線199
8.2 通過PCO緩衝流水線對象203
8.2.1 創建流水線緩衝對象203
8.2.2 合併流水線緩衝204
8.2.3 從流水線緩衝獲取數據205
8.2.4 實現PCO206
8.3 創建圖形流水線207
8.3.1 實現圖形流水線209
8.3.2 銷毀流水線211
8.4 理解計算流水線211
8.5 Vulkan的流水線狀態對象213
8.5.1 動態狀態214
8.5.2 頂點輸入狀態216
8.5.3 輸入裝配狀態217
8.5.4 光柵化224
8.5.5 融混226
8.5.6 視口管理229
8.5.7 深度測試和模板測試230
8.5.8 多重採樣狀態232
8.6 實現流水線235
8.7 總結237
- 第9章 繪製對象238
9.1 概述Vulkan中的繪製過程238
9.2 準備繪製對象240
9.2.1 錄製渲染通道指令240
9.2.2 綁定流水線對象244
9.2.3 設定繪製對象的幾何體信息245
9.2.4 定義動態視口246
9.2.5 裁切248
9.2.6 繪製指令249
9.2.7 可繪製對象的準備過程250
9.3 渲染當前可繪製對象252
9.3.1 獲取交換鏈圖像253
9.3.2 執行繪製的指令快取對象254
9.3.3 使用展示引擎顯示輸出內容254
9.3.4 實現可繪製對象的渲染256
9.4 渲染索引幾何體259
9.5 理解Vulkan中的同步圖元262
9.5.1 柵欄262
9.5.2 信號量265
9.5.3 事件266
9.6 改變顯示視窗的大小269
9.7 總結271
- 第10章 描述符與推送常數273
10.1 理解描述符的概念273
10.1.1 VulkanDescriptor—用戶自定義的描述符類274
10.1.2 描述符集布局275
10.1.3 理解流水線布局279
10.1.4 描述符池281
10.1.5 創建描述符集的資源283
10.1.6 創建描述符集287
10.2 如何在Vulkan中實現一致變數292
10.2.1 預備條件292
10.2.2 執行模型概述293
10.2.3 初始化294
10.2.4 渲染296
10.2.5 更新297
10.3 推送常數的更新299
10.3.1 定義著色器中的推送常數299
10.3.2 更新流水線布局以及推送常數300
10.3.3 更新資源數據301
10.4 總結304
- 第11章 繪製紋理305
11.1 圖像資源快速回顧305
11.2 紋理繪製的準備工作306
11.2.1 設定紋理坐標307
11.2.2 更新著色器程式307
11.2.3 載入圖像檔案308
11.2.4 本地圖像數據結構309
11.3 實現線性平鋪的圖像資源310
11.3.1 載入圖像檔案311
11.3.2 創建圖像對象311
11.3.3 記憶體分配和綁定313
11.3.4 存儲數據到設備記憶體314
11.3.5 創建指令快取對象315
11.3.6 設定圖像布局315
11.3.7 提交指令快取315
11.3.8 創建一個圖像採樣器316
11.3.9 濾波318
11.3.10 邊界截取方式319
11.3.11 創建圖像視圖321
11.4 使用最佳化平鋪實現圖像資源322
11.4.1 載入圖像檔案322
11.4.2 快取對象的記憶體分配和綁定322
11.4.3 存儲數據到設備記憶體323
11.4.4 創建圖像對象324
11.4.5 圖像對象記憶體的分配和綁定324
11.4.6 創建指令快取對象325
11.4.7 設定圖像布局325
11.4.8 快取到圖像副本325
11.4.9 設定最佳化的圖像布局參數326
11.4.10 提交指令快取327
11.4.11 創建圖像採樣器327
11.4.12 創建圖像視圖328
11.5 在圖像和快取之間複製數據329
11.6 更新描述符集330
11.7 總結332
作者簡介
敏德·辛格(Parminder Singh)新加坡Blackmagic Design公司的計算機圖形學工程師。在過去的十年里,他一直致力於網路模擬、幾何建模、導航、自動駕駛、信息娛樂系統、圖像處理及後期製作等領域的圖形學軟體開發。他的研究主要包括泛圖形的GPU編程、通用計算,平台移植以及性能最佳化技術。