3D遊戲編程大師技巧

3D遊戲編程大師技巧

一本講述3D遊戲編程的專業書籍。

基本信息

概述

本書是遊戲編程暢銷書作者André LaMothe的扛鼎之作,從遊戲編程和軟體引擎的角度深入探討了3D圖形學的各個重要主題。全書共分5部分,包括16章的內容。第1~3章簡要地介紹了Windows和DirectX編程,創建了一個Windows應用程式模板,讓讀者能夠將精力放在遊戲邏輯和圖形實現中,而不用考慮Windows和DirectX方面的瑣事;第4~5章簡要地介紹了一些數學知識並實現了一個數學庫,供以後編寫演示程式時使用;第6章概述了3D圖形學,讓讀者對本書將介紹的內容有大致的了解;第7~11章分別介紹了光照、明暗處理、仿射紋理映射、3D裁剪和深度快取等內容;第12~14章討論了高級3D渲染技術,包括透視修正紋理映射、Alpha混合、1/Z快取、紋理濾波、空間劃分和可見性算法、陰影、光照映射等;第15~16章討論了動畫、運動碰撞檢測和最佳化技術。

本書適合於有一定編程經驗並想從事遊戲編程工作或對3D圖形學感興趣的人員閱讀。

目錄

第一部分 3D遊戲編程簡介

第1章 3D遊戲編程入門2

1.1 簡介 2

1.2 2D/3D遊戲的元素 3

1.2.1 初始化 3

1.2.2 進入遊戲循環 3

1.2.3 讀取玩家輸入 4

1.2.4 執行AI和遊戲邏輯 4

1.2.5 渲染下一幀 4

1.2.6 同步顯示 4

1.2.7 循環 4

1.2.8 關閉 5

1.3 通用遊戲編程指南 7

1.4 使用工具 9

1.4.1 3D關卡編輯器 12

1.4.2 使用編譯器 13

1.5 一個3D遊戲範例:Raiders 3D 15

1.5.1 事件循環 33

1.5.2 核心3D遊戲邏輯 34

1.5.3 3D投影 35

1.5.4 星空 36

1.5.5 雷射炮和碰撞檢測 37

1.5.6 爆炸 37

1.5.7 玩Raiders3D 37

1.6 總結 37

第2章 Windows和DirectX簡明教程 38

2.1 Win32編程模型 38

2.2 Windows程式的最小需求 39

2.3 一個基本的Windows應用程式 43

2.3.1 Windows類 43

2.3.2 註冊Windows類 47

2.3.3 創建視窗 47

2.3.4 事件處理程式 48

2.3.5 主事件循環 52

2.3.6 構建實時事件循環 55

2.4 DirectX和COM簡明教程 56

2.4.1 HEL和HAL 57

2.4.2 DirectX基本類 58

2.5 COM簡介 59

2.5.1 什麼是COM對象 60

2.5.2 創建和使用DirectX COM接口 61

2.5.3 查詢接口 62

2.6 總結 64

第3章 使用虛擬計算機進行3D遊戲編程 65

3.1 虛擬計算機接口簡介 65

3.2 建立虛擬計算機接口 66

3.2.1 幀快取和視頻系統 66

3.2.2 使用顏色 70

3.2.3 快取交換 71

3.2.4 完整的虛擬圖形系統 73

3.2.5 I/O、聲音和音樂 73

3.3 T3DLIB遊戲控制台 74

3.3.1 T3DLIB系統概述 74

3.3.2 基本遊戲控制台 74

3.4 T3DLIB1庫 79

3.4.1 DirectX圖形引擎體系結構 79

3.4.2 基本常量 79

3.4.3 工作宏 81

3.4.4 數據類型和結構 81

3.4.5 函式原型 84

3.4.6 全局變數 88

3.4.7 DirectDraw接口 89

3.4.8 2D多邊形函式 92

3.4.9 數學函式和錯誤函式 97

3.4.10 點陣圖函式 99

3.4.11 8位調色板函式 102

3.4.12 實用函式 104

3.4.13 BOB(Blitter對象)引擎 106

3.5 T3DLIB2 DirectX輸入系統 112

3.6 T3DLIB3聲音和音樂庫 116

