Vulkan學習指南
內容描述
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編程、通用計算,平台移植以及性能優化技術。