內容簡介
本書共分14章,內容涵蓋了從OpenGL ES 3.x著色器的使用技巧到高 級光影效果以及物理模擬問題的解決。介紹了OpenGL ES 3.x中的各種緩衝區對象和頂點著色器與片元著色器的使用技巧,以及高 級光影效果的實現,如凹凸映射、環境反射、陰影、倒影、鏡頭光暈等。介紹了傑出的3D物理引擎Bullet(Java和C++版本),詳細介紹了骨骼動畫的開發,包括載入ms3d骨骼動畫以及開發自定義格式的骨骼動畫。系統地討論了OpenGL ES 3.x開發中的性能最佳化問題,介紹了OpenGL ES 3.1新增的計算著色器。給出了基於NDK的大型遊戲案例——火力籃球和iOS下的3D遊戲案例——方塊翻轉,方便讀者快速上手套用。
本書適合遊戲開 發者、程式設計師閱讀,也適合大專院校相關專業師生的學習用書,以及培訓學校的教材。
圖書目錄
第 1章 緩衝區對象 1
1.1 頂點緩衝區 1
1.1.1 基本知識 1
1.1.2 一個簡單的案例 4
1.2 頂點數組對象 6
1.2.1 基本知識與案例效果 6
1.2.2 案例開發步驟 7
1.3 一致緩衝區對象 8
1.3.1 基本知識與案例效果 9
1.3.2 案例開發步驟 10
1.4 映射緩衝區對象 13
1.4.1 基本知識與案例效果 13
1.4.2 案例開發步驟 15
1.5 其他緩衝區對象操作 18
1.5.1 複製緩衝區對象 18
1.5.2 從顏色緩衝區複製紋理數據 18
1.6 幀緩衝與渲染緩衝 20
1.6.1 幀緩衝與渲染緩衝對象 20
1.6.2 案例開發步驟 23
1.7 多重渲染目標 26
1.7.1 基本知識 26
1.7.2 一個簡單的案例 26
1.8 小結 29
第 2章 頂點著色器的妙用 30
2.1 飄揚的旗幟 30
2.1.1 基本原理 30
2.1.2 開發步驟 31
2.2 扭動的軟糖 33
2.2.1 基本原理 33
2.2.2 開發步驟 34
2.3 風吹椰林場景的開發 35
2.3.1 椰子樹隨風搖擺的基本原理 35
2.3.2 開發步驟 36
2.4 展翅飛翔的雄鷹 39
2.4.1 基本原理 39
2.4.2 開發步驟 40
2.5 二維扭曲 42
2.5.1 基本原理 42
2.5.2 開發步驟 43
2.6 吹氣膨脹特效 45
2.6.1 特效基本原理 46
2.6.2 特效開發步驟 46
2.7 固定渲染管線與可程式渲染管線實現方案的對比 48
2.8 小結 49
第3章 片元著色器的妙用 50
3.1 程式紋理技術 50
3.1.1 磚塊著色器 50
3.1.2 沙灘球著色器 52
3.2 數字圖像處理 53
3.2.1 卷積的基本知識 53
3.2.2 平滑過濾 54
3.2.3 邊緣檢測 55
3.2.4 銳化處理 56
3.2.5 浮雕效果 56
3.2.6 圖像漸變 58
3.2.7 卡通渲染特效 59
3.3 分形著色器 60
3.3.1 曼德布羅集簡介 61
3.3.2 曼德布羅集著色器的實現 61
3.3.3 將曼德布羅集紋理套用到實際物體上 63
3.3.4 茱莉亞集著色器的實現 63
3.4 3D紋理的妙用 65
3.4.1 噪聲函式的基礎知識 65
3.4.2 柏林噪聲函式生成工具 68
3.4.3 3D噪聲紋理木頭茶壺的
開發 69
3.5 體積霧 72
3.5.1 基本原理 72
3.5.2 開發步驟 73
3.6 粒子系統火焰的開發 75
3.6.1 火焰的基本原理 75
3.6.2 普通版火焰 77
3.6.3 點精靈版火焰 82
3.6.4 變換反饋版火焰 85
3.7 小結 89
第4章 真實光學環境的模擬 90
4.1 反射環境模擬 90
4.1.1 案例效果與基本原理 90
4.1.2 反射環境開發步驟 91
4.2 折射環境模擬 93
4.2.1 案例效果與基本原理 93
4.2.2 開發步驟 95
4.3 色散效果的模擬 96
4.3.1 案例效果與基本原理 96
4.3.2 開發步驟 97
4.4 菲涅爾效果的模擬 97
4.4.1 案例效果與基本原理 97
4.4.2 菲涅爾效果開發步驟 98
4.5 凹凸映射 99
4.5.1 案例效果與基本原理 99
4.5.2 法向量紋理圖的生成 100
4.5.3 切向量的計算 103
4.5.4 案例的開發 105
4.5.5 使用3ds Max製作法向量
紋理圖 109
4.6 高真實感地形 111
4.6.1 基本思路 111
4.6.2 一個簡單的案例 112
4.7 鏡頭光暈 115
4.7.1 基本原理 115
4.7.2 一個簡單的案例 116
4.8 小結 119
第5章 陰影及高 級光照 120
5.1 投影貼圖 120
5.1.1 案例效果與基本原理 120
5.1.2 開發步驟 121
5.2 陰影的重要性 123
5.3 平面陰影 125
5.3.1 案例效果與基本原理 125
5.3.2 開發步驟 126
5.4 陰影映射 129
5.4.1 陰影映射案例效果與基本
原理 129
5.4.2 距離紋理圖的生成 130
5.4.3 陰影場景的繪製 135
5.5 陰影貼圖 138
5.5.1 案例效果與基本原理 138
5.5.2 開發步驟 139
5.6 靜態光照貼圖 140
5.6.1 案例效果與基本原理 140
5.6.2 使用3ds Max製作靜態光照
貼圖 141
5.6.3 案例的開發 142
5.7 聚光燈高 級光源 144
5.7.1 案例效果與基本原理 144
5.7.2 案例的開發 145
5.8 半球光照 146
5.8.1 案例效果與基本原理 146
5.8.2 案例的開發 148
5.9 光線跟蹤 149
5.9.1 光線跟蹤案例效果與基本
原理 149
5.9.2 光線跟蹤開發步驟 153
5.10 高 級鏡像技術 162
5.10.1 案例效果與基本原理 162
5.10.2 開發步驟 163
5.11 高真實感水面倒影 168
5.11.1 案例效果與基本原理 168
5.11.2 開發步驟 170
5.12 運動模糊 175
5.12.1 普通運動模糊 176
5.12.2 高 級運動模糊 179
5.13 小結 183
第6章 遊戲開發中的物理學 184
6.1 碰撞檢測基本技術 184
6.1.1 AABB包圍盒的基本原理 184
6.1.2 AABB包圍盒的計算 185
6.1.3 AABB包圍盒的碰撞檢測 186
6.1.4 一個AABB包圍盒的案例 188
6.1.5 旋轉後的AABB包圍盒 189
6.1.6 AABB包圍盒的使用要點 193
6.1.7 OBB包圍盒 193
6.2 穿透效應 194
6.2.1 案例的運行效果與基本
原理 194
6.2.2 具體開發步驟 195
6.3 粒子系統 195
6.3.1 案例運行效果與基本原理 195
6.3.2 CPU版案例的開發 196
6.3.3 GPU版案例開發步驟 197
6.4 彈簧質點模型模擬旗幟 199
6.4.1 彈簧質點模型基本原理 199
6.4.2 彈簧質點模型案例的運行效果及開發步驟 200
6.5 彈簧質點模型模擬球網 208
6.5.1 彈簧質點模型的基本原理 209
6.5.2 彈簧質點模型的案例的運行效果及開發步驟 209
6.6 小結 211
第7章 3D物理引擎一——JBullet 212
7.1 物理引擎很重要 212
7.1.1 什麼是物理引擎 212
7.1.2 常見的物理引擎 212
7.2 JBullet物理引擎概覽 214
7.2.1 基本的物理學概念 215
7.2.2 JBullet中常用類的介紹 216
7.3 箱子相互碰撞的案例 223
7.3.1 案例運行效果及準備工作 223
7.3.2 案例的基本框架結構 224
7.3.3 常量類——Constant 225
7.3.4 3D場景渲染類——MySurfaceView 225
7.3.5 水平地面——TexFloor類 227
7.3.6 箱子——TexCube類 228
7.4 複合碰撞形狀的使用 229
7.4.1 案例運行效果 229
7.4.2 立方體圓柱複合形狀——CubeCylinder類 229
7.5 凹凸地形的案例 231
7.5.1 案例運行效果 231
7.5.2 地形類——LandForm 232
7.6 任意形狀物體的碰撞 233
7.6.1 案例運行效果 233
7.6.2 載入物體類——LoadedObject VertexNormal 233
7.6.3 載入物體剛體類——LoadRigidBody 234
7.7 鉸鏈關節 235
7.7.1 鉸鏈關節的基本知識 235
7.7.2 鉸鏈關節案例的運行效果 236
7.7.3 鉸鏈關節旋轉角速度的計算 237
7.7.4 3D界面渲染類——MySurfaceView 238
7.8 滑動關節 240
7.8.1 滑動關節的基本知識 240
7.8.2 案例效果圖 241
7.8.3 3D界面渲染類——MySurfaceView 241
7.9 六自由度關節 244
7.9.1 六自由度關節的基本知識 244
7.9.2 六自由度關節案例的運行
效果 245
7.9.3 人偶類——Doll 246
7.9.4 拾取時採用的點對點關節 247
7.10 交通工具 250
7.10.1 交通工具開發要點 250
7.10.2 交通工具案例的運行
效果 251
7.10.3 3D場景渲染類——
MySurfaceView 251
7.10.4 汽車類——Car 253
7.10.5 汽車繪製類——
VehicleDraw 257
7.11 小結 258
第8章 3D物理引擎二——Bullet 259
8.1 Bullet中的常用類和結構體 259
8.1.1 btScalar類——被封裝的
浮點類 259
8.1.2 btVector3類——三維向量類 259
8.1.3 btTransform類——變換類 261
8.1.4 btRigidBody類——剛體類 262
8.1.5 btDynamicsWorld類——物理世界類 263
8.1.6 btDiscreteDynamicsWorld類——
離散物理世界類 264
8.1.7 btSoftRigidDynamicsWorld類——支持模擬軟體的物理
世界類 264
8.1.8 btCollisionShape類——碰撞形狀類 265
8.1.9 btStaticPlaneShape類——靜態平面形狀 265
8.1.10 btSphereShape類——球體形
狀類 266
8.1.11 btBoxShape類——長方體盒
碰撞形狀類 266
8.1.12 btCylinderShape類——圓柱
形狀類 266
8.1.13 btCapsuleShape類——膠囊
形狀類 266
8.1.14 btConeShape類——圓錐形
狀類 267
8.1.15 btCompoundShape類——復
合碰撞形狀類 267
8.2 簡單的物理場景 267
8.2.1 案例運行效果 267
8.2.2 案例的基本框架結構 268
8.2.3 3D場景渲染類——GL2JNIView類 269
8.2.4 主控制類——HelloBulletActivity類 271
8.2.5 本地方法聲明及動態庫載入類——JNIPort類 272
8.2.6 封裝的物體類——TexBody
類 273
8.2.7 矩形繪製類——TextrueRect
類 273
8.2.8 長方體物體類——TexCuboid
類 276
8.2.9 水平地面類——TexPlane類 278
8.2.10 初始化及渲染函式檔案——
main.cpp 279
8.3 各式各樣的物體下落 281
8.3.1 案例運行效果 281
8.3.2 圓錐物體類——TexCone類 282
8.3.3 球物體類——TexBall類 284
8.3.4 膠囊物體類——
TexCapsule類 285
8.3.5 圓柱物體類——TexCylinderShape類 287
8.3.6 初始化及渲染函式檔案——main.cpp 289
8.4 旋轉的陀螺 290
8.4.1 案例運行效果 290
8.4.2 陀螺物體類——MyCompoundShape類 290
8.4.3 初始化及渲染函式檔案——main.cpp 292
8.5 消失的木塊 292
8.5.1 案例運行效果 292
8.5.2 初始化及渲染函式檔案——main.cpp 293
8.6 物體碰撞下落 295
8.6.1 案例運行效果 295
8.6.2 初始化及渲染函式檔案——main.cpp 296
8.7 關節 297
8.7.1 關節的父類——btTypedConstraint類 297
8.7.2 鉸鏈關節——btHingeConstraint類 297
8.7.3 鉸鏈關節的案例——球落
門開 299
8.7.4 齒輪關節——btGearConstraint類 300
8.7.5 齒輪關節的案例——轉動的齒輪 301
8.7.6 點對點關節——btPoint2Point Constraint類 302
8.7.7 點對點關節的案例——懸掛的物體 303
8.7.8 滑動關節——btSliderConstraint類 304
8.7.9 滑動關節的案例——六個方向的物體滑動 305
8.7.10 六自由度關節——btGeneric6
DofConstraint類 308
8.7.11 六自由度關節的案例——掉
落的蜘蛛 309
8.8 三角形格線形狀類 311
8.8.1 三角形索引數組類——btTriangle IndexVertexArray類 311
8.8.2 層次包圍結構三角形格線形狀類——btBvhTriangleMesh Shape類 312
8.8.3 層次包圍結構三角形格線形狀類的案例——波動的水紋 313
8.9 交通工具類 316
8.9.1 交通工具類——btRaycastVehicle類 317
8.9.2 交通工具的案例——移動的小車 318
8.10 固定三角形格線形狀類 324
8.10.1 固定三角形格線形狀類——
btGImpactMeshShape類 324
8.10.2 固定形狀物體案例 325
8.11 軟體 327
8.11.1 軟體幫助類——btSoftBody
Helps類 327
8.11.2 軟布案例 328
8.11.3 三角形格線軟體案例 331
8.11.4 繩索軟體案例 334
8.12 光線投射回調結構體 336
8.12.1 光線投射回調結構體
ClosestRayResultCallback 336
8.12.2 光線投射的案例——旋轉
光線 337
8.13 小結 339
第9章 骨骼動畫 340
9.1 自己開發骨骼動畫 340
9.1.1 骨骼動畫的基本原理 340
9.1.2 開發步驟 343
9.1.3 機器人模型在地面上運動時的問題 348
9.2 ms3d檔案的載入 351
9.2.1 ms3d檔案的格式 351
9.2.2 將3ds Max動畫檔案轉換為ms3d檔案 355
9.2.3 Java語言載入ms3d檔案案例的開發 359
9.2.4 C++語言載入ms3d檔案案例的開發 372
9.3 自定義格式骨骼動畫的載入 373
9.3.1 bnggdh檔案的格式 373
9.3.2 Bnggdh類 376
9.3.3 載入bnggdh檔案的案例 377
9.4 小結 379
第 10章 必知必會的開發技術—— 遊戲開發小貼士 380
10.1 3D拾取技術 380
10.1.1 3D拾取案例效果與基本
原理 380
10.1.2 開發步驟 382
10.2 多點觸控 386
10.2.1 多點觸控案例效果與基本
原理 386
10.2.2 開發步驟 387
10.3 多鍵監聽 389
10.3.1 案例效果與基本原理 389
10.3.2 開發步驟 390
10.4 小結 392
第 11章 讓套用運行更流暢——
性能最佳化 393
11.1 著色器的最佳化 393
11.1.1 計算量與計算頻率相關的
問題 393
11.1.2 其他需要注意的問題 394
11.2 紋理圖的最佳化 395
11.3 3D圖形繪製的最佳化 396
11.3.1 CPU階段的最佳化 396
11.3.2 幾何階段的最佳化 397
11.3.3 光柵化階段的最佳化 398
11.3.4 使用幀緩衝區對象時的性能
問題 398
11.3.5 儘量減少狀態的變化 399
11.4 圖元重啟 399
11.4.1 基本原理 399
11.4.2 一個簡單的案例 400
11.5 幾何體實例渲染 401
11.5.1 基本原理 401
11.5.2 一個簡單的案例 402
11.5.3 基於實例渲染的海量草地 403
11.6 著色器程式的外部載入 406
11.7 計算著色器的使用 409
11.7.1 基本知識 409
11.7.2 動態法向量光照水面
案例 413
11.8 小結 418
第 12章 雜項 419
12.1 遮擋查詢 419
12.1.1 相關方法 419
12.1.2 案例開發步驟 420
12.2 增強現實基礎 422
12.2.1 基本知識與案例效果 422
12.2.2 一個簡單的案例 423
12.3 保存螢幕圖像 426
12.4 讀取Android系統的GPU參數 428
12.5 多重採樣抗鋸齒 429
12.5.1 基本知識與案例效果 429
12.5.2 一個簡單的案例 430
12.6 小結 431
第 13章 Android NDK體育競技
遊戲——火力籃球 432
13.1 遊戲背景及功能簡述 432
13.1.1 背景概述 432
13.1.2 功能介紹 432
13.2 遊戲的策劃及準備工作 434
13.2.1 遊戲的策劃 434
13.2.2 Android平台下遊戲開發的
準備工作 435
13.3 遊戲的架構 436
13.3.1 各個類簡要介紹 436
13.3.2 遊戲的框架簡介 438
13.4 遊戲公共類 439
13.4.1 遊戲入口類——BasketBullet Activity 439
13.4.2 場景渲染類——
GL2JNIView 440
13.4.3 本地方法聲明及動態庫載入
類——JNIPort 442
13.4.4 現實本地方法的相關檔案
——jni_code.c 443
13.4.5 現實本地方法的相關檔案
——main.cpp 443
13.5 輔助界面相關類 446
13.5.1 著色器管理類——ShaderManager 446
13.5.2 著色器腳本的開發 448
13.5.3 資料庫工具類——
SQLiteUtil 452
13.5.4 紋理矩形類——
TextureRect 454
13.5.5 遊戲資源載入界面類——LoadingView 456
13.5.6 選單界面類——MenuView 458
13.5.7 記錄界面類——
RecordView 460
13.6 遊戲界面相關類 462
13.6.1 遊戲界面類——
GameView 462
13.6.2 牆面剛體封裝類——
TexCuboid 467
13.6.3 籃球剛體封裝類——
TexBall 468
13.6.4 任何形狀類——
AnyShapeByVectices 470
13.6.5 任何形狀剛體封裝類——
TexTriangleMesh 473
13.6.6 任何形狀軟體封裝類——
SoftObj 474
13.7 遊戲的最佳化及改進 476
第 14章 iOS休閒類遊戲——方塊翻轉 477
14.1 遊戲背景及功能概述 477
14.1.1 遊戲背景概述 477
14.1.2 遊戲功能介紹 477
14.2 遊戲的策劃及準備工作 480
14.2.1 遊戲的策劃 480
14.2.2 手機平台下遊戲的準備
工作 480
14.3 遊戲的架構 482
14.3.1 各個類簡要介紹 482
14.3.2 遊戲框架簡介 484
14.4 界面顯示類 485
14.4.1 GLView類 485
14.4.2 顯示界面類RenderingEngine2 486
14.4.3 遊戲界面類GameView 488
14.4.4 幫助界面類HelpView 491
14.5 輔助工具類 493
14.5.1 常量類Constant 493
14.5.2 計算交點坐標輔助類
IntersectantUtil 494
14.6 繪製相關類 495
14.6.1 3D模型繪製類的開發 495
14.6.2 2D物體繪製類的開發 500
14.7 遊戲的最佳化及改進 501
14.8 小結 502