3.6.1 頭檔案 117

3.6.2 類型 117

3.6.3 全局變數 117

3.6.4 DirectSound API封裝函式 118

3.6.5DirectMusicAPI封裝函式 121

3.7 建立最終的T3D遊戲控制台 124

3.7.1 映射真實圖形到虛擬接口的非真實圖形 124

3.7.2 最終的T3DLIB遊戲控制台 126

3.8 範例T3LIB應用程式 134

3.8.1 視窗應用程式 134

3.8.2 全螢幕應用程式 135

3.8.3 聲音和音樂 136

3.8.4 處理輸入 136

3.9 總結 139

第二部分 3D數學和變換

第4章 三角學、向量、矩陣和四元數 142

4.1 數學表示法 142

4.2 2D坐標系 143

4.2.1 2D笛卡爾坐標 143

4.2.2 2D極坐標 144

4.3 3D坐標系 147

4.3.1 3D笛卡爾坐標 147

4.3.2 3D柱面坐標 149

4.3.33D球面坐標 150

4.4 三角學 151

4.4.1 直角三角形 151

4.4.2 反三角函式 153

4.4.3 三角恆等式 153

4.5 向量 154

4.5.1 向量長度 155

4.5.2 歸一化 155

4.5.3 向量和標量的乘法 155

4.5.4 向量加法 156

4.5.5 向量減法 157

4.5.6 點積 157

4.5.7 叉積 159

4.5.8 零向量 160

4.5.9 位置和位移向量 160

4.5.10 用線性組合表示的向量 161

4.6 矩陣和線性代數 161

4.6.1 單位矩陣 162

4.6.2 矩陣加法 163

4.6.3 矩陣的轉置 163

4.6.4 矩陣乘法 164

4.6.5 矩陣運算滿足的定律 165

4.7 逆矩陣和方程組求解 165

4.7.1 克來姆法則 167

4.7.2 使用矩陣進行變換 168

4.7.3 齊次坐標 169

4.7.4 套用矩陣變換 170

4.8 基本幾何實體 176

4.8.1 點 176

4.8.2 直線 176

4.8.3 平面 179

4.9 使用參數化方程 182

4.9.1 2D參數化直線 182

4.9.2 3D參數化直線 184

4.10 四元數簡介 189

4.10.1 複數理論 189

4.10.2超複數193

4.10.3 四元數的套用 197

4.11 總結 200

第5章 建立數學引擎 201

5.1 數學引擎概述 201

5.1.1 數學引擎的檔案結構 201

5.1.2 命名規則 202

5.1.3 錯誤處理 203

5.1.4 關於C++的最後說明 203

5.2 數據結構和類型 203

5.2.1 向量和點 203

5.2.2 參數化直線 204

5.2.3 3D平面 206

5.2.4 矩陣 206

5.2.5 四元數 209

5.2.6 角坐標系支持 210

5.2.7 2D極坐標 210

5.2.8 3D柱面坐標 211

5.2.9 3D球面坐標 211

5.2.10 定點數 212

5.3 數學常量 213

5.4 宏和內聯函式 214

5.4.1 通用宏 218

5.4.2 點和向量宏 218

5.4.3 矩陣宏 219

5.4.4 四元數 220

5.4.5 定點數宏 221

5.5 函式原型 221

5.6 全局變數 224

5.7 數學引擎API清單 225

5.7.1 三角函式 225

5.7.2 坐標系支持函式 226

5.7.3 向量支持函式 228

5.7.4 矩陣支持函式 235

5.7.5 2D和3D參數化直線支持函式 245

5.7.6 3D平面支持函式 248

5.7.7 四元數支持函式 252

5.7.8 定點數支持函式 259

5.7.9 方程求解支持函式 263

5.8 浮點單元運算初步 265

5.8.1 FPU體系結構 266

5.8.2 FPU堆疊 266

5.8.3 FPU指令集 268

5.8.4 經典指令格式 270

5.8.5 記憶體指令格式 271

5.8.6 暫存器指令格式 271

5.8.7 暫存器彈出指令格式 271

5.8.8 FPU範例 271

5.8.9 FLD範例 272

