第1章 概述 1
1.1 图形硬件和游戏发展史 1
1.2 本书版本与软件发展史 1
1.3 章节导读 2
第2章 图形系统 4
2.1 基础知识 4
2.1.1 坐标系 5
2.1.2 右手规则/左手规则和叉积计算 6
2.1.3 点和向量 9
2.2 转换操作 11
2.2.1 线性转换 11
2.2.2 仿射转换 19
2.2.3 透视转换 20
2.2.4 透视投影的特征 22
2.2.5 齐次点和矩阵 25
2.3 相机 28
2.3.1 透视相机模型 28
2.3.2 模型空间和对象空间 31
2.3.3 世界空间 31
2.3.4 视见空间、相机空间和眼睛空间 32
2.3.5 剪裁空间、投影空间或齐次空间 34
2.3.6 窗口空间 37
2.3.7 整合结果 38
2.4 剔除操作和剪裁操作 45
2.4.1 对象剔除操作 45
2.4.2 背面剔除 46
2.4.3 基于视锥体的剪裁操作 48
2.5 光栅化操作 53
2.5.1 直线段 53
2.5.2 圆形 57
2.5.3 椭圆 58
2.5.4 三角形 62
2.6 顶点属性 64
2.6.1 颜色 64
2.6.2 光照和材质 65
2.6.3 纹理 69
2.6.4 透明度和混合操作 80
2.6.5 雾效果 84
2.6.6 其他 85
2.6.7 光栅化属性 85
2.7 软件、硬件和API 86
2.7.1 概述 86
2.7.2 可移植性和性能 87
2.8 API规范 89
2.8.1 矩阵的表达和存储方式 89
2.8.2 矩阵累积计算 93
2.8.3 视见矩阵 93
2.8.4 投影矩阵 95
2.8.5 窗口坐标系 97
2.8.6 旋转操作 99
2.8.7 基于图形API的快速计算 100
第3章 渲染器 103
3.1 软件渲染 104
3.1.1 顶点着色器 104
3.1.2 背面剔除 106
3.1.3 剪裁操作 108
3.1.4 光栅化操作 111
3.1.5 边缓冲区 111
3.1.6 扫描线处理过程 113
3.1.7 像素着色器 115
3.1.8 模板缓冲机制 117
3.1.9 深度缓冲区 119
3.1.10 Alpha混合操作 120
3.1.11 颜色蒙版 120
3.1.12 纹理采样 121
3.1.13 帧缓冲区 122
3.2 硬件渲染 122
3.3 抽象渲染API 123
3.3.1 构造和析构 124
3.3.2 相机管理 125
3.3.3 全局状态管理 125
3.3.4 缓冲区清除操作 126
3.3.5 对象绘制 127
3.3.6 纹理和2D绘制 127
3.3.7 其他操作 128
3.3.8 资源管理 129
3.4 渲染器的核心内容 139
3.4.1 场景绘制 139
3.4.2 几何图元绘制 141
3.4.3 视效应用 143
3.4.4 加载和解析着色器程序 144
3.4.5 着色器程序的验证 153
第4章 场景图 157
4.1 场景图设计 157
4.1.1 核心类 160
4.1.2 空间层次结构设计 164
4.1.3 对象共享机制 166
4.2 几何状态 168
4.2.1 顶点缓冲区和索引缓冲区 168
4.2.2 转换操作 169
4.2.3 包围体 177
4.2.4 几何类型 182
4.3 渲染状态 188
4.3.1 全局状态 188
4.3.2 光照 190
4.3.3 视效 194
4.4 更新操作 195
4.4.1 几何状态更新 195
4.4.2 渲染状态更新 204
4.5 剔除操作 212
4.5.1 层次结构的剔除操作 215
4.5.2 基于排序的剔除操作 217
4.6 绘制操作 218
4.6.1 单路绘制操作 219
4.6.2 单一视效和多路绘制 222
4.6.3 多视效绘制操作 224
4.7 场景图编译器 225
4.7.1 基于表达式的场景图 226
4.7.2 编译语义 229
第5章 控制器动画 231
5.1 关键帧动画 232
5.1.1 位置插值 232
5.1.2 方向插值计算 233
5.1.3 缩放插值 233
5.2 关键帧压缩 234
5.2.1 基于B样条曲线的匹配点 235
5.2.2 B样条曲线计算 238
5.2.3 3阶优化计算 245
5.3 逆向动力学 249
5.3.1 基于Jacobian方法的数值方案 251
5.3.2 基于非线性优化的数值方案 252
5.3.3 基于循环坐标下降法的数值方案 252
5.4 蒙皮机制 255
5.5 顶点变形 257
5.6 粒子系统 258
第6章 空间排序 259
6.1 二叉空间划分树 259
6.1.1 构造BSP树 260
6.1.2 BSP树的应用 262
6.2 基于节点的排序 268
6.3 入口 269
6.4 用户自定义地图 276
6.5 遮挡剔除 276
第7章 细节级别 278
7.1 精灵对象和广告板 278
7.2 离散细节级别 279
7.3 连续细节级别 280
7.3.1 基于二次误差测度的简化方案 280
7.3.2 重组顶点和索引值 284
7.3.3 地形 284
7.4 无限细节级别 285
第8章 碰撞检测 286
8.1 分离轴方案 288
8.1.1 凸多边形和凸多面体极值 289
8.1.2 静态对象 296
8.1.3 基于恒定线速度的运动对象 302
8.1.4 有向包围盒 322
8.2 运动对象之间的碰撞计算 327
8.2.1 伪距离 328
8.2.2 运动对象之间的接触状态 329
8.2.3 计算首次碰撞时刻 331
8.2.4 一阶导数计算 334
8.3 动态碰撞检测系统 336
8.3.1 抽象基类 336
8.3.2 特定对象类型组合的伪距离 341
8.3.3 基于轴对齐包围盒的碰撞剔除 344
8.4 对象拾取操作 349
8.4.1 构造拾取光线 350
8.4.2 获取场景图的支持 351
8.4.3 维持相机高度 355
8.4.4 躲避行为 356
8.5 碰撞躲避路径 356
8.5.1 环境、关卡和房间 357
8.5.2 房间之间的运动行为 360
8.5.3 关卡之间的运动行为 361
8.5.4 室外环境中的运动 361
8.5.5 结构图(蓝图) 361
8.5.6 可视图 362
8.5.7 构建轮廓边 365
8.5.8 基本数据结构 372
8.5.9 可视图的高效计算方案 372
第9章 物理学 375
9.1 粒子系统 375
9.2 质体-弹簧系统 377
9.2.1 曲线质体 377
9.2.2 表面质体 379
9.2.3 空间质体 381
9.2.4 任意结构对象 384
9.3 变形体 386
9.4 刚体 386
9.4.1 刚体类 388
9.4.2 计算惯性张量 391
第10章 标准对象 392
10.1 线性对象 392
10.2 平面对象 394
10.3 盒体对象 396
10.4 二次曲面 396
10.4.1 球体 396
10.4.2 椭球体 396
10.4.3 圆柱体 397
10.4.4 圆锥体 398
10.5 球扫掠体 399
10.5.1 胶囊体 399
10.5.2 菱形体 399
第11章 曲线 400
11.1 定义 400
11.2 基于弧长的参数重置操作 401
11.3 Bezier曲线 402
11.3.1 定义 402
11.3.2 计算过程 403
11.3.3 升阶计算 403
11.3.4 降阶计算 404
11.4 自然、钳式以及封闭式三次样条 405
11.4.1 自然曲线 406
11.4.2 钳式样条 406
11.4.3 封闭样条 407
11.5 B样条曲线 407
11.5.1 节点向量类型 408
11.5.2 计算过程 408
11.5.3 局部控制 413
11.5.4 封闭曲线 413
11.6 NURBS曲线 414
11.7 张力-连续性-偏移样条 416
11.8 参数细分 418
11.8.1 基于均匀采样的细分方案 418
11.8.2 基于弧长的细分方案 418
11.8.3 基于中点距离的细分方案 419
11.8.4 基于三次曲线的快速细分方案 420
11.9 曲线路径上对象的方向 421
11.9.1 基于Frenet坐标系的方向 422
11.9.2 基于固定Up向量的方向 422
第12章 曲面 423
12.1 简介 423
12.2 Bezier矩形面片 424
12.2.1 定义 424
12.2.2 计算过程 424
12.2.3 升阶计算 425
12.2.4 降阶计算 425
12.3 Bezier三角形面片 426
12.3.1 定义 426
12.3.2 计算过程 428
12.3.3 升阶计算 428
12.3.4 降阶计算 428
12.4 B样条矩形面片 430
12.5 NURBS矩形面片 430
12.6 基于曲线的表面构造过程 431
12.6.1 柱面 431
12.6.2 广义柱面 432
12.6.3 旋转曲面 433
12.6.4 管状表面 433
12.7 参数细分 434
12.7.1 矩形面片细分 434
12.7.2 三角形面片的细分操作 443
第13章 包含测试 449
13.1 球体 449
13.1.1 球体中的点 449
13.1.2 包含数据点的球体 449
13.1.3 合并球体 454
13.2 盒体 455
13.2.1 盒体中的点 455
13.2.2 包含点的盒体 455
13.2.3 合并盒体 461
13.3 胶囊体 462
13.3.1 胶囊体中的点 463
13.3.2 包含点的胶囊体 463
13.4 菱形体 465
13.4.1 菱形体中的点 465
13.4.2 包含点的菱形体 465
13.4.3 菱形体的合并操作 466
13.5 圆柱体 467
13.5.1 圆柱体中的点 467
13.5.2 包含点的圆柱体 467
13.5.3 移至最小面积中心处的最小二乘直线 468
13.5.4 圆柱体合并操作 468
13.6 椭球体 469
13.6.1 椭球体中的点 469
13.6.2 包含点的椭球体 470
13.6.3 椭球体的合并操作 470
第14章 距离计算方案 471
14.1 点与线性对象之间的距离 471
14.1.1 点与直线之间的距离 471
14.1.2 点与射线之间的距离 472
14.1.3 点与线段之间的距离 472
14.2 线性对象至线性对象之间的距离 473
14.2.1 直线与直线之间的距离 473
14.2.2 直线与射线之间的距离 474
14.2.3 直线与线段之间的距离 475
14.2.4 射线与射线之间的距离 475
14.2.5 射线与线段之间的距离 476
14.2.6 线段与线段之间的距离 476
14.3 点与三角形之间的距离 477
14.4 线性对象与三角形之间的距离 480
14.4.1 直线与三角形之间的距离 480
14.4.2 射线与三角形之间的距离 483
14.4.3 线段与三角形之间的距离 483
14.5 点与矩形之间 484
14.6 线性对象与矩形之间的距离 485
14.6.1 直线与矩形之间的距离 485
14.6.2 射线与矩形之间的距离 487
14.6.3 线段与矩形之间的距离 488
14.7 三角形(或矩形)与三角形(或矩形)之间的距离 488
14.8 点和有向盒体之间的距离 490
14.9 线性对象与有向盒体之间的距离 491
14.9.1 直线与有向盒体之间的距离 491
14.9.2 射线与有向盒体之间的距离 493
14.9.3 线段与有向盒体之间的距离 493
14.10 三角形与有向盒体之间的距离 494
14.11 矩形和有向盒体之间的距离 495
14.12 有向盒体与有向盒体之间的距离 496
14.13 混合方案 498
14.13.1 点与椭圆之间的距离 498
14.13.2 点与椭球体之间的距离 499
14.13.3 点与二次曲线或二次表面之间的距离 499
14.13.4 点与3D圆之间的距离 500
14.13.5 圆与3D圆之间的距离 501
第15章 相交计算 504
15.1 线性对象和凸对象 504
15.2 线性对象和平面对象 506
15.3 线性对象和有向盒体 508
15.3.1 相交测试查询 508
15.3.2 相交信息查询 513
15.4 线性对象和球体 517
15.4.1 直线和球体 517
15.4.2 射线和球体 519
15.4.3 线段和球体 519
15.5 直线和球体扫掠体 521
15.5.1 直线和胶囊体 521
15.5.2 直线和菱形体 524
15.6 直线和二次表面 525
15.6.1 直线和椭球体 526
15.6.2 直线和圆柱体 526
15.6.3 直线和圆锥体 526
15.7 基于平面的对象剔除操作 527
15.7.1 有向盒体 527
15.7.2 球体 528
15.7.3 胶囊体 528
15.7.4 菱形体 528
15.7.5 椭球体 529
15.7.6 圆柱体 530
15.7.7 圆锥体 531
15.7.8 凸多边形或凸多面体 532
第16章 数值方案 533
16.1 方程组 533
16.1.1 线性方程组 533
16.1.2 多项式方程组 533
16.2 特征系统 535
16.2.1 二次多项式的极值 535
16.2.2 约束型二次多项式的极值 535
16.3 最小二乘匹配方案 536
16.3.1 点(x,f(x))的匹配方案 537
16.3.2 基于正交回归的线性匹配方案 537
16.3.3 平面点(x,y,f(x,y))的平面匹配方案 538
16.3.4 基于正交回归的数据点的平面匹配方案 539
16.3.5 圆与2D数据点之间的匹配方案 539
16.3.6 球体与3D数据点之间的匹配方案 540
16.3.7 二次曲线与2D数据点之间的匹配方案 542
16.3.8 二次曲面与3D数据点之间的匹配方案 542
16.4 最小化计算 543
16.4.1 一维方案 543
16.4.2 多维处理方案 544
16.5 根值计算 546
16.5.1 一维方案 546
16.5.2 多维方案 549
16.6 积分运算 550
16.6.1 Romberg积分 550
16.6.2 Gaussian求积法 553
16.7 微分方程 554
16.7.1 常微分方程 554
16.7.2 偏微分方程 556
16.8 快速函数计算 559
16.8.1 平方根以及平方根倒数运算 559
16.8.2 正弦、余弦和正切运算 560
16.8.3 反正切运算 561
第17章 旋转计算 562
17.1 旋转矩阵 562
17.1.1 轴/角-矩阵 562
17.1.2 矩阵-轴/角 564
17.1.3 插值计算 565
17.2 四元数 565
17.2.1 四元数的线性代数观点 567
17.2.2 向量旋转 569
17.2.3 旋转积 569
17.2.4 四元数的古典观 570
17.2.5 轴/角-四元数 572
17.2.6 四元数-轴/角 572
17.2.7 矩阵-四元数 572
17.2.8 四元数-矩阵 572
17.2.9 插值计算 573
17.3 Euler角 573
17.4 性能问题 575
17.5 非均匀缩放 576
17.5.1 Gram-Schmidt标准正交法 577
17.5.2 特征分解 578
17.5.3 极分解法 578
17.5.4 奇异值分解法 578
第18章 面向对象结构 580
18.1 面向对象的软件设计 580
18.1.1 软件质量 580
18.1.2 模块化 581
18.1.3 复用 582
18.1.4 函数和数据 583
18.1.5 面向对象 584
18.2 风格、命名规则和命名空间 584
18.3 运行期类型信息 587
18.3.1 单继承系统 587
18.3.2 多重继承系统 590
18.3.3 宏 592
18.4 模板 592
18.5 共享对象和引用计数 594
18.6 流机制 599
18.6.1 流API 600
18.6.2 Object类API 602
18.7 名称和唯一标识符 608
18.7.1 名称字符串 608
18.7.2 唯一标识符 609
18.8 初始化和终止操作 610
18.8.1 潜在问题 610
18.8.2 基于类的通用处理方案 613
18.9 应用程序层 617
18.9.1 处理命令行参数 618
18.9.2 Application类 621
18.9.3 ConsoleApplication类 624
18.9.4 WindowApplication类 626
18.9.5 WindowApplication3类 632
18.9.6 引擎管理 646
第19章 内存管理 651
19.1 游戏机内存预算 651
19.2 内存泄露检测和收集统计信息 652
19.3 通用内存管理 658
19.3.1 基于顺序适配的内存请求 658
19.3.2 基于伙伴系统的分配方案 665
19.3.3 基于分离存储方案的内存分配 668
19.3.4 内存压缩 668
第20章 基于着色器的特效 670
20.1 顶点颜色 670
20.2 光照和材质 671
20.2.1 环境光 673
20.2.2 有向光源 673
20.2.3 点光源 675
20.2.4 聚光灯 676
20.3 纹理 679
20.4 多重纹理 680
20.5 凹凸贴图 682
20.5.1 生成法线贴图 682
20.5.2 生成切空间信息 684
20.5.3 着色器程序 685
20.6 光泽贴图 688
20.7 球体贴图 690
20.8 立方体贴图 692
20.9 折射 695
20.10 平面反射 697
20.11 平面阴影 700
20.12 投影纹理 703
20.13 阴影贴图 706
20.14 体积雾 707
20.15 蒙皮机制 708
20.16 虹彩效果 710
20.17 水流效果 712
附录A 在Wild Magic中生成着色器 714
A.1 着色器程序 714
A.2 创建几何数据 719
A.3 着色器效果(不使用类数据) 721
A.4 创建ShaderEffect的派生类 723
A.5 着色器常量的动态更新 724
参考文献 725