第1章 图形系统和模型 1
1.1 计算机图形学的应用 1
1.1.1 信息的显示 2
1.1.2 设计 2
1.1.3 仿真与动画 3
1.1.4 用户界面 3
1.2 计算机图形系统 4
1.2.1 像素与帧缓存 5
1.2.2 输出设备 6
1.2.3 输入设备 8
1.3 图像:物理方法和人工合成方法 8
1.3.1 对象与观察者 9
1.3.2 光照与图像 10
1.3.3 成像模型 12
1.4 成像系统 13
1.4.1 针孔照相机 13
1.4.2 人眼视觉系统 15
1.5 虚拟照相机模型 16
1.6 程序员接口 18
1.6.1 笔式绘图仪模型 19
1.6.2 三维API软件包 21
1.6.3 彩图介绍 23
1.6.4 建模-绘制模式 24
1.7 图形系统的体系结构 25
1.7.1 显示处理器 25
1.7.2 流水线体系结构 26
1.7.3 图形处理流水线 27
1.7.4 顶点处理 27
1.7.5 裁剪与图元组装 28
1.7.6 光栅化 28
1.7.7 片元处理 28
1.8 可编程流水线 28
1.9 性能特性 29
1.10 小结 30
1.11 补充阅读材料 30
1.12 习题 31
第2章 图形学编程 33
2.1 Sierpinski镂垫 33
2.2 编写二维应用程序 34
2.3 OpenGL API工具包 39
2.3.1 图形函数 40
2.3.2 图形流水线和状态机 41
2.3.3 OpenGL接口 41
2.4 图元与属性 42
2.4.1 多边形基本概念 44
2.4.2 OpenGL里的多边形类型 46
2.4.3 球体的近似表示 47
2.4.4 字符 48
2.4.5 曲线和曲面 50
2.4.6 属性 50
2.5 颜色 51
2.5.1 RGB颜色 53
2.5.2 索引颜色 55
2.5.3 设置颜色属性 56
2.6 视图处理 57
2.6.1 正交视图 57
2.6.2 二维视图 60
2.6.3 矩阵模式 60
2.7 控制函数 61
2.7.1 与Windows操作系统的交互作用 61
2.7.2 纵横比和视口 63
2.7.3 main、display和myinit函数 64
2.7.4 程序结构 65
2.8 Sierpinski镂垫程序 65
2.9 多边形与递归 67
2.10 三维Sierpinski镂垫 69
2.10.1 使用三维点 69
2.10.2 在三维空间里使用多边形 71
2.10.3 隐藏面消除 73
2.11 描绘隐函数曲线 74
2.12 小结 82
2.13 补充阅读材料 83
2.14 习题 84
第3章 输入与交互 87
3.1 交互模式 87
3.2 输入设备 88
3.2.1 物理输入设备 89
3.2.2 逻辑设备 92
3.2.3 输入模式 92
3.3 客户-服务器结构 94
3.4 显示列表 95
3.4.1 显示列表的定义和运行 97
3.4.2 字符和显示列表 98
3.4.3 GLUT库里的字体 101
3.5 事件驱动编程 102
3.5.1 使用指向输入设备 102
3.5.2 窗口事件 105
3.5.3 键盘事件 106
3.5.4 显示函数和空闲回调函数 106
3.5.5 窗口管理 107
3.6 菜单 108
3.7 拾取 109
3.8 一个简单的画图程序 115
3.9 建立交互模型 120
3.10 交互式动画程序 123
3.10.1 旋转的正方形 123
3.10.2 双缓存 125
3.10.3 使用定时器 126
3.11 交互式程序的设计 127
3.12 逻辑运算 128
3.12.1 绘制可删除的直线 129
3.12.2 异或操作(XOR)和颜色 132
3.12.3 光标与覆盖层位平面 132
3.13 小结 133
3.14 补充阅读材料 134
3.15 习题 134
第4章 几何对象与坐标变换 138
4.1 标量、点和矢量 138
4.1.1 几何对象 139
4.1.2 与坐标无关的几何对象 141
4.1.3 数学观点:矢量与仿射空间 141
4.1.4 计算机科学的观点 142
4.1.5 几何抽象数据类型 142
4.1.6 直线 144
4.1.7 仿射加 144
4.1.8 凸性 145
4.1.9 点积和叉积 146
4.1.10 平面 147
4.2 三维几何图元 148
4.3 坐标系与标架 150
4.3.1 矢量表示与N-元组 152
4.3.2 坐标系变换 153
4.3.3 表示变换的示例 155
4.3.4 齐次坐标 156
4.3.5 标架变换的示例 159
4.3.6 表示矩阵的运算处理 161
4.4 OpenGL里的标架系统 162
4.5 建立一个彩色立方体模型 166
4.5.1 立方体模型 166
4.5.2 内侧面与外侧面 167
4.5.3 对象表示的数据结构 168
4.5.4 彩色立方体 169
4.5.5 双线性插值 169
4.5.6 顶点数组 171
4.6 仿射变换 173
4.7 平移、旋转和缩放 175
4.7.1 平移变换 175
4.7.2 旋转变换 176
4.7.3 缩放变换 178
4.8 齐次坐标表示的变换公式 179
4.8.1 平移 180
4.8.2 缩放 181
4.8.3 旋转 181
4.8.4 剪切变换 183
4.9 变换的串乘运算 184
4.9.1 绕某一固定点的旋转 185
4.9.2 一般的旋转变换 186
4.9.3 实例变换 187
4.9.4 绕任一轴旋转 188
4.10 OpenGL中的变换矩阵 192
4.10.1 当前变换矩阵 192
4.10.2 旋转、平移和缩放 193
4.10.3 在OpenGL中绕固定点旋转 194
4.10.4 变换次序 194
4.10.5 立方体的旋转 195
4.10.6 矩阵的装载、压栈和弹栈操作 196
4.11 三维应用程序的交互方式 197
4.11.1 利用屏幕区域设置交互 197
4.11.2 一个虚拟跟踪球 198
4.11.3 平滑旋转 199
4.11.4 递增式旋转 200
4.12 四元数 201
4.12.1 复数与四元数 201
4.12.2 四元数与旋转 202
4.13 小结 204
4.14 补充阅读材料 205
4.15 习题 205
第5章 视图 208
5.1 经典视图和计算机视图 208
5.1.1 经典视图 210
5.1.2 正射投影 210
5.1.3 轴测法投影 211
5.1.4 斜投影 212
5.1.5 透视图 213
5.2 计算机视图 214
5.3 照相机定位 215
5.3.1 照相机标架的定位 215
5.3.2 两个视图处理API工具包 220
5.3.3 Look-At函数 223
5.3.4 其他视图API工具包 224
5.4 简单投影 225
5.4.1 透视投影 225
5.4.2 正交投影 228
5.5 OpenGL的投影视图 229
5.5.1 OpenGL的透视投影 230
5.5.2 OpenGL的平行视图 232
5.6 隐藏面消除 232
5.7 交互式网格显示 234
5.7.1 网格 234
5.7.2 在场景中漫游 236
5.7.3 多边形偏移 238
5.8 平行投影矩阵 239
5.8.1 投影归一化 239
5.8.2 正交投影矩阵 240
5.8.3 斜投影 242
5.9 透视投影矩阵 244
5.9.1 透视正则化 245
5.9.2 OpenGL的透视变换 248
5.10 投影与阴影 249
5.11 小结 252
5.12 补充阅读材料 253
5.13 习题 253
第6章 明暗处理 255
6.1 光与材质 255
6.2 光源 258
6.2.1 彩色光源 259
6.2.2 环境光 260
6.2.3 点光源 260
6.2.4 聚光灯 261
6.2.5 远距离光源 262
6.3 Phong反射模型 263
6.3.1 环境反射 265
6.3.2 漫反射 265
6.3.3 镜面反射 266
6.3.4 改进的Phong模型 268
6.4 矢量计算 269
6.4.1 法向矢量 270
6.4.2 反射角度 272
6.5 多边形的明暗处理 273
6.5.1 平面明暗处理 274
6.5.2 插值和Gouraud明暗处理方法 276
6.5.3 Phong明暗处理方法 277
6.6 球面的递归细分逼近 278
6.7 OpenGL中的光源 282
6.8 OpenGL程序中的材质设置 284
6.9 球体模型的明暗处理 285
6.10 全局照明 287
6.11 小结 288
6.12 补充阅读材料 289
6.13 习题 290
第7章 从顶点到片元 292
7.1 绘制实现的基本策略 292
7.2 绘制实现过程的4个主要任务 294
7.2.1 建模 295
7.2.2 几何处理 295
7.2.3 光栅化 296
7.2.4 片元处理 297
7.3 裁剪 297
7.4 线段裁剪 298
7.4.1 Cohen-Sutherland裁剪算法 298
7.4.2 Liang-Barsky裁剪算法 300
7.5 多边形裁剪 301
7.6 其他图元的裁剪 305
7.6.1 包围盒与包围体 305
7.6.2 曲线、曲面和字符 306
7.6.3 帧缓存里的裁剪操作 307
7.7 三维裁剪 307
7.8 光栅化 310
7.9 Bresenham算法 313
7.10 多边形光栅化 315
7.10.1 内外测试法 315
7.10.2 OpenGL与凹多边形 317
7.10.3 填充与排序 318
7.10.4 泛洪填充法 318
7.10.5 奇异性 319
7.11 隐藏面消除 319
7.11.1 景物空间和图像空间 319
7.11.2 排序与隐藏面消除 321
7.11.3 扫描线填充算法 321
7.11.4 背面剔除 323
7.11.5 Z-Buffer算法 324
7.11.6 带Z-Buffer算法的扫描转换 326
7.11.7 深度排序和画家算法 327
7.12 反走样 330
7.13 显示器因素 332
7.13.1 颜色系统 332
7.13.2 颜色矩阵 335
7.13.3 γ校正 336
7.13.4 抖动技术与半色调技术 336
7.14 小结 337
7.15 补充阅读材料 339
7.16 习题 339
第8章 离散技术 342
8.1 缓存 342
8.2 数字图像 344
8.3 缓存写操作 346
8.3.1 写入模式 347
8.3.2 异或写入模式 349
8.4 OpenGL的位运算与像素运算 349
8.4.1 OpenGL缓存和像素管道 350
8.4.2 位图 351
8.4.3 光栅字体 352
8.4.4 像素与图像 353
8.4.5 查找表 354
8.5 示例 356
8.5.1 Mandelbrot集合 356
8.5.2 验证第7章的算法 358
8.5.3 用于拾取操作的缓存 359
8.6 映射方法 359
8.7 纹理映射 361
8.8 OpenGL的纹理映射 366
8.8.1 二维纹理映射 367
8.8.2 纹理采样 369
8.8.3 纹理坐标设置 372
8.8.4 纹理对象 374
8.8.5 多纹理通道 374
8.9 纹理生成过程 375
8.10 环境贴图 376
8.11 合成技术 380
8.11.1 不透明性与融合 381
8.11.2 图像合成 382
8.11.3 OpenGL中的融合与图像合成 382
8.11.4 反走样 383
8.11.5 从后至前绘制与从前至后绘制 385
8.11.6 景深提示和雾效果 386
8.12 多通道绘制与累加缓存 387
8.12.1 场景反走样 388
8.12.2 凹凸贴图和浮雕效果 388
8.12.3 图像处理 389
8.12.4 OpenGL的图像处理扩展集 390
8.12.5 其他多通道方法 390
8.13 采样与走样 391
8.13.1 采样理论 391
8.13.2 重构 396
8.13.3 量化 398
8.14 小结 398
8.15 补充阅读材料 399
8.16 习题 400
第9章 可编程着色器 402
9.1 可编程流水线 402
9.2 着色语言 403
9.3 OpenGL功能扩展 405
9.3.1 OpenGL版本和扩展集 405
9.3.2 GLSL和Cg 406
9.4 OpenGL着色语言(上) 406
9.4.1 顶点着色器 406
9.4.2 片元着色器 408
9.5 OpenGL着色语言(下) 409
9.5.1 GLSL执行过程 409
9.5.2 数据类型与修饰符 410
9.5.3 运算符与函数 412
9.6 着色器连接到OpenGL程序 413
9.7 顶点移动 415
9.7.1 缩放顶点位置 415
9.7.2 渐变效果 416
9.7.3 粒子系统 417
9.8 光照作用与着色器 418
9.8.1 Phong着色 418
9.8.2 非真实感着色 421
9.9 片元着色器 422
9.10 基于顶点与基于片元的Phong着色模型 422
9.11 采样器 424
9.12 立方体贴图 427
9.12.1 反射贴图 427
9.12.2 折射 429
9.12.3 法线贴图 432
9.13 凹凸映射 433
9.13.1 凹凸贴图的原理 433
9.13.2 高度场与凹凸映射 435
9.13.3 凹凸映射与片元着色器 436
9.13.4 示例 437
9.14 小结 438
9.15 补充阅读材料 439
9.16 习题 439
第10章 建模 441
10.1 图符与实例 441
10.2 层级模型 443
10.3 机器手 445
10.4 树与树的遍历 448
10.5 树形数据结构的应用 451
10.6 动画 455
10.7 图形对象 456
10.7.1 方法、属性和消息 457
10.7.2 一个立方体对象 458
10.7.3 实现立方体对象 460
10.7.4 对象与层级结构 460
10.7.5 几何对象 461
10.8 场景图 462
10.9 一个简单的场景图形API工具包 464
10.9.1 结点类 464
10.9.2 几何结点 466
10.9.3 照相机类 468
10.9.4 光源和材质 468
10.9.5 变换类 470
10.9.6 机器人类 470
10.9.7 实现观察者类 472
10.9.8 实现结点类 475
10.10 其他的树形结构 478
10.10.1 CSG树 479
10.10.2 BSP树 480
10.10.3 四叉树和八叉树 482
10.11 图形与因特网 484
10.11.1 网络与协议 484
10.11.2 超媒体与HTML语言 485
10.11.3 数据库与VRML 486
10.11.4 Java与Java小程序 487
10.12 过程建模 487
10.13 基于物理模型和粒子系统 489
10.14 牛顿粒子 490
10.14.1 独立粒子 491
10.14.2 弹簧力 492
10.14.3 吸引力与排斥力 493
10.15 粒子系统的求解方法 495
10.16 约束 497
10.16.1 碰撞 497
10.16.2 软约束 499
10.17 小结 500
10.18 补充阅读材料 501
10.19 习题 501
第11章 曲线与曲面 503
11.1 曲线和曲面的表示方法 503
11.1.1 显式表示法 503
11.1.2 隐式表示 504
11.1.3 参数形式 505
11.1.4 参数多项式曲线 507
11.1.5 参数多项式曲面 508
11.2 设计准则 509
11.3 三次多项式参数曲线 511
11.4 插值 512
11.4.1 调和函数 514
11.4.2 三次插值面片 515
11.5 Hermite曲线和曲面 517
11.5.1 Hermite形式 517
11.5.2 几何连续和参数连续 519
11.6 Bezier曲线和曲面 521
11.6.1 Bezier曲线 521
11.6.2 Bezier曲面面片 524
11.7 三次B-样条 525
11.7.1 三次B-样条曲线 525
11.7.2 B-样条与基函数 528
11.7.3 样条曲面 529
11.8 通用的B样条函数 530
11.8.1 B-样条的递归定义 530
11.8.2 均匀样条 531
11.8.3 非均匀B-样条 532
11.8.4 NURBS 532
11.9 曲线和曲面的绘制 533
11.9.1 多项式求值方法 534
11.9.2 Bezier多项式的递归细分 535
11.9.3 其他多项式曲线的细分绘制法 537
11.9.4 细分Bezier曲面 538
11.10 犹他大学的茶壶模型 540
11.11 代数曲面 541
11.11.1 二次曲面 542
11.11.2 曲面的光线跟踪绘制方法 542
11.11.3 曲线与曲面的细分方法 543
11.11.4 网格的细分方法 544
11.12 OpenGL里的曲线与曲面 547
11.12.1 Bezier曲线 547
11.12.2 Bezier曲面 548
11.12.3 绘制茶壶 549
11.12.4 NURBS函数 550
11.12.5 二次曲面对象 551
11.13 小结 551
11.14 补充阅读材料 552
11.15 习题 552
第12章 高级绘制 554
12.1 超越流水线绘制 554
12.2 光线跟踪 555
12.3 建立一个简单的光线跟踪器 558
12.3.1 光线跟踪的递归算法 558
12.3.2 求交计算 560
12.3.3 光线跟踪的变异形式 563
12.4 绘制方程 563
12.5 辐射度法 566
12.5.1 辐射度方程 566
12.5.2 求解辐射度方程 568
12.5.3 形状因子的计算方法 569
12.5.4 实现辐射度算法 571
12.6 RenderMan 572
12.7 大规模场景绘制 573
12.7.1 中排序绘制法 575
12.7.2 后排序绘制 576
12.7.3 先排序绘制 579
12.8 基于图像的绘制 580
12.9 小结 582
12.10 补充阅读材料 583
12.11 习题 583
附录A 实例程序 585
附录B 空间 645
附录C 矩阵 654
附录D OpenGL函数简介 663
参考文献 678