5.8.10 FST範例 272

5.8.11FADD範例 273

5.8.12 FSUB範例 275

5.8.13 FMUL範例 276

5.8.14 FDIV範例 278

5.9 數學引擎使用說明 279

5.10 關於數學最佳化的說明 280

5.11 總結 280

第6章 3D圖形學簡介 282

6.1 3D引擎原理 282

6.2 3D遊戲引擎的結構 282

6.2.1 3D引擎 283

6.2.2 遊戲引擎 283

6.2.3 輸入系統和網路 284

6.2.4 動畫系統 284

6.2.5 碰撞檢測和導航系統 287

6.2.6 物理引擎 288

6.2.7 人工智慧系統 289

6.2.8 3D模型和圖像資料庫 289

6.3 3D坐標系 291

6.3.1 模型(局部)坐標 291

6.3.2 世界坐標 293

6.3.3 相機坐標 296

6.3.4 有關相機坐標的說明 302

6.3.5 隱藏物體(面)消除和裁剪 303

6.3.6 透視坐標 308

6.3.7 流水線終點:螢幕坐標 315

6.4 基本的3D數據結構 321

6.4.1 表示3D多邊形數據時需要考慮的問題 322

6.4.2 定義多邊形 323

6.4.3 定義物體 327

6.4.4 表示世界 330

6.5 3D工具 331

6.6 從外部載入數據 332

6.6.1 PLG檔案 333

6.6.2 NFF檔案 335

6.6.3 3D Studio檔案 338

6.6.4 Caligari COB檔案 343

6.6.5 Microsoft DirectX .X檔案 345

6.6.6 3D檔案格式小結 345

6.7 基本剛性變換和動畫 345

6.7.1 3D平移 345

6.7.2 3D鏇轉 346

6.7.33D變形347

6.8 再看觀察流水線 348

6.9 3D引擎類型 349

6.9.1 太空引擎 349

6.9.2 地形引擎 350

6.9.3 FPS室內引擎 351

6.9.4 光線投射和體素引擎 352

6.9.5 混合引擎 353

6.10 將各種功能集成到引擎中 353

6.11 總結 353

第7章 渲染3D線框世界 354

7.1 線框引擎的總體體系結構 354

7.1.1 數據結構和3D流水線 355

7.1.2 主多邊形列表 357

7.1.3 新的軟體模組 359

7.2 編寫3D檔案載入器 359

7.3 構建3D流水線 367

7.3.1 通用變換函式 367

7.3.2 局部坐標到世界坐標變換 372

7.3.3 歐拉相機模型 375

7.3.4 UVN相機模型 377

7.3.5 世界坐標到相機坐標變換 387

7.3.6 物體剔除 390

7.3.7 背面消除 393

7.3.8 相機坐標到透視坐標變換 395

7.3.9 透視坐標到螢幕(視口)坐標變換 399

7.3.10 合併透視變換和螢幕變換 403

7.4 渲染3D世界 405

7.5 3D演示程式 408

7.5.1 單個3D三角形 408

7.5.2 3D線框立方體 411

7.5.3 消除了背面的3D線框立方體 413

7.5.43D坦克演示程式 414

7.5.5 相機移動的3D坦克演示程式 416

7.5.6 戰區漫步演示程式 418

7.6 總結 421

第三部分 基本3D渲染

第8章 基本光照和實體造型 424

8.1 計算機圖形學的基本光照模型 424

8.1.1 顏色模型和材質 426

8.1.2 光源類型 432

8.2 三角形的光照計算和光柵化 437

8.2.1 為光照做準備 441

8.2.2 定義材質 442

8.2.3 定義光源 445

8.3 真實世界中的著色 449

8.3.1 16位著色 449

8.3.2 8位著色 450

8.3.3 一個健壯的用於8位模式的RGB模型450

8.3.4 一個簡化的用於8位模式的強度模型 453

8.3.5 固定著色 457

8.3.6 恆定著色 459

8.3.7 Gouraud著色概述 472

8.3.8 Phong著色概述 474

8.4 深度排序和畫家算法475

8.5 使用新的模型格式 479

8.5.1 分析器類 479

8.5.2 輔助函式 482

