第1章 绪论 1
1.1计算机图形学简介 1
1.1.1计算机图形学的世界 3
1.1.2应用领域的现状与前景 3
1.1.3关于用户界面的思考 5
1.2简要历史 6
1.3一个光照的例子 7
1.4目标、资源和适度的抽象 8
1.4.1深度理解与常见的做法 9
1.5图形学中的常数和一些参数值的量级 9
1.5.1光能量和光子到达率 9
1.5.2显示器的特性和眼睛的分辨率 10
1.5.3数码相机的特性 10
1.5.4复杂应用的处理需求 10
1.6图形管线 11
1.6.1纹理映射与近似 12
1.6.2更为详细的图形管线 13
1.7图形学与艺术、设计、感知的关系 14
1.8基本图形系统 16
1.8.1图形数据 16
1.9视为黑盒的多边形绘制 18
1.10图形系统中的交互 18
1.11不同类型的图形应用 18
1.12不同类型的图形包 19
1.13构建真实感绘制模块:概述 20
1.13.1光线 20
1.13.2物体和材料 21
1.13.3接收来自场景中的光线 22
1.13.4图像显示 22
1.13.5人类视觉系统 23
1.13.6数学运算 23
1.13.7积分和采样 24
1.14学习计算机图形学 24
第2章2D图形学简介——基于WPF 26
2.1引言 26
2.2 2D图形流水线概述 26
2.3 2D图形平台的演变 27
2.3.1从整数坐标到浮点数坐标 27
2.3.2即时模式与保留模式 29
2.3.3过程语言与描述性语言 30
2.4使用WPF定义2D场景 31
2.4.1 XAML应用程序结构 31
2.4.2采用抽象坐标系定义场景 31
2.4.3坐标系的选择范围 33
2.4.4 WPF画布坐标系 34
2.4.5使用显示变换 35
2.4.6构造并使用模块化模板 37
2.5用WPF实现的2D图形动态显示 42
2.5.1基于描述性动画的动态显示 42
2.5.2基于过程代码的动态显示 44
2.6支持各种形状系数 45
2.7讨论和延伸阅读 46
第3章 一个古老的绘制器 47
3.1一幅丢勒的木刻画 47
3.2可见性 49
3.3实现 49
3.3.1绘图 52
3.4程序 55
3.5局限性 57
3.6讨论和延伸阅读 59
3.7练习 60
第4章2D图形测试平台 62
4.1引言 62
4.2测试平台的细节 63
4.2.1使用2D测试平台 63
4.2.2割角 63
4.2.3基于测试平台的程序的结构 64
4.3 C#代码 68
4.3.1坐标系 70
4.3.2 WPF数据依赖 71
4.3.3事件处理 71
4.3.4其他几何物体 73
4.4动画 73
4.5交互 74
4.6测试平台的一个应用程序 74
4.7讨论 77
4.8练习 77
第5章 人类视觉感知简介 78
5.1引言 78
5.2视觉系统 79
5.3眼睛 82
5.3.1眼睛的生理机能 82
5.3.2眼睛中的光感受器 83
5.4恒常性及其影响 85
5.5延续性 87
5.6阴影 88
5.7讨论和延伸阅读 89
5.8练习 90
第6章 固定功能的3D图形平台和层次建模简介 92
6.1引言 92
6.1.1 WPF 3D部分的设计 92
6.1.2对光与物体交互的物理过程的近似 93
6.1.3 WPF 3D概述 93
6.2网格和光照属性 94
6.2.1场景设计 94
6.2.2生成更真实的光照 98
6.2.3固定功能绘制中的“光照”与“着色” 101
6.3曲面表示和绘制 102
6.3.1基于插值的着色处理(Gouraud着色) 102
6.3.2将表面设置为多面体表面和平滑表面 104
6.4 WPF中的表面纹理 105
6.4.1基于分片拼接的纹理映射 106
6.4.2基于拉伸的纹理映射 107
6.5 WPF反射模型 107
6.5.1颜色设置 107
6.5.2光源几何 108
6.5.3反射率 108
6.6基于场景图进行层次建模 112
6.6.1模块化建模的动因 112
6.6.2自顶向下的部件层次结构设计 113
6.6.3自下而上的构建和组合 114
6.6.4构件的重用 118
6.7讨论 120
第7章2D和3D空间中的基础数学与几何 121
7.1引言 121
7.2记号 121
7.3集合 121
7.4函数 122
7.4.1反正切函数 123
7.5坐标 124
7.6坐标运算 124
7.6.1向量 126
7.6.2如何理解向量 127
7.6.3向量长度 127
7.6.4向量运算 127
7.6.5矩阵乘法 130
7.6.6其他类型的向量 131
7.6.7隐式直线 132
7.6.8平面直线的隐式描述 133
7.6.9能否采用y=mx+b 134
7.7直线求交 134
7.7.1参数化-参数化直线求交 134
7.7.2参数化-隐式直线求交 135
7.8更一般的求交计算 135
7.8.1光线-平面求交 136
7.8.2光线-球求交 137
7.9三角形 138
7.9.1重心坐标 138
7.9.2空间三角形 139
7.9.3半平面和三角形 140
7.10多边形 141
7.10.1内/外测试 141
7.10.2非简单多边形的内部 143
7.10.3平面多边形的符号面积:分而治之 143
7.10.4空间多边形的法向量 144
7.10.5更一般多边形的符号面积 145
7.10.6倾斜原理 145
7.10.7重心坐标的模拟 146
7.11讨论 147
7.12练习 147
第8章2D和3D形状的简单表示 150
8.1引言 150
8.2 2D空间中的“网格”:折线 151
8.2.1边界 151
8.2.2 1D网格的数据结构 153
8.3 3D网格 154
8.3.1流形网格 154
8.3.2非流形网格 156
8.3.3网格结构的存储要求 157
8.3.4网格操作 158
8.3.5边折叠 158
8.3.6边交换 159
8.4讨论和延伸阅读 159
8.5练习 160
第9章 网格函数 161
9.1引言 161
9.2重心坐标插值代码 163
9.2.1另一视角下的线性插值 166
9.2.2扫描线插值 167
9.3分段线性扩展的局限 168
9.3.1依赖网格结构 169
9.4更平滑扩展 169
9.4.1非凸空间 169
9.4.2使用哪一种插值方法好 170
9.5顶点处定义函数乘 171
9.6应用:纹理映射 172
9.6.1纹理坐标赋值 172
9.6.2纹理映射细节 173
9.6.3纹理映射问题 173
9.7讨论 173
9.8练习 174
第10章2D变换 177
10.1引言 177
10.2 5个实例 177
10.3关于变换的重要事实 180
10.3.1与矩阵相乘为线性变换 180
10.3.2与矩阵相乘为唯一的线性变换 180
10.3.3函数组合和矩阵乘法的关系 181
10.3.4矩阵的逆和反函数的关系 181
10.3.5求解变换的关联矩阵 182
10.3.6变换和坐标系 184
10.3.7矩阵性质和奇异值分解 185
10.3.8计算SVD 186
10.3.9 SVD和伪逆 186
10.4平移 188
10.5再谈点和向量 188
10.6为什么使用3×3矩阵而不是一个矩阵和一个向量 189
10.7窗口变换 189
10.8构建3D变换 190
10.9另一个构造2D变换的实例 191
10.10坐标系 193
10.11应用:绘制场景图 194
10.11.1场景图中的坐标改变 200
10.12变换向量和余向量 202
10.12.1对参数化直线进行变换 204
10.13更一般的变换 205
10.14变换与插值 209
10.15讨论和延伸阅读 209
10.16练习 210
第11章3D变换 212
11.1引言 212
11.1.1投影变换理论 213
11.2旋转 214
11.2.1 2D和3D情形的类比 214
11.2.2欧拉角 215
11.2.3旋转轴和旋转角的描述 216
11.2.4从旋转矩阵中寻找旋转轴和旋转角 217
11.2.5以物体为中心的欧拉角 219
11.2.6旋转和3D球 219
11.2.7计算稳定性 224
11.3旋转表示间的比较 224
11.4旋转与旋转参数的指定 225
11.5对矩阵变换进行插值 226
11.6虚拟跟踪球和弧球 226
11.7讨论和延伸阅读 228
11.8练习 228
第12章2D和3D图形变换库 230
12.1引言 230
12.2点和向量 230
12.3变换 231
12.3.1效率 231
12.4变换的参数 232
12.5实现 232
12.5.1投影变换 233
12.6 3D空间 235
12.7相关变换 235
12.8其他结构 235
12.9其他方法 235
12.10讨论 238
12.11练习 238
第13章 相机设定及变换 239
13.1引言 239
13.2一个2D的示例 239
13.3透视型相机设定 240
13.4基于相机设定构建变换 242
13.5相机变换和光栅化绘制流水线 248
13.6透视变换和z值 250
13.7相机变换和层次化建模 251
13.8正交相机 252
13.8.1宽高比和视域 253
13.9讨论和延伸阅读 253
13.10练习 254
第14章 标准化近似和表示 256
14.1引言 256
14.2评价各种表示方法 256
14.2.1测量值 258
14.2.2历史上的模型 258
14.3实数 258
14.3.1定点数 259
14.3.2浮点数 260
14.3.3缓冲区 260
14.4建立光线光学模块 263
14.4.1光 264
14.4.2光源 267
14.4.3光传输 267
14.4.4材质 268
14.4.5相机 268
14.5大尺度物体几何 269
14.5.1网格 270
14.5.2隐式曲面 273
14.5.3样条曲面和细分曲面 274
14.5.4高度场 275
14.5.5点集 276
14.6远距离物体 277
14.6.1层次细节 277
14.6.2贴图板和Imposter技术 277
14.6.3天空立方盒 278
14.7体模 278
14.7.1有限元模型 278
14.7.2体素 279
14.7.3粒子系统 280
14.7.4雾 280
14.8场景图 281
14.9材质模型 282
14.9.1散射函数 283
14.9.2朗伯反射 286
14.9.3归一化Blinn-Phong反射函数 287
14.10半透明和颜色混合 289
14.10.1混合 290
14.10.2局部覆盖率(α) 291
14.10.3透射 293
14.10.4自发光 295
14.10.5光晕和镜头眩光 295
14.11光源模型 295
14.11.1辐射度函数 295
14.11.2直接光和间接光 296
14.11.3实用和艺术考虑 296
14.11.4矩形面光源 301
14.11.5半球面光源 303
14.11.6全向光源 303
14.11.7平行光源 304
14.11.8聚光灯 305
14.11.9统一的点光源模型 306
14.12讨论 308
14.13练习 308
第15章 光线投射与光栅化 309
15.1引言 309
15.2顶层设计概述 310
15.2.1散射 310
15.2.2可见点 311
15.2.3光线投射:像素优先 312
15.2.4光栅化:三角形优先 312
15.3实现平台 313
15.3.1选择标准 313
15.3.2工具类 315
15.3.3场景表示 319
15.3.4测试场景 321
15.4光线投射绘制程序 321
15.4.1生成视线 323
15.4.2采样框架:求交和着色 325
15.4.3光线-三角形求交 326
15.4.4调试 328
15.4.5着色 329
15.4.6朗伯散射 330
15.4.7光泽型散射 331
15.4.8阴影 331
15.4.9更复杂的场景 334
15.5间奏曲 334
15.6光栅化 335
15.6.1交换循环次序 335
15.6.2包围盒优化 336
15.6.3近平面裁剪 338
15.6.4提升效率 338
15.6.5光栅化阴影区域 343
15.6.6包围盒算法之外 345
15.7使用光栅化API进行绘制 347
15.7.1图形流水线 347
15.7.2接口 348
15.8性能和优化 357
15.8.1关于抽象的思考 357
15.8.2关于架构的思考 358
15.8.3提前深度测试的例子 359
15.8.4什么情况下需进行早期优化 359
15.8.5改进性能估计界限 360
15.9讨论 360
15.10练习 361
第16章 实时3D图形平台综述 363
16.1引言 363
16.1.1从固定功能流水线到可编程的绘制流水线 364
16.2编程模型:OpenGL兼容(固定功能)配置文件 365
16.2.1 OpenGL程序结构 366
16.2.2初始化和主循环 367
16.2.3光照与材质 368
16.2.4几何处理 368
16.2.5相机设置 370
16.2.6绘制图元 371
16.2.7组装:静态帧 372
16.2.8组装:动态效果 372
16.2.9层次建模 372
16.2.10拾取关联 373
16.3编程模型:OpenGL可编程流水线 373
16.3.1可编程流水线的抽象 373
16.3.2核心API的本性 375
16.4图形应用程序的架构 375
16.4.1应用程序模型 375
16.4.2从应用程序模型到IM平台的流水线 376
16.4.3场景图中间件 381
16.4.4图形应用程序平台 383
16.5其他平台上的3D应用 384
16.5.1移动设备上的3D应用 384
16.5.2浏览器中的3D应用 384
16.6讨论 385