●章初識Vulkan1
1.1Vulkan概覽1
1.1.1Vulkan簡介1
1.1.2支持Vulkan的遊戲概覽2
1.2搭建開發環境4
1.2.1Android平臺開發環境的配置4
1.2.2Windows平臺開發環境的配置8
1.3個Vulkan程序15
1.3.1案例的運行效果15
1.3.2Vulkan應用程序的基本架構15
1.3.33色三角形案例相關類的介紹20
1.3.4Vulkan中的常用方法22
1.3.5MyVulkanManager類的基本結構28
1.3.6創建Vulkan實例31
1.3.7獲取物理設備列表32
1.3.8創建邏輯設備32
1.3.9創建命令緩衝33
1.3.10獲取設備中支持圖形工作的隊列35
1.3.11初始化交換鏈35
1.3.12創建深度緩衝41
1.3.13創建渲染通道43
1.3.14創建幀緩衝46
1.3.15創建繪制用物體47
1.3.16初始化渲染管線51
1.3.17創建柵欄和初始化呈現信息62
1.3.18初始化基本變換矩陣、攝像機矩陣、投影矩陣63
1.3.19執行繪制63
1.3.20銷毀相關對像66
1.3.21整體流程的執行67
1.3.22頂點著色著色器68
1.4Vulkan中立體物體的構建70
1.5本章小結71
第2章渲染管線和調試技術72
2.1渲染管線72
2.2著色器的預編譯79
2.3Vulkan調試技術81
2.4VulkanGPU大PK89
2.4.1移動端GPU的4大家族89
2.4.2PC端GPU中3大家族91
2.5本章小結92
第3章著色器編程語言——GLSL93
3.1著色語言概述93
3.2著色語言基礎94
3.2.1數據類型概述94
3.2.2數據類型的基本使用98
3.2.3運算符100
3.2.4各個數據類型的構造函數102
3.2.5類型轉換104
3.2.6存儲限定符104
3.2.7插值限定符107
3.2.8一致塊108
3.2.9layout限定符109
3.2.10流程控制111
3.2.11函數的聲明和使用113
3.2.著色器中浮點及整型變量精度的指定114
3.2.13程序的基本結構114
3.3特殊的內建變量115
3.3.1頂點著色器中的內建變量115
3.3著色器中的內建變量116
3.3.3內建常量117
3.4著色語言的內置函數117
3.4.1角度轉換與三角函數118
3.4.2指數函數119
3.4.3常見函數120
3.4.4幾何函數123
3.4.5矩陣函數124
3.4.6向量關繫函數125
3.4.7紋理采樣函數126
3.4.8微分函數129
3.4.9浮點數打包與解包函數129
3.5用invariant修飾符避免值變問題130
3.6預處理器131
3.7本章小結132
第4章投影與各種變換133
4.1矩陣相關類的介紹133
4.1.1矩陣數學計算類—Matrix133
4.1.2矩陣狀態管理類—MatrixState3D134
4.2攝像機的設置137
4.3兩種投影方式138
4.3.1正交投影138
4.3.2透視投影144
4.3.3推送常量146
4.4各種變換148
4.4.1基本變換的相關數學知識148
4.4.2平移變換149
4.4.3旋轉變換150
4.4.4縮放變換151
4.4.5基本變換的實質152
4.5所有變換的完整流程153
4.6繪制方式156
4.6.1各種繪制方式概覽156
4.6.2點與線段繪制方式158
4.6.3三角形條帶與扇面繪制方式161
4.6.4索引法繪制164
4.7設置合理的視角169
4.8設置合理的投影參數174
4.9深度偏移178
4.10卷繞和背面剪裁181
4.10.1基本知識181
4.10.2一個簡單的案例182
4.11間接繪制183
4.11.1背景知識184
4.11.2頂點法間接繪制184
4.11.3索引法間接繪制186
4.12本章小結188
第5章光照189
5.1曲面物體的構建189
5.1.1球體構建的基本原理189
5.1.2案例效果概覽190
5.1.3開發步驟190
5.2基本光照效果194
5.2.1光照的基本模型194
5.2.2環境光195
5.2.3散射光199
5.2.4鏡面光205
5.2.53種光照通道的合成210
5.3定位光與定向光212
5.4點法向量和面法向量215
5.5光照的每頂點計算計算218
5.6本章小結223
第6章紋理映射224
6.1初識紋理映射224
6.2一個簡單的案例225
6.2.1開發前的準備工作225
6.2.2紋理相關類226
6.2.3案例代碼的開發241
6.2.4圖像的瓦片組織方式248
6.2.5色彩通道的靈活組合250
6.3紋理拉伸251
6.3.1四種拉伸方式概覽251
6.3.2不同拉伸方式的案例254
6.4紋理采樣259
6.4.1紋理采樣概述259
6.4.2最近點采樣259
6.4.3線性紋理采樣260
6.4.4MIN與MAG采樣261
6.4.5不同紋理采樣方式的案例262
6.5Mipmap紋理266
6.5.1基本原理266
6.5.2一個簡單的案例268
6.6多重紋理與過程紋理272
6.6.1案例概覽273
6.6.2將2D紋理映射到球面上的策略273
6.6.3案例的場景結構274
6.6.4開發過程275
6.7壓縮紋理的使用283
6.7.1Android平臺下的壓縮紋理284
6.7.2PC中Windows平臺下的壓縮紋理286
6.8點精靈289
6.8.1基本知識289
6.8.2一個簡單的案例289
6.93D紋理292
6.9.13D棋盤紋理的準備293
6.9.23D棋盤紋理案例的開發294
6.102D紋理數組297
6.10.12D紋理數組的準備297
6.10.22D紋理數組案例的開發298
6.11各向異性過濾302
6.11.1背景知識303
6.11.2一個簡單的案例303
6.12本章小結305
第7章更逼真的場景——3D模型的加載306
7.1obj模型文件概述306
7.1.1obj文件的格式306
7.1.2用3dsMax設計3D模型307
7.2加載obj文件308
7.2.1加載僅有頂點坐標數據與面數據的obj文件308
7.2.2加載後自動計算面法向量312
7.2.3加載後自動計算平均法向量315
7.2.4加載紋理坐標317
7.2.5加載頂點法向量320
7.3雙面光照321
7.4本章小結324
第8章獨特的場景渲染技術——混合與霧325
8.1混合技術325
8.1.1基本知識325
8.1.2源因子和目標因子326
8.1.3簡單混合效果的案例328
8.2地月繫雲層效果的實現330
8.3霧333
8.3.1霧的原理與優勢333
8.3.2霧的簡單實現334
8.4本章小結336
第9章常用3D開發小技巧337
9.1標志板337
9.1.1案例效果與基本原理337
9.1.2開發步驟338
9.2灰度圖地形341
9.2.1基本原理341
9.2.2開發前的準備工作342
9.2.3普通灰度圖地形342
9.2.4過程紋理地形344
9.2.5Mipmap地形347
9.2.6頂點著色器采樣紋理地形351
9.3高真實感地形353
9.3.1基本思路353
9.3.2地形設計工具EarthSculptor的使用354
9.3.3一個簡單的案例356
9.4天空盒與天空穹358
9.4.1天空盒358
9.4.2天空穹359
9.4.3天空盒與天空穹的使用技巧361
9.5簡單鏡像效果361
9.5.1基本原理361
9.5.2基本效果案例362
9.5.3升級效果案例364
9.6非真實感繪制366
9.6.1基本原理與案例效果366
9.6.2具體開發步驟368
9.7描邊效果的實現370
9.7.1沿法線擠出輪廓370
9.7.2視空間中擠出373
9.8本章小結374
0章兩種測丟棄375
10.1剪裁測試375
10.1.1基本原理與核心代碼375
10.1.2一個簡單的案例375
10.2模板測試377
10.2.1基本原理377
10.2.2一個簡單的案例380
10丟棄操作383
10.4任意剪裁平面385
10.4.1基本原理385
10.4.2茶壺被任意平面剪裁的案例386
10.5本章小結387
1章頂點著色器的妙用388
11.1飄揚的旗幟388
11.1.1基本原理388
11.1.2開發步驟389
11.2扭動的軟糖392
11.2.1基本原理392
11.2.2開發步驟393
11.3風吹椰林場景的開發394
11.3.1椰子樹隨風搖擺的基本原理395
11.3.2開發步驟396
11.4展翅飛翔的雄鷹400
11.4.1基本原理400
11.4.2開發步驟400
11.5二維扭曲402
11.5.1基本原理403
11.5.2開發步驟403
11.6吹氣膨脹特效406
11.6.1基本原理406
11.6.2開發步驟406
11.7本章小結407
著色器的妙用408
12.1程序紋理技術408
12.1.1磚塊著色器408
12.1.2沙灘球著色器410
12.2數字圖像處理411
12.2.1卷積的基本知識411
12.2.2平滑過濾412
12.2.3邊緣檢測413
12.2.4銳化處理414
12.2.5浮雕效果414
12.2.6圖像漸變415
12.2.7卡通渲染416
12.3分形著色器418
12.3.1曼德布羅集簡介418
12.3.2曼德布羅集著色器的實現419
12.3.3將曼德布羅集紋理應用到實際物體上421
12.3.4茱莉亞集著色器的實現421
12.43D紋理的妙用423
12.4.1噪聲函數的基礎知識423
12.4.2柏林噪聲生成工具426
12.4.33D噪聲木紋理茶壺的開發427
12.5體積霧429
12.5.1基本原理429
12.5.2開發步驟430
12.6粒子繫統火焰的開發431
12.6.1火焰的基本原理431
12.6.2普通版火焰433
12.6.3點精靈版火焰441
12.7本章小結444
3章真實光學環境的模擬445
13.1反射環境模擬445
13.1.1案例效果與基本原理445
13.1.2開發前的準備工作446
13.1.3開發步驟447
13.2折射環境模擬449
13.2.1案例效果與基本原理449
13.2.2開發步驟450
13.3色散效果模擬452
13.3.1案例效果與基本原理452
13.3.2開發步驟452
13.4菲涅爾效果的模擬453
13.4.1案例效果與基本原理453
13.4.2開發步驟454
13.5凹凸映射455
13.5.1案例效果與基本原理455
13.5.2法向量紋理圖的生成456
13.5.3切向量的計算458
13.5.4案例的開發459
13.6鏡頭光暈464
13.6.1案例效果與基本原理464
13.6.2鏡頭光暈案例465
13.7投影貼圖468
13.7.1案例效果與基本原理468
13.7.2開發步驟470
13.8繪制到紋理472
13.8.1案例效果與基本原理472
13.8.2開發步驟473
13.9不錯鏡像476
13.9.1案例效果與基本原理476
13.9.2開發步驟477
13.10高真實感水面倒影480
13.10.1案例效果與基本原理480
13.10.2開發步驟481
13.11本章小結484
4章陰影及不錯光照485
14.1多重渲染目標485
14.1.1基本知識485
14.1.2一個簡單的案例486
14.2陰影的重要性491
14.3平面陰影493
14.3.1案例效果與基本原理493
14.3.2開發步驟494
14.4陰影映射497
14.4.1案例效果與基本原理497
14.4.2距離紋理的生成498
14.4.3陰影場景的繪制501
14.5陰影貼圖506
14.5.1案例效果與基本原理506
14.5.2開發步驟507
14.6靜態光照貼圖508
14.6.1案例效果與基本原理508
14.6.2使用3dsMax制作靜態光照貼圖509
14.6.3案例的開發510
14.7聚光燈不錯光源512
14.7.1種實現的案例效果與基本原理513
14.7.2種實現案例的開發步驟514
14.7.3第二種實現的案例效果與基本原理515
14.7.4第二種實現案例的開發步驟516
14.8延遲渲染517
14.8.1案例效果與基本原理517
14.8.2開發步驟518
14.9環境光遮擋522
14.9.1基本原理522
14.9.2一個簡單的案例524
14.9.3效率的提升526
14.9.4平滑處理528
14.10本章小結529
5章幾種不錯著色器特效530
15.1運動模糊530
15.1.1普通運動模糊530
15.1.2不錯運動模糊533
15.2遮擋透視效果536
15.2.1案例效果與基本原理536
15.2.2開發步驟538
15.3積雪效果541
15.3.1案例效果與基本原理541
15.3.2開發步驟541
15.4背景虛化542
15.4.1案例效果與基本原理542
15.4.2開發步驟543
15.5泛光效果545
15.5.1案例效果與基本原理545
15.5.2開發步驟546
15.6色調映射548
15.6.1案例效果與背景知識548
15.6.2開發步驟549
15.7體繪制550
15.7.1案例效果與基本原理550
15.7.2開發步驟551
15.8本章小結553
6章骨骼動畫554
16.1開發骨骼動畫554
16.1.1骨骼動畫的基本原理554
16.1.2開發步驟557
16.1.3機器人模型在地面上運動時的問題563
16.2ms3d骨骼動畫文件的加載566
16.2.1ms3d文件的格式566
16.2.2將3dsMax動畫文件轉換為ms3d文件570
16.2.3加載ms3d文件案例的開發574
16.3自定義格式骨骼動畫的加載591
16.3.1bnggdh文件的格式591
16.3.2Bnggdh類594
16.3.3加載bnggdh文件的案例594
16.4本章小結606
7章讓應用運行得更流暢——性能優化607
17.1著色器的優化607
17.1.1計算量及計算頻率的相關問題607
17.1.2其他需要注意的問題608
17.2紋理圖的優化609
17.33D圖形繪制的優化610
17.3.1CPU階段的優化610
17.3.2幾何階段的優化611
17.3.3光柵化階段的優化612
17重啟612
17.4.1基本原理612
17.4.2一個簡單的案例613
17.5幾何體實例渲染614
17.5.1基本原理614
17.5.2基於實例渲染的土星光環案例615
17.6視錐體剪裁620
17.6.1AABB包圍盒的基本原理620
17.6.2AABB包圍盒的計算621
17.6.3視錐體剪裁的基本思路及實現策略622
17.6.4一個簡單的案例623
17.7遮擋查詢626
17.7.1相關方法626
17.7.2基本原理和實現策略626
17.7.3一個簡單的案例627
17.8計算著色器的使用630
17.8.1基礎知識630
17.8.2動態法向量光照水面案例633
17.9多線程並發渲染640
17.9.1基本原理641
17.9.2飛船案例的開發641
17.10多子通道渲染646
17.10.1基本原理646
17.10.2一個簡單的案例647
17.11細節級別LOD652
17.12本章小結653
8章雜項654
18數旋轉654
18.1.1基本原理與案例效果654
18.1.2開發步驟656
18.23D拾取技術662
18.2.1案例效果與基本原理662
18.2.2開發步驟665
18.3多重采樣抗鋸齒670
18.3.1基本知識與案例效果670
18.3.2一個簡單的案例671
18.4保存屏幕截圖674
18.5Windows繫統窗口縮放676
18.6曲面細分著色器677
18.6.1基本知識677
18.6.2一個簡單的案例680
18.7幾何著色器685
18.8macOS、iOS與Linux平臺下Vulkan應用的開發688
18.8.1macOS與iOS平臺下Vulkan應用程序的開發688
18.8.2Linux平臺下Vulkan圖形應用程序的開發692
18.9本章小結700
9章基於Vulkan的3D休閑遊戲——方塊歷險記701
19.1遊戲背景及功能概述701
19.1.1遊戲開發背景概述701
19.1.2遊戲功能簡介701
19.2遊戲的策劃及準備工作702
19.2.1遊戲的策劃703
19.2.2遊戲的開發準備工作703
19.3遊戲的架構705
19.3.1各類的簡要介紹705
19.3.2遊戲框架簡介706
19.4布景相關類707
19.4.13D布景類——My3Dlayer707
19.4.2總繪制類——MyDraw712
19.4.3攝像機管理類——CameraUtil716
19.4.43D物體創建類——Square3D717
19.5機關與方塊相關類718
19.5.1方塊管理類——ZFTManager718
19.5.2地刺機關管理類——DiCiBox721
19.5.3掉落塊機關管理類——DiaoLuoManager722
19.6遊戲入口及輔助工具類724
19.6.1遊戲入口類——main724
19.6.2觸控監聽類——Touch2D726
19.7著色器的開發728
19.8遊戲的優化及改進730
內容簡介
本書共分為19章,介紹了Vulkan的誕生、特點、開發環境的搭建以及運行機制、渲染管線和調試技術,著色器編程語言-GLSL、投影及各種變換、光照、紋理映射、3D模型的加載、混合與霧、兩種測丟棄、頂點著色器的妙著色器的妙用、真實光學環境的模擬、陰影及不錯光照、幾種不錯著色器、骨骼動畫、Vulkan的性能優化等,很後以一個休閑遊戲-方塊歷險記的案例來展示Vulkan的功能與技術。本書按照必知必會的基礎知識、基於Vulkan實現基本以及不錯、完整遊戲案例的順序,循序漸進地進行詳細講解,適合不同需求、不同水平層次的各類讀者。為了便於讀者學習,隨書提供了書中所有案例的完整源代碼(書中所有案例都給出了安卓版和Windows版,很後的大案例還進一步給出了macOS、iOS和Linux版),優選限度地幫助讀者快速地掌握各方面的開發技術。
本書適合遊戲開發者、程序員學習,也可以作......