8.5.3 3D Studio MAX ASCII格式.ASC 484

8.5.4 TrueSpace ASCII.COB格式 486

8.5.5 Quake II二進制.MD2格式概述 494

8.6 3D建模工具簡介 495

8.7 總結 497

第9章 插值著色技術和仿射紋理映射 498

9.1 新T3D引擎的特性 498

9.2 更新T3D數據結構和設計 499

9.2.1 新的#defines 499

9.2.2 新增的數學結構 501

9.2.3 實用宏 502

9.2.4 添加表示3D格線數據的特性 503

9.2.5 更新物體結構和渲染列表結構 508

9.2.6 函式清單和原型 511

9.3 重新編寫物體載入函式 517

9.3.1 更新.PLG/PLX載入函式 517

9.3.2 更新3D Studio .ASC載入函式 527

9.3.3 更新Caligari .COB載入函式 528

9.4 回顧多邊形的光柵化 532

9.4.1 三角形的光柵化 532

9.4.2 填充規則 535

9.4.3 裁剪 537

9.4.4 新的三角形渲染函式 538

9.4.5 最佳化 542

9.5 實現Gouraud著色處理 543

9.5.1 沒有光照時的Gouraud著色 544

9.5.2 對使用Gouraud Shader的多邊形執行光照計算 553

9.6 基本採樣理論 560

9.6.1 一維空間中的採樣 560

9.6.2雙線性插值561

9.6.3 u和v的插值 563

9.6.4 實現仿射紋理映射 564

9.7 更新光照/光柵化引擎以支持紋理 566

9.8 對8位和16位模式下最佳化策略的最後思考 571

9.8.1 查找表 571

9.8.2 格線的頂點結合性 572

9.8.3 存儲計算結果 572

9.8.4 SIMD 573

9.9 最後的演示程式 573

9.10 總結 576

第10章 3D裁剪 577

10.1 裁剪簡介 577

10.1.1 物體空間裁剪 577

10.1.2 圖像空間裁剪 580

10.2 裁剪算法 581

10.2.1 有關裁剪的基本知識 581

10.2.2 Cohen-Sutherland裁剪算法 585

10.2.3 Cyrus-Beck/梁友棟-Barsky裁剪算法 586

10.2.4 Weiler-Atherton裁剪算法 588

10.2.5 深入學習裁剪算法 590

10.3 實現視景體裁剪 591

10.3.1 幾何流水線和數據結構 592

10.3.2 在引擎中加入裁剪功能 593

10.4 地形小議 611

10.4.1 地形生成函式 612

10.4.2 生成地形數據 619

10.4.3 沙地汽車演示程式 619

10.5 總結 623

第11章 深度快取和可見性 624

11.1 深度快取和可見性簡介 624

11.2 z快取基礎 626

11.2.1 z快取存在的問題 627

11.2.2 z快取範例 627

11.2.3平面方程法 630

11.2.4 z坐標插值 631

11.2.5 z快取中的問題和1/z快取 632

11.2.6 一個通過插值計算z和1/z的例子 633

11.3 創建z快取系統 635

11.4 可能的z快取最佳化 649

11.4.1 使用更少的記憶體 649

11.4.2 降低清空z快取的頻率 650

11.4.3 混合z快取 651

11.5 z快取存在的問題 651

11.6 軟體和z快取演示程式 652

11.6.1 演示程式I:z快取可視化 652

11.6.2 演示程式II:Wave Raider 653

11.7 總結 658

第四部分 高級3D渲染

第12章 高級紋理映射技術 660

12.1 紋理映射——第二波 660

12.2 新的光柵化函式 667

12.2.1 最終決定使用定點數 667

12.2.2 不使用z快取的新光柵化函式 668

12.2.3 支持z快取的新光柵化函式 670

12.3 使用Gouruad著色的紋理映射 671

12.4 透明度和alpha混合 677

12.4.1 使用查找表來進行alpha混合 678

12.4.2 在物體級支持alpha混合功能 688

12.4.3 在地形生成函式中加入

alpha支持 694

12.5 透視修正紋理映射和1/z快取 696

12.5.1 透視紋理映射的數學基礎 696

