本书是游戏编程畅销书作者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图形学感兴趣的人员阅读。
本书是游戏编程畅销书作者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图形学感兴趣的人员阅读。
作者简介 :
Andre LaMothe 有25年的计算行业从业经验,拥有数学、计算机科学和电子工程等学位,是20岁时就在NASA做研究工作的少数几人之一。在30岁之前,他在硅谷的众多公司中从事过咨询工作,了解了公司运作,获得了多种领域的知识,如电信、虚拟现实、机器人技术、编译器设计、3D引擎、人工智能以及计算和工程的其他领域的知识。
他创办的公司XTREME GAME公司一直是自成一体的游戏开发、发行商。后来他创办了XTREME
GAMES DEVELOPER CONFERENCE (XGDC),为游戏开发人员提供了费用更低廉的GDC替代品。
最近,他参与了多个项目的开发工作,其中包括EGAMEZONE NETWORKS——一个公平、有趣、没有任何广告的网络游戏分发系统。他还创建了一家新公司——NURVE NETWORKS公司,为在乎价格的消费者和业余爱好者开发手持设备上的视频游戏系统。最后,他还是世界上最庞大的游戏开发系列丛书的编辑。
目录 :
第一部分 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.5 DirectMusic API封装函数 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.3 3D球面坐标 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.11 FADD范例 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.3 3D变形 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.4 3D坦克演示程序 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缓存的新光栅化函数