交互式计算机图形学——基于WebGL 2.0的自顶向下方法(第八版)
定 价:149 元
丛书名:国外计算机科学教材系列
- 作者:(美)Edward Angel(爱德华 · 安杰尔),Dave Shreiner(戴夫 · 斯赖纳)
- 出版时间:2024/1/1
- ISBN:9787121471186
- 出 版 社:电子工业出版社
- 中图法分类:TP391.41
- 页码:556
- 纸张:
- 版次:01
- 开本:16开
本书采用自顶向下方法并辅以面向编程的方式,基于现代可编程GPU的WebGL 2.0着色器编程,综合利用HTML5、JavaScript和GLSL(OpenGL ES 3.0),开发可以在各种浏览器中运行的三维图形应用程序,同时系统地介绍了现代计算机图形学的核心概念、原理和方法。本书是作者多年教学与科研的结晶,涵盖了交互式图形编程、可编程GPU绘制流水线、变换与观察、光照与着色、曲线与曲面建模等计算机图形学的基本内容,以及离散技术、层级建模、过程建模、光线跟踪、并行绘制、体绘制和虚拟现实等高级内容。为了方便读者进一步深入学习和研究计算机图形学,本书在每章末尾提供了相关的建议阅读资料。
Edward Angel是新墨西哥大学(UNM)计算机科学的退休教授,并担任过艺术、技术和科学实验室(ARTS Lab)的主任。直到2007年7月,他一直是UNM的计算机科学、电子与计算机工程、媒体艺术教授。Angel于1964年在加州理工大学获得学士学位,并于1968年在南加州大学获得博士学位。他曾任职于加州大学伯克利分校、南加州大学和罗切斯特大学。Angel目前的研究领域是计算机图形学及科学可视化、虚拟现实和大规模并行计算等。
张荣华,男,1973年10月出生,中共党员,高级工程师。1996年本科毕业于华北电力大学电子工程系计算机专业。2001年就读于北京理工大学计算机学院VR实验室,研究方向为计算机图形学,虚拟现实(视景仿真),2004年获硕士学位,并获北京理工大学优秀硕士论文。现为华北电力大学计算机系高级工程师,从事计算机图形学、视景仿真和数字孪生方向的教学和科研工作,在国内外重要刊物发表论文20余篇,出版译著、教材和专著5部,参与国家自然科学基金青年基金和河北省自然科学基金青年基金2项,主持省部级重点教改项目2项。
目 录
第1章 图形系统和模型 1
1.1 计算机图形学的应用 1
1.1.1 信息的显示 1
1.1.2 设计 2
1.1.3 仿真和动画 3
1.1.4 用户界面 4
1.2 图形系统 5
1.2.1 像素和帧缓存 6
1.2.2 CPU与GPU 7
1.2.3 输出设备 7
1.2.4 输入设备 9
1.3 物理图像与合成图像 9
1.3.1 对象与观察者 9
1.3.2 光和图像 10
1.3.3 成像模型 11
1.4 成像系统 12
1.4.1 针孔照相机 13
1.4.2 人类视觉系统 14
1.5 虚拟照相机模型 14
1.6 应用程序编程接口 16
1.6.1 笔式绘图仪模型 16
1.6.2 三维API 18
1.6.3 使用WebGL API绘制的一系列
图像 20
1.6.4 建模-绘制模式 22
1.7 图形绘制系统体系结构 23
1.7.1 显示处理器 23
1.7.2 流水线体系结构 24
1.7.3 图形绘制流水线 24
1.7.4 顶点处理 24
1.7.5 裁剪和图元组装 25
1.7.6 光栅化 25
1.7.7 片元处理 25
1.8 可编程流水线 26
1.9 性能特征 26
1.10 OpenGL版本和WebGL 27
小结和注释 28
建议阅读资料 29
习题 29
第2章 图形学编程 31
2.1 Sierpinski镂垫 31
2.2 编写二维图形应用程序 33
2.3 WebGL应用程序编程接口 38
2.3.1 图形函数 38
2.3.2 图形绘制流水线和状态机 40
2.3.3 OpenGL和WebGL 40
2.3.4 WebGL接口 41
2.3.5 坐标系 42
2.4 图元和属性 43
2.4.1 多边形的基本概念 45
2.4.2 WebGL中的多边形 46
2.4.3 三角剖分 47
2.4.4 文本 48
2.4.5 顶点属性 49
2.5 颜色 50
2.5.1 RGB颜色 51
2.5.2 查色表 53
2.5.3 设置颜色属性 54
2.6 观察 55
2.6.1 正投影视图 55
2.6.2 二维观察 56
2.7 控制函数 57
2.7.1 HTML canvas元素 57
2.7.2 宽高比和视口 58
2.7.3 应用程序的执行 59
2.8 Sierpinski镂垫绘制程序 60
2.8.1 向GPU发送数据 62
2.8.2 绘制点数据 63
2.8.3 顶点着色器 63
2.8.4 片元着色器 64
2.8.5 组合各部分代码 65
2.8.6 initShaders函数 66
2.8.7 init函数 67
2.8.8 在应用程序中读取着色器 67
2.9 使用多边形和递归 68
2.10 三维Sierpinski镂垫 69
2.10.1 使用三维点 70
2.10.2 使用多边形的三维Sierpinski
镂垫 73
2.10.3 隐藏面消除 75
小结和注释 76
代码示例 77
建议阅读资料 78
习题 78
第3章 交互和动画 82
3.1 动画 82
3.1.1 旋转的正方形 82
3.1.2 显示过程 84
3.1.3 双缓存 85
3.1.4 使用定时器 86
3.1.5 使用requestAnimationFrame
函数 86
3.2 交互 87
3.3 输入设备 88
3.4 物理输入设备 88
3.4.1 键码 89
3.4.2 鼠标和追踪球 89
3.4.3 数据板、触摸板和触摸屏 90
3.4.4 多维输入设备 91
3.4.5 逻辑设备 91
3.4.6 输入模式 91
3.4.7 客户端和服务器 93
3.5 基于事件驱动输入的编程 93
3.5.1 事件和事件监听器 93
3.5.2 增加按钮 94
3.5.3 菜单 95
3.5.4 使用键码 96
3.5.5 滑动条 97
3.6 位置输入 97
3.7 窗口事件 99
3.8 手势和触摸 100
3.9 拾取 101
3.10 交互式建模 101
3.11 交互式程序的设计 105
小结和注释 106
代码示例 106
建议阅读资料 107
习题 107
第4章 几何对象和变换 110
4.1 标量、点和向量 110
4.1.1 几何对象 110
4.1.2 坐标无关的几何 112
4.1.3 数学的观点:向量空间和仿射
空间 112
4.1.4 计算机科学的观点 113
4.1.5 几何ADT 114
4.1.6 直线 114
4.1.7 仿射加法 115
4.1.8 凸性 115
4.1.9 点积和叉积 116
4.1.10 平面 117
4.2 三维图元 118
4.3 坐标系和标架 120
4.3.1 向量的表示和n元组 121
4.3.2 坐标系的变换 122
4.3.3 举例:不同基下的表示之间的
变换 124
4.3.4 齐次坐标 124
4.3.5 举例:标架变换 127
4.3.6 使用表示 128
4.4 WebGL中的标架 129
4.5 矩阵和向量类型 133
4.5.1 行主序和列主序矩阵表示 134
4.6 建模彩色立方体 134
4.6.1 建模立方体的面 135
4.6.2 向内和向外的面 135
4.6.3 表示对象的数据结构 136
4.6.4 彩色立方体 137
4.6.5 颜色插值 138
4.6.6 显示立方体 139
4.6.7 使用元素绘制网格 139
4.6.8 图元重启 140
4.7 仿射变换 141
4.8 平移、旋转和缩放 143
4.8.1 平移 143
4.8.2 旋转 143
4.8.3 缩放 145
4.9 变换的齐次坐标表示 146
4.9.1 平移 146
4.9.2 缩放 147
4.9.3 旋转 147
4.9.4 错切 149
4.10 变换的级联 149
4.10.1 不动点在任意位置的旋转 150
4.10.2 一般的旋转 151
4.10.3 实例变换 152
4.10.4 绕任意轴的旋转 153
4.11 WebGL中的变换矩阵 155
4.11.1 当前变换矩阵 155
4.11.2 基本矩阵函数 156
4.11.3 旋转、平移和缩放 157
4.11.4 绕任意不动点的旋转 157
4.11.5 变换的顺序 158
4.12 旋转立方体 158
4.12.1 uniform矩阵 160
4.13 平滑的旋转 162
4.13.1 增量式旋转 163
4.14 四元数 164
4.14.1 复数和四元数 164
4.14.2 四元数和旋转 165
4.14.3 四元数和万向节死锁 166
4.15 三维应用程序的接口 167
4.15.1 使用屏幕区域 167
4.15.2 虚拟追踪球 168
4.15.3 用四元数实现追踪球 169
小结和注释 171
代码示例 171
建议阅读资料 171
习题 172
第5章 观察 174
5.1 经典观察和计算机观察 174
5.1.1 经典观察 175
5.1.2 正投影 176
5.1.3 轴测投影 176
5.1.4 斜投影 177
5.1.5 透视观察 178
5.2 计算机观察 179
5.3 定位照相机 180
5.3.1 从对象标架到照相机标架 180
5.3.2 两个观察API 183
5.3.3 lookAt函数 186
5.4 平行投影 188
5.4.1 正投影 188
5.4.2 WebGL中的平行投影 189
5.4.3 投影的规范化 190
5.4.4 正投影变换矩阵 190
5.4.5 斜投影 192
5.4.6 交互式观察立方体 194
5.5 透视投影 196
5.5.1 简单的透视投影 196
5.6 WebGL中的透视投影 198
5.6.1 透视投影函数 199
5.7 透视投影变换矩阵 200
5.7.1 透视投影的规范化 200
5.7.2 WebGL中的透视投影变换 202
5.7.3 透视投影示例程序 204
5.8 隐藏面消除 204
5.8.1 背面剔除 206
5.9 显示网格 206
5.9.1 将网格显示为曲面 208
5.9.2 多边形偏移 210
5.9.3 在场景中漫游 211
5.10 投影和阴影 211
5.10.1 基于投影的阴影生成 211
5.11 阴影贴图 215
小结和注释 216
代码示例 216
建议阅读资料 217
习题 217
第6章 光照和着色 219
6.1 光线和材质 219
6.2 光源 221
6.2.1 彩色光源 222
6.2.2 环境光 222
6.2.3 点光源 222
6.2.4 聚光灯 223
6.2.5 远距离光源 224
6.3 Phong光照模型 224
6.3.1 环境光反射 226
6.3.2 漫反射 226
6.3.3 镜面反射 227
6.3.4 改进的Phong光照模型 229
6.4 计算向量 229
6.4.1 法向量 230
6.4.2 反射角 231
6.5 多边形的着色 232
6.5.1 均匀着色 233
6.5.2 平滑着色和Gouraud着色 234
6.5.3 Phong着色 235
6.6 通过递归细分生成近似球面 236
6.7 指定光照参数 237
6.7.1 光源 238
6.7.2 材质 239
6.8 实现光照模型 239
6.8.1 在WebGL应用程序代码中
应用光照模型 239
6.8.2 绘制效率 242
6.8.3 在顶点着色器中实现光照
计算 243
6.9 球面模型的着色 246
6.10 基于每个片元的光照计算 248
6.11 非真实感着色 249
6.12 全局光照 250
小结和注释 251
代码示例 252
建议阅读资料 252
习题 253
第7章 纹理映射 255
7.1 缓存 255
7.2 数字图像 256
7.3 映射方法 259
7.4 二维纹理映射 261
7.5 WebGL中的纹理映射 265
7.5.1 纹理对象 266
7.5.2 纹理图像数组 266
7.5.3 纹理坐标和纹理采样器 267
7.5.4 纹理采样 271
7.5.5 使用纹理坐标 273
7.5.6 三维纹理映射 274
7.5.7 多纹理映射 279
7.6 环境映射 281
7.7 反射映射示例程序 285
7.8 凹凸映射 288
7.8.1 计算凹凸贴图 289
7.8.2 凹凸映射示例程序 291
小结和注释 295
代码示例 295
建议阅读资料 296
习题 296
第8章 使用帧缓存 298
8.1 混合技术 298
8.1.1 不透明度与混合 298
8.1.2 图像混合 299
8.1.3 WebGL中的图像混合 299
8.1.4 重温反走样 301
8.1.5 从后向前或从前向后绘制
多边形 302
8.1.6 场景反走样和多重采样 303
8.2 图像处理 303
8.2.1 其他多重绘制方法 304
8.3 GPGPU 305
8.4 帧缓存对象 308
8.5 多重绘制技术 313
8.5.1 环境光遮蔽 313
8.5.2 延迟光照 315
8.6 缓存交换 316
8.7 拾取 317
8.8 阴影贴图 321
8.9 投影纹理 324
小结和注释 326
代码示例 326
建议阅读资料 327
习题 327
第9章 层级建模方法 328
9.1 几何图形和实例 328
9.2 层级模型 330
9.3 机器人手臂 331
9.4 树与遍历 333
9.4.1 基于栈的遍历方法 335
9.5 使用树数据结构 337
9.6 动画 340
9.7 图形对象 341
9.7.1 方法、属性和消息 342
9.7.2 立方体对象 343
9.7.3 WebGL中的实例化 345
9.7.4 对象与层级结构 347
9.7.5 几何对象与非几何对象 348
9.8 场景图 348
9.9 实现场景图 350
9.9.1 three.js示例 351
9.10 其他树结构 354
9.10.1 CSG树 354
9.10.2 BSP树 355
9.10.3 四叉树和八叉树 357
小结和注释 358
代码示例 359
建议阅读资料 359
习题 359
第10章 过程建模方法 361
10.1 基于算法的建模 361
10.2 基于物理的建模和粒子系统 362
10.3 牛顿粒子 363
10.3.1 独立的粒子 364
10.3.2 弹簧力 365
10.3.3 吸引力和排斥力 366
10.4 求解粒子系统 367
10.5 约束条件 369
10.5.1 碰撞 369
10.5.2 软约束 371
10.6 一个简单的粒子系统 371
10.6.1 绘制粒子 372
10.6.2 更新粒子的位置 372
10.6.3 碰撞 372
10.6.4 作用力 373
10.6.5 群集行为 374
10.7 基于agent的建模 374
10.8 使用点精灵 377
10.9 基于语言的建模 380
10.10 递归方法和分形 383
10.10.1 标尺和长度 383
10.10.2 分形维数 384
10.10.3 中点划分及布朗运动 385
10.10.4 分形山脉 386
10.10.5 Mandelbrot集 386
10.10.6 Mandelbrot片元着色器 389
10.11 过程噪声 390
小结和注释 392
代码示例 392
建议阅读资料 393
习题 393
第11章 曲线和曲面 395
11.1 曲线和曲面的表示 395
11.1.1 显式表示形式 395
11.1.2 隐式表示形式 396
11.1.3 参数表示形式 397
11.1.4 参数多项式曲线 398
11.1.5 参数多项式曲面 398
11.2 设计准则 399
11.3 三次参数多项式曲线 400
11.4 插值 401
11.4.1 调和函数 402
11.4.2 三次插值曲面片 403
11.5 Hermite曲线和曲面 405
11.5.1 Hermite形式 405
11.5.2 几何与参数连续性 406
11.6 Bézier曲线和曲面 407
11.6.1 Bézier曲线 407
11.6.2 Bézier曲面片 409
11.7 三次B样条 410
11.7.1 三次B样条曲线 410
11.7.2 B样条和基函数 412
11.7.3 样条曲面 413
11.8 通用B样条 413
11.8.1 B样条的递归定义 414
11.8.2 均匀样条 415
11.8.3 非均匀B样条 415
11.8.4 NURBS 415
11.8.5 Catmull-Rom样条 416
11.9 绘制曲线和曲面 417
11.9.1 多项式求值方法 418
11.9.2 递归细分Bézier多项式 419
11.9.3 基于细分算法的其他多项式
曲线的绘制 420
11.9.4 细分Bézier曲面 421
11.10 Utah茶壶 422
11.11 代数曲面 424
11.11.1 二次曲面 424
11.11.2 使用光线投射绘制曲面 424
11.12 曲线和曲面细分 425
11.12.1 网格细分 426
11.13 从数据生成网格 428
11.13.1 回顾高度场 428
11.13.2 Delaunay三角剖分 428
11.13.3 点云 430
11.14 支持曲线和曲面的图形API 431
11.14.1 曲面细分着色 431
11.14.2 几何着色 432
小结和注释 432
代码示例 432
建议阅读资料 433
习题 433
第12章 从几何到像素 435
12.1 基本的绘制策略 435
12.2 绘制流水线 437
12.2.1 建模 438
12.2.2 几何处理 438
12.2.3 光栅化 439
12.2.4 片元处理 439
12.3 裁剪 440
12.3.1 裁剪简介 440
12.3.2 包围盒与包围体 441
12.3.3 使用平面裁剪对象 442
12.4 光栅化 443
12.5 多边形光栅化算法 445
12.5.1 内外测试法 445
12.5.2 WebGL与凹多边形 446
12.6 隐藏面消除 448
12.6.1 对象空间和图像空间消隐
算法 448
12.6.2 排序与隐藏面消除 449
12.6.3 扫描线填充算法 449
12.6.4 背面剔除 450
12.6.5 z缓存算法 451
12.6.6 深度排序和画家算法 453
12.7 硬件实现 455
12.8 反走样 457
12.9 显示方面的问题 459
12.9.1 颜色系统 459
12.9.2 颜色矩阵 462
12.9.3 ? 校正 462
12.9.4 抖动与半色调 463
小结和注释 463
建议阅读资料 465
习题 465
第13章 高级绘制 468
13.1 超越流水线绘制结构 468
13.2 光线跟踪 468
13.3 构建一个简单的光线跟踪器 471
13.3.1 光线跟踪递归算法 471
13.3.2 计算交点 472
13.3.3 其他不同形式的光线跟踪 474
13.4 绘制方程 475
13.5 全局光照和路径跟踪 477
13.6 RenderMan 478
13.7 并行绘制 479
13.7.1 sort-middle绘制方法 480
13.7.2 sort-last绘制方法 480
13.7.3 sort-first绘制方法 483
13.8 隐函数和等高线图 483
13.8.1 步进方格 483
13.8.2 步进三角形 487
13.9 体绘制 487
13.9.1 体数据集 487
13.9.2 隐函数的可视化 488
13.10 等值面与步进立方体 489
13.11 步进四面体 491
13.12 网格简化 492
13.13 直接体绘制 492
13.13.1 指定颜色和透明度 493
13.13.2 抛雪球算法 493
13.13.3 体光线跟踪 494
13.13.4 基于纹理映射的体绘制 495
13.14 基于图像的绘制 495
13.14.1 到立体像对的距离 496
13.14.2 基础矩阵 497
13.15 虚拟现实、增强现实和混合
现实 498
13.16 最后一个示例 499
小结和注释 500
建议阅读资料 501
习题 501
附录A 初始化着色器 503
附录B 空间 507
附录C 矩阵 513
附录D 采样与走样 521
参考文献 527