12.5.2 在光柵化函式中加入1/z快取功能 702

12.5.3 實現完美透視修正紋理映射 707

12.5.4 實現線性分段透視修正紋理映射 710

12.5.5 透視修正紋理映射的二次近似 714

12.5.6 使用混合方法最佳化紋理映射 718

12.6 雙線性紋理濾波 719

12.7 Mipmapping和三線性紋理濾波 724

12.7.1 傅立葉分析和走樣簡介 725

12.7.2 創建Mip紋理鏈 727

12.7.3 選擇mip紋理 734

12.7.4 三線性濾波 739

12.8 多次渲染和紋理映射 740

12.9 使用單個函式來完成渲染工作 741

12.9.1 新的渲染場境 741

12.9.2 設定渲染場境 743

12.9.3 調用對渲染場境進行渲染的函式 745

12.10 總結 753

第13章 空間劃分和可見性算法 754

13.1 新的遊戲引擎模組 754

13.2 空間劃分和可見面判定簡介 754

13.3 二元空間劃分 757

13.3.1 平行於坐標軸的二元空間劃分 758

13.3.2 任意平面空間劃分 759

13.3.3 使用多邊形所在的平面來劃分空間 760

13.3.4 顯示/訪問BSP樹中的每個節點 762

13.3.5 BSP樹數據結構和支持函式 763

13.3.6 創建BSP樹 765

13.3.7 分割策略 767

13.3.8 遍歷和顯示BSP樹 775

13.3.9 將BSP樹集成到圖形流水線中 784

13.3.10 BSP關卡編輯器 785

13.3.11 BSP的局限性 793

13.3.12 使用BSP樹的零重繪策略 794

13.3.13 將BSP樹用於剔除 795

13.3.14 將BSP樹用於碰撞檢測 802

13.3.15 集成BSP樹和標準渲染 802

13.4 潛在可見集 807

13.4.1 使用潛在可見集 808

13.4.2 潛在可見集的其他編碼方法 809

13.4.3 流行的PVS計算方法 810

13.5 入口 811

13.6 包圍體層次結構和八叉樹813

13.6.1 使用BHV樹 815

13.6.2 運行性能 816

13.6.3 選擇策略 817

13.6.4 實現BHV 818

13.6.5 八叉樹 825

13.7 遮掩剔除 825

13.7.1 遮掩體 826

13.7.2 選擇遮掩物 826

13.7.3 混合型遮掩物選擇方法 827

13.8 總結 827

第14章 陰影和光照映射 828

14.1 新的遊戲引擎模組 828

14.2 概述 828

14.3 簡化的陰影物理學 829

14.4 使用透視圖像和廣告牌來模擬陰影 832

14.4.1 編寫支持透明功能的光柵化函式 833

14.4.2 新的庫模組 835

14.4.3 簡單陰影 837

14.4.4 縮放陰影 839

14.4.5 跟蹤光源 841

14.4.6 有關模擬陰影的最後思考 844

14.5 平面格線陰影映射 845

14.5.1 計算投影變換 845

14.5.2 最佳化平面陰影 848

14.6 光照映射和面快取技術簡介 848

14.6.1 面快取技術 850

14.6.2 生成光照圖 850

14.6.3 實現光照映射函式 851

14.6.4 暗映射(dark mapping) 853

14.6.5 光照圖特效 854

14.6.6 最佳化光照映射代碼 854

14.7 整理思路 854

14.8 總結 854

第五部分 高級動畫、物理建模和最佳化

第15章3D角色動畫、運動和碰撞檢測 858

15.1 新的遊戲引擎模組 858

15.2 3D動畫簡介 858

15.3 Quake II .MD2檔案格式 859

15.3.1 .MD2檔案頭 861

15.3.2 載入Quake II .MD2檔案 868

15.3.3 使用.MD2檔案實現動畫 874

15.3.4 .MD2演示程式 882

15.4 不基於角色的簡單動畫 883

15.4.1 鏇轉運動和平移運動 883

15.4.2 複雜的參數化曲線移動 885

15.4.3 使用腳本來實現運動 885

15.5 3D碰撞檢測 887

15.5.1 包圍球和包圍圓柱 887

