第1章 相关数学知识回顾 1
1.1 三维坐标系 1
1.2 三维空间向量 2
1.2.1 获取向量长度——求模 2
1.2.2 向量与标量相乘 3
1.2.3 向量规范化 3
1.2.4 向量的加法运算 3
1.2.5 向量的减法运算 3
1.2.6 向量的点积运算 4
1.2.7 向量的叉积运算 4
1.3 矩阵 5
1.3.1 方阵 6
1.3.2 矩阵的基本运算 7
1.3.3 逆矩阵 8
1.3.4 矩阵转置 9
1.4 几何变换 9
1.4.1 齐次坐标 9
1.4.2 基本变换矩阵 10
1.4.3 组合变换矩阵 12
1.5 几何图元 16
1.5.1 表示方法 16
1.5.2 直线和射线 16
1.5.3 球 18
1.5.4 矩形边界框 18
1.5.5 平面 19
1.5.6 三角形 20
第2章 Windows编程必备知识 22
2.1 Windows程序运行机制 22
2.1.1 API与SDK 22
2.1.2 窗口与句柄 23
2.1.3 消息与消息队列 24
2.1.4 WinMain函数 25
2.2 创建一个Windows程序 26
2.2.1 设计Windows类 26
2.2.2 注册Windows类 29
2.2.3 创建窗口 29
2.2.4 显示及更新窗口 31
2.2.5 消息循环 32
2.2.6 窗口过程函数 35
第3章 DirectX及其API 37
3.1 DirectX概述 37
3.1.1 DirectX的发展历史 38
3.1.2 DirectX的安装与配置 39
3.2 Direct3D预备知识 44
3.2.1 左手坐标系 44
3.2.2 表面和内存池 44
3.2.3 顶点缓存和索引缓存 45
3.2.4 深度缓存 46
3.2.5 多重采样 46
3.3 Direct3D初始化 47
3.3.1 获取接口IDirect3D9的指针 47
3.3.2 校验硬件顶点运算 47
3.3.3 填充D3DPRESENT PARAMETERS结构 48
3.3.4 创建IDirect3DDevice9接口 50
3.4 一个简单的Direct3D程序框架 51
第4章 绘制流水线 64
4.1 模型表示 64
4.1.1 灵活顶点格式 65
4.1.2 三角形单元 66
4.1.3 顶点的索引 67
4.2 绘制流水线 67
4.2.1 局部坐标系 68
4.2.2 世界坐标系 68
4.2.3 观察坐标系 72
4.2.4 消隐 73
4.2.5 光照 74
4.2.6 裁剪 74
4.2.7 投影 74
4.2.8 视口变换 76
4.2.9 渲染 77
第5章 Direct3D的绘制 78
5.1 Direct3D基本图元 78
5.2 Direct3D颜色表示法 80
5.3 顶点缓存和索引缓存 82
5.3.1 创建顶点缓存 82
5.3.2 访问顶点缓存内容 84
5.3.3 顶点缓存绘制状态 84
5.3.4 顶点缓存例程 85
5.3.5 创建索引缓存 89
5.3.6 访问索引缓存内容 89
5.3.7 索引缓存绘制状态 89
5.3.8 开始绘制 89
5.3.9 索引缓存例程 90
5.4 绘制2D文本 93
5.5 创建3D文本 96
第6章 颜色、光照与材质 100
6.1 颜色 100
6.1.1 颜色表示 100
6.1.2 顶点颜色 103
6.1.3 着色模式 104
6.2 光照 107
6.2.1 光照模型 107
6.2.2 光源的类型 109
6.2.3 光源的设置 111
6.3 材质 114
6.3.1 Direct3D材质 114
6.3.2 顶点的法向量 116
6.3.3 实例——光照四面体 117
第7章 纹理、混合与模板 120
7.1 纹理 120
7.1.1 纹理坐标 120
7.1.2 创建并启用纹理 122
7.1.3 纹理过滤器 123
7.1.4 多级渐进纹理 124
7.1.5 纹理寻址 125
7.1.6 环境贴图 128
7.1.7 实例——八面体纹理贴图 129
7.2 混合 132
7.2.1 混合方程 132
7.2.2 混合因子 133
7.2.3 透明度和Alpha混合 134
7.2.4 创建Alpha通道 135
7.2.5 颜色混合实例——透明茶壶 136
7.3 模板 139
7.3.1 模板缓存 139
7.3.2 模板测试 140
7.3.3 更新模板缓存 141
第8章 网格 148
8.1 网格模型基础 148
8.1.1 几何信息 148
8.1.2 邻接信息 150
8.1.3 网格子集和属性缓存 151
8.1.4 网格优化 152
8.2 网格基本操作 154
8.2.1 创建网格模型 154
8.2.2 简单几何体 158
8.2.3 克隆网格模型 162
8.3 文件网格模型 162
8.3.1 模型文件格式 162
8.3.2 X文件网格模型 163
8.3.3 3DS文件转换为X文件 175
8.3.4 加载网格 176
8.3.5 渐进网格 181
8.3.6 d3dMesh类 184
8.4 骨骼动画网格模型 196
8.4.1 骨骼动画基本原理 196
8.4.2 骨骼层次信息和矩阵栈 197
8.4.3 X文件中的骨骼动画信息 198
8.4.4 顶点混合技术 200
8.4.5 骨骼动画的实现 203
8.4.6 骨骼动画控制器 210
第9章 场景绘制 218
9.1 摄像机 218
9.1.1 摄像机的基本原理 218
9.1.2 摄像机的变换 219
9.2 地形绘制 223
9.2.1 高度图 224
9.2.2 创建地形几何信息 224
9.2.3 绘制地形 228
9.2.4 在地形中行走 232
9.3 天空绘制 235
9.3.1 矩形天空 235
9.3.2 天空盒 237
9.3.3 球形天空 240
第10章 粒子系统 242
10.1 粒子系统基本原理 242
10.2 点精灵(点图元) 243
10.2.1 点精灵结构体 244
10.2.2 点精灵的大小 245
10.2.3 点精灵的渲染 246
10.3 粒子系统的实现 246
10.3.1 粒子结构和顶点结构 246
10.3.2 粒子系统类的定义 247
10.3.3 粒子系统的构造函数和初始化函数 248
10.3.4 粒子系统的创建、销毁和随机性 249
10.3.5 粒子系统的更新 250
10.3.6 粒子系统的绘制 251
10.3.7 粒子系统示例 253
第11章 拾取与碰撞检测 261
11.1 外接体 261
11.2 拾取 264
11.2.1 屏幕到投影窗口的变换 265
11.2.2 拾取射线的计算 266
11.2.3 对射线进行变换 267
11.2.4 射线与物体的相交判定 268
11.3 碰撞检测 270
11.3.1 外接球碰撞检测 270
11.3.2 AABB碰撞检测 272
第12章 着色器和高级着色器语言 274
12.1 CPU与GPU 275
12.2 GPU的并行计算 276
12.3 GPU的向量计算SIMD 277
12.4 CPU与GPU的同步 278
12.5 着色器的版本与历史 279
12.6 着色器的使用 280
12.7 HLSL工作模型 281
12.8 编写HLSL着色器 283
12.9 编译HLSL着色器 285
12.10 HLSL变量类型 288
12.10.1 标量类型 288
12.10.2 向量类型 288
12.10.3 矩阵类型 289
12.10.4 数组 290
12.10.5 结构体 291
12.10.6 typedef关键字 291
12.10.7 变量前缀 291
12.11 HLSL关键字、语句和强制转换 292
参考文献 297