15.5.2 使用數據結構來提高碰撞檢測的速度 888

15.5.3 地形跟蹤技術 889

15.6 總結 890

第16章 最佳化技術 891

16.1 最佳化技術簡介 891

16.2 使用Microsoft Visual C++和Intelvtune剖析代碼 892

16.2.1 使用Visual C++進行剖析 892

16.2.2 分析剖析數據 893

16.2.3 使用VTune進行最佳化 894

16.3 使用Intel C++編譯器 899

16.3.1 下載Intel的最佳化編譯器 900

16.3.2 使用Intel編譯器 900

16.3.3 使用編譯器選項 901

16.3.4 手工為源檔案選擇編譯器 901

16.3.5 最佳化策略 902

16.4 SIMD編程初步 902

16.4.1 SIMD基本體系結構 903

16.4.2 使用SIMD 903

16.4.3 一個SIMD 3D向量類 912

16.5 通用最佳化技巧 918

16.5.1 技巧1:消除_ftol() 918

16.5.2 技巧2:設定FPU控制字 918

16.5.3 技巧3:快速將浮點變數設定為零 919

16.5.4 技巧4:快速計算平方根 919

16.5.5 技巧5:分段線性反正切 920

16.5.6 技巧6:指針遞增運算 920

16.5.7 技巧7:儘可能將if語句放在循環外面 921

16.5.8 技巧8:支化(branching)流水線 921

16.5.9 技巧9:數據對齊 921

16.5.10 技巧10:將所有簡短函式都聲明為內聯的 922

16.5.11 參考文獻 922

16.6 總結 922

第六部分 附錄

附錄A 光碟內容簡介 CD: 924

附錄B 安裝DirectX和使用Visual C/C++ CD: 925

B.1 安裝DirectX CD: 925

B.2 使用Visual C/C++編譯器 CD: 925

B.3 編譯提示 CD: 926

附錄C 三角學和向量參考 CD: 927

C.1 三角學 CD: 927

C.2 向量 CD: 929

C.2.1 向量長度 CD: 930

C.2.2 歸一化 CD: 930

C.2.3 標量乘法 CD: 930

C.2.4 向量加法 CD: 931

C.2.5 向量減法 CD: 931

C.2.6 點積 CD: 932

C.2.7 叉積 CD: 933

C.2.8 零向量 CD: 934

C.2.9 位置向量 CD: 934

C.2.10 向量的線性組合 CD: 934

附錄D C++入門 CD: 935

D.1 C++是什麼 CD: 935

D.2 必須掌握的C++知識 CD: 937

D.3 新的類型、關鍵字和約定 CD: 937

D.3.1 注釋符 CD: 937

D.3.2 常量 CD: 937

D.3.3 引用型變數 CD: 938

D.3.4 即時創建變數 CD: 938

D.4 記憶體管理 CD: 939

D.5 流式輸入/輸出 CD: 939

D.6 類 CD: 941

D.6.1 新結構 CD: 941

D.6.2 一個簡單的類 CD: 942

D.6.3 公有和私有 CD: 942

D.6.4 類的成員函式(方法) CD: 943

D.6.5 構造函式和析構函式 CD: 944

D.6.6 編寫構造函式 CD: 945

D.6.7 編寫析構函式 CD: 946

D.7 域運算符 CD: 947

D.8 函式和運算符重載 CD: 948

D.9 基本模板 CD: 950

D.10 異常處理簡介 CD: 951

D.11 總結 CD: 954

附錄E 遊戲編程資源 CD: 955

E.1 遊戲編程和新聞網站 CD: 955

E.2 下載站點 CD: 955

E.3 2D/3D引擎 CD: 956

E.4 遊戲編程書籍 CD: 956

E.5 微軟公司的Direct X 多媒體展示 CD: 956

E.6 新聞組 CD: 957

E.7 跟上行業的步伐 CD: 957

E.8 遊戲開發雜誌 CD: 957

E.9 Quake資料 CD: 957

E.10 免費模型和紋理 CD: 957

E.11 遊戲網站開發者 CD: 957

附錄F ASCII碼錶 CD: 959

相關詞條

相關搜尋

熱門詞條

聯絡我們