计算机图形学原理及实践(原书第3版)(进阶篇)
作者 : [美]约翰·F. 休斯(John F. Hughes)安德里斯·范·达姆(Andries van Dam)摩根·麦奎尔(Morgan Mcguire)戴维·F. 斯克拉(David F. Sklar)詹姆斯·D. 福利(James D. Foley)史蒂文· K. 费纳(Steven K. Feiner)科特·埃克里(Kurt Akeley)著
译者 : 彭群生 吴鸿智 王锐 刘新国 等译
丛书名 : 计算机科学丛书
出版日期 : 2021-01-15
ISBN : 978-7-111-67008-7
适用人群 : 高校计算机及相关专业高年级本科生、研究生,以及从事图形学领域工作的研究者和技术人员
定价 : 149.00元
教辅资源下载
扩展信息
语种 : 简体中文
页数 : 596
开本 : 16
原书名 : Computer Graphics: Principles and Practice, Third Edition
原出版社: Pearson Education Asia
属性分类: 教材
包含CD : 无CD
绝版 :
图书简介

本书是计算机图形学领域的经典著作,系统全面地介绍了计算机图形学领域的关键概念、算法、技术和应用。本书先介绍了如何创建二维和三维图像,接下来介绍了更为广泛的话题,包括图像表示和操纵、图像和信号处理、图像的缩放、纹理和纹理映射、交互技术、曲线分割、曲面分割、形状的隐式表示、网格、光、材料和散射、颜色、光传输、概率和蒙特卡洛集成、动画、空间数据结构、现代图形学硬件等内容。

图书特色

图书前言

本书面向学生、研究人员和从业人员,介绍计算机图形学的许多重要概念和思想。其中一些概念读者并不陌生,它们早已出现在广为流行的学术出版物、技术报告、教科书和行业期刊中。在某个概念出现一段时间后再将其写入教科书的好处是,人们可以更充分地理解它的长远影响并将其置于一个更大的背景中予以领悟。本书将尽可能详细地介绍这些概念(当然也略过了一些曾经热门但现在已不再重要的概念),并以一种清晰、流畅的风格将它们呈现给初学者。
本书属于第二代图形学教科书:我们并不将之前的所有工作全部认定为天然合理的,而是按今天的理解重新审视它们,进而更新其原有的陈述方式。
甚至一些最基本的问题也可能变得非常棘手。举例来说,假如要设计一个适用于低光照环境(如电影院的暗环境)的程序。显然,我们不能采用亮屏幕显示器,这意味着在显示程序中采用亮度对比来区分环境中的不同对象不再适宜。也许可以改用彩色显示,但遗憾的是,在低光照环境中人们对颜色的感知同样有所降低,某些颜色的文字要比其他颜色更易读。在这种情况下,光标是否仍容易被用户看到呢?一种简单的应对方式是利用人眼对运动的感知能力,让光标持续抖动。于是,一个看似简单的问题最后涉及交互界面设计、颜色理论以及人类感知等领域。
尽管上述例子很简单,但仍隐含了某些假设:采用图形方式输出(而不是通过触觉或封闭良好的耳机来输出);显示设备既非常规的影院屏幕,也不是头盔显示器。其中也包含了一些显式的假设,例如采用光标(也有一些用户界面不使用光标)。上述每一种假设都是对用户界面的一种选择。
遗憾的是,这种多方面内容相互交织的关系使得我们不可能完全按照某种顺序来讲述各主题,而且还能很好地介绍它们的研究动因和背景,也就是说,这些主题无法以线性方式展开。也许,我们可以先介绍它们涉及的所有相关的数学、感知理论或其他内容,总之,将较为抽象的内容和主题放在前面介绍,然后再介绍图形学应用。尽管这种内容组织方式可能便于参考(读者很容易找到讲述一般化向量叉积的有关章节),但对一本教科书而言,其效果并不好,原因是那些涉及主题研究动因的应用都要等到书的最后才会介绍。另一种展开方式是采取案例研究的思路,分别介绍各种不同的任务(难度不断增大),然后根据问题的需要讲述相关内容。在某些情况下,这确实是一种自然的内容演绎方式,但难以对各主题做出整体性、结构化的呈现。本书是这两种方式的折中:开始部分介绍了广泛使用的数学知识和常规的符号标记方式,然后逐个主题展开内容,根据需要补充介绍必要的数学工具。熟悉数学的读者完全可以跳过开始部分而不致错过任何图形学知识,其他人则可从这些章节中获益良多,教师授课时可根据需要对其进行取舍。基于主题的章节安排方式可能会导致内容上的重复,例如,本书从不同的细节层次对图形流水线进行了多次讨论。与其让读者回头参考之前的章节,有时我们会再次陈述部分内容,使对该问题的讨论更为流畅。毕竟让读者返回500页之前去查看一幅图并非令人惬意的事。
对本教材的作者来说,另一个挑战是选材的广度。本书的第1版确实覆盖了当时图形学出版物中的大部分内容,第2版至少也约略提到了其中大部分的研究工作。本版教材不再追求内容的覆盖度,理由很简单:当本书第2版出版时,我们一只手就能拿起SIGGRAPH会议的全部论文集(这些论文几乎包含了图形学领域的代表性研究);如今,SIGGRAPH会议的全部论文集(仅仅是许多图形学出版物中的一种)叠在一起高达数米。即使是电子版的教材也无法将全部内容塞进1000页中。本书这一版旨在为读者指明在哪里可以找到当今的大部分SIGGRAPH论文。下面是几点说明:
●第一,计算机图形学与计算机视觉的交叉面越来越大,但这并不能构成让我们将本书写成计算机视觉教材的理由,尽管一些有该领域丰富知识的人已经这样做了。
●第二,计算机图形学涉及编程,尽管有许多大型图形学应用项目,但本书并没有试图讲授编程和软件工程。当然,在书中我们也会简要讨论一些专门针对图形学的编程方法(尤其是排错)。
●第三,许多图形学应用都提供了用户界面。在编写本书时,大多数界面均基于Windows操作系统,采用菜单和鼠标进行交互。不过基于触觉的交互界面正变得越来越常见。交互界面的研究曾经是图形学的一部分,但如今已成为一个独立的领域(尽管它仍和图形学有很大的交叉)。我们假定读者在编写含用户界面的程序方面已具备了一些经验,因此本书将不再对它们做深入讨论(除了其实现过程与图形学密切关联的3D界面外)。
毋庸置疑,图形学领域的研究论文区别很大:有些涉及很多的数学表述;有些介绍的是一个大规模的系统,涉及各种复杂的工程因素的权衡;还有些涉及物理学、颜色理论、地形学、摄影学、化学、动物学等各个学科的知识。我们的目标是让读者领会图形学在这些论文中所起的作用,而其他的相关知识则需要读者在课外自行学习。
历史上的方法
在历史上,图形学大多为一些面向当时急需解决的问题的专门方法。这么说并非对那些曾经使用这些方法的人有所不敬,他们手头有任务,必须想办法完成。其中一些解决方法中包含了重要的思想,而另一些解决方法不过是为了完成任务。但这些方法无疑对后面图形学的发展产生了影响。举例来说,大多数图形系统中采用的图像合成模型均假定图像中存储的颜色可以线性方式融合。但实践中,图像中存储的颜色值与其显示的光亮度之间却呈非线性关系,因此颜色的线性组合并不对应光亮度的线性组合。两者之间的差别一直到摄影工作室试图将现实场景的照片与计算机生成的图像合成时才为人们所注意,即上述图像合成方式并不能生成正确的结果。此外,尽管一些早期方法描述十分原则化,但其关联的程序却对实现的硬件做了一些假设,几年后,这些假设不再适用,当读者看到这些实现细节时会说:“这不是过时的东西吗,与我们毫不相关啊!”于是,就忽略了这些研究工作中某些仍旧重要的思想。更多的时候,研究人员只是在重新利用其他学科运用多年的那些概念和方法。
因此,我们不打算按照图形学发展的年代顺序来讲述。正如物理学教程并不从亚里士多德的动力学讲起,而是直接介绍牛顿动力学(更好的是一开始就讲述牛顿动力学系统的局限性,将平台搭建在量子力学的基础上),我们将直接从对相关问题的最新理解入手,当然也会介绍与之相关的各种传统研究思路。同时,我们还会指出这些思路的源头(可能不为大家所熟悉),例如,关于3D多边形法向量的Newell公式即19世纪初期的Grassmann公式。我们希望,指出这些参考源头能增加读者对许多早已开发并有望应用于图形学的方法的了解。
教学方法
日常生活中图形学最令人瞩目的应用是视频游戏中的3D形象以及娱乐行业和广告中的特效。然而,我们每天在家庭电脑和手机中的交互也都离不开计算机图形学。这些界面之所以不那么显眼也许是由于它们太成功了:其实,最好的界面会让你完全忘记它的存在。虽然“2D图形学要比3D图形学简单”这句话听上去很诱人,但是3D图形学不过是一个稍复杂的版本而已。2D图形学中的许多问题,诸如在方形发光单元(像素)组成的屏幕上如何完美地显示一幅图像,或者如何构建高效且功能强大的界面等,都和在绘制3D场景图像时遇到的问题一样困难。而2D图形学中通常采用的简单模型在怎样完美地表示颜色和形状等方面也可能对学生造成误导。因此,我们将2D和3D图形学的讲述交织在一起,分析和讨论两者共同的敏感问题。
VII本书设置“黑盒”的层次与众不同。几乎每一本计算机科学的书都需要选择一个合适的层次来讲述计算机的有关内容,该层次应便于读者理解和掌握。在图形学教科书中,我们同样需要选择一个读者将会遇到的图形学系统。也许,在输入某些指令后,计算机的硬件和软件就能在屏幕上生成一个彩色三角形。但这一切是怎样发生的?其中的细节与图形学的大部分内容并无关联。举例来说,假如你让图形系统绘制一个位于屏幕可显示区域下方的红色三角形,将会发生什么?是先确定那些应置为红色的像素的位置然后因其不在屏幕显示区域内而将其抛弃?还是图形系统尚未开始计算任何像素值之前因发现该三角形位于屏幕之外而终止后面的过程?从某种意义上说,除非你正在设计一块图形卡,否则上述问题并不那么重要,它并非一个图形系统用户所能控制的。因此,我们假定图形系统能够显示像素的值,或画出三角形和直线,而不考虑该过程是怎样实现的。具体实现的细节将在光栅化和图形硬件的相关章节中介绍,但因其大都超出了我们的控制范围,所以诸如裁剪、直线反走样、光栅化算法等内容均将推迟到其后面章节予以介绍。
本书教学方法的另一点是试图展示相关的思想和技术是怎样浮现出来的。这样做无疑会增长篇幅,但我们希望会有所帮助。当学生需要独立推导自己的算法时,他们遇到过的研究案例可能会为当前问题提供解决思路。
我们相信,学习图形学最好的途径是先学习其背后的数学。与直接跨入图形学应用相比,先学习较为抽象的数学确实会延长你开始学习最初的几个图形算法所需的时间,但这个代价是一次性的。等你学习到第10个算法时,先前的投入将会完全得到补偿,因为你会发现新的方法组合了之前已经学过的许多内容。
当然,阅读本书表明你有兴趣编写绘图程序。因此,本书一开始就引入多个题目并直接给出解决方案,然后再回过头仔细讨论更广泛的数学背景。书中大部分篇幅都集中于其后面的处理上。在打下必要的数学基础后,我们将结束上述题目,延伸到其他的相关问题并给出求解思路。由于本书聚焦于基础性的原则,因此并未提供这些方法的实现细节。一旦读者领会了基础原则,每一个求解思路的具体算法就会了然于胸,并将具有足够的知识来阅读和理解其原始参考文献中给出的论述,而不是基于我们的转述。我们能做的是采用更为现代化的形式来介绍那些早期的算法,当读者回头阅读原始文献时,能比较容易理解文献中词汇的含义及其表达方式。
编程实践
图形学是一门需要自己动手实践的学科。由于图形产业为观众提供的是视觉类信息以及相关的交互手段,图形工具也经常用来为新开发的图形算法排错。但这样做需具备编写图形程序的能力。如今已有许多不同的方法可在计算机上生成图像,对本书中介绍的大部分算法而言,每一种方法都有其优点。尽管将一种编程语言和库转化为另一种编程语言和库已成为常规,但从教学的角度,最好是采用单一编程语言以便学生可以聚焦于算法的更深层面。对本书提供的所有练习,我们建议使用WPF(Windows Presentation Foundation,一种广泛使用的图形系统)完成。为此,我们编写了一段基本且易于修改的程序(称为testbed)以便学生使用。对于一些不适于采用WPF的情形,我们通常采用G3D(一个公共的图形库,由本书的一位作者维护)。大多数情况下,我们使用伪代码,因为它提供了一种简洁的算法表述方式,而且,绝大多数算法的实际代码(按你所选语言编制)均可从网上下载,因此将其编入书中并无意义。注意代码形成过程中的变化,在有些情形中,它的最初版本只是一个非正式的框架,然后逐步发展成采用某种语言编写的接近于完成的程序,因此对其之前的版本进行语法检查并无意义,可以免去。有时,我们希望代码能反映数学推导过程,故采用诸如xR之类的变量名,这使其看上去如同数学表达式。总的来说,伪代码并非正式编程语言,我们用它来表达宏观的思路而非算法的细节。
本书并非一本讨论如何编写图形程序的书,书中不会讨论应用图形程序中的细节。例如,读者无法从本书中找到有关Adobe最新图像编辑软件如何存储图像的任何提示。但只要读者领会了书中的概念并具备足够的编程能力,就一定能编写图形程序,并知道如何应用这些程序。
原则
在本书中,我们列出了一些计算机图形学的原则,希望对读者未来的工作有所帮助。也收录了一些有关图形学实践的章节,如怎样运用现有的硬件来逼近理想解,或者更快速地计算出实际解。虽然这些实现方法是面向现有硬件的,但对未来也有价值。也许十年后不能直接照搬这些实现方法,但其中蕴含的算法在多年内仍有意义。
预备知识
本书大部分内容所需的预备知识并未超出一般理工类在校生的知识范围,如:编写面向对象程序的能力;掌握微积分工具;对向量有所了解(可能是从数学、物理学甚至是计算机科学的课程中学到的);至少遇到过线性变换等。我们也希望学生编写过一两个含有2D图形对象(如按钮、复选框、图标等)的程序。
本书一部分内容会涉及更多的数学知识,但在有限的篇幅内讲授这些知识是不现实的。一般而言,这些稍显复杂的数学知识将被精心安排于少数章节内,而这些章节更适合作为研究生的课程。它们和某些涉及深度数学知识的练习均注有“数学延伸”()标记。同样,涉及计算机科学中较深概念的内容注有“计算机科学延伸”()标记。
书中某些数学表述可能令那些曾在其他地方接触过向量的人感到困惑。本书的第一作者是一位数学博士,当第一次看到图形学研究论文中涉及数学问题的表述时,他也同样感到奇怪。本书试图清晰和彻底地解释它们与标准的数学表述之间的不同之处。
讲授本书的方式
本书可作为一个学期或一个学年的本科生课程的教科书,或者作为研究生课程的参考书。作为本科生的教学用书时,其中较深的数学内容(如仿重心坐标标架、流形网格、球面调和函数等)可以略去,而集中于几何模型的建模与显示,各种变换的数学原理,相机的数学描述,以及标准的光照、颜色、反射率模型及其局限性等基础问题。也应介绍一些基本的图形学应用和用户界面,讨论在设计中如何对各种因素进行权衡和折中以使其更有效率,也许最后再介绍几个特殊的主题,如怎样创建一段简单的动画、编写一个基础的光线跟踪程序等。上述内容对一学期的课程而言可能太多,即使是一学年的课程,也不可能覆盖书中的每一节,未讲授的内容可供有兴趣的学生课后学习。
IX安排较满的一学期课程(14周)可讲授下述内容:
1.绪论和一个简单的2D程序:第1、2、3章。
2.对绘制中几何问题的介绍,进一步的2D和3D程序:第3、4章。视觉感知和人类的视觉系统:第5章。
3.2D和3D几何建模——网格、样条、隐函数模型:7.1~7.9节,第8、9章,22.1~22.4节,23.1~23.3节,24.1~24.5节。
4.图像,第一部分:第17章、18.1~18.11节。
5.图像,第二部分:18.12~18.20节、第19章。
6.2D和3D变换:10.1~10.12节、11.1~11.3节、第12章。
7.取景、相机以及posthomogeneous插值:13.1~13.7节、15.6.4节。
8.图形学中的标准近似:第14章、某些相关的章节。
9.光栅化与光线投射:第15章。
10.光照与反射:26.1~26.7节(26.5节或可不选)、26.10节。
11.颜色:28.1~28.12节。
12.基本反射模型,光能传输:27.1~27.5节、29.1~29.2节、29.6节、29.8节。
13.递归光线跟踪细节,纹理:24.9节、31.16节、20.1~20.6节。
14.可见面判定和面向加速的数据结构,更前沿的图形绘制技术:第31、36、37章中的相关节。
不过,并非上面提到的每一节中的所有内容都适合于初学者。
另外,也可参考作为本科生基于物理的绘制课(12周课程)的教学大纲。该课程按离线绘制到实时绘制的原则安排授课内容。可深入其中的核心数学和光线跟踪背后的辐射度学,然后回过头来再介绍计算机科学中提升算法可扩展性和性能的有关方法。
1.绪论:第1章。
2.光照:第26章。
3.感知,光能传输:第5、29章。
4.网格和场景图简介:6.6节、14.1~14.5节。
5.变换:第10、13章(简要介绍)。
6.光线投射:15.1~15.4节、7.6~7.9节。
7.面向加速的数据结构:第37章、36.1~36.3节、36.5~36.6节、36.9节。
8.绘制理论:第30、31章。
9.绘制实践:第32章。
10.颜色和材质:14.6~14.11节,第27、28章。
11.光栅化:15.5~15.9节。
12.着色器和硬件:16.3~16.5节,第33、38章。
注意上述授课内容并非按各章顺序排列。在编著本书时,我们试图让大多数章的内容独立成篇,彼此交叉引用而不互为必需的预备知识,以支持这种授课思路。
与之前版本的差异
尽管本版教材包含了之前版本中的大部分主题,但其内容几乎是全新的。随着GPU的出现,三角形的光栅化(转换为像素或采样)已采用完全不同的方法而非传统的扫描转换算法,对传统的算法本书将不再介绍。在讲述光照模型时,将更偏重测量所用的物理单位,这无疑增加了讨论的复杂性,而传统模型并未涉及各物理量的单位。此外,之前版本分别准备了2D和3D两个图形学平台,而本书采用现在广泛使用的系统,并提供了有助于学生起步的工具。
网址
在本书中常可看到本书的网址http://cgpp.net,其中不仅包含测试程序和实现的实例,而且包含许多章节的附加参考材料以及第2、6章中的WPF交互实验。
致谢
本书虽系作者编著,但因包含了众多人的贡献而大为增色。
本书受到Microsoft公司的支持和鼓励,感谢Eric Rudder和S.Somasegar在本项目启动和结束时给予的帮助。
3D测试程序最初源于Dan Leventhal 编写的代码,kindohm.com的Mike Hodnick慷慨地提供他的代码作为早期版本开发的起点,感谢Jordan Parker和Anthony Hodsdon在WPF系统方面的帮助。
Williams学院的两名学生为本书出版付出了很大努力。其中Guedis Cardenas协助整理了全书的参考文献,Michael Mara则协助开发了在本书多章中均有应用的G3D Innovation Engine。电子艺术系的Corey Taylor对开发G3D软件提供了帮助。
CMU的Nancy Pollard、Pittsburgh大学的Liz Marai在他们的图形学课程中曾讲授过本书部分章节的早期版本,并向我们提供了有价值的反馈意见。
Jims Arvo不仅是本书中有关绘制的一切问题的总指导,而且还重塑了本书第一作者对图形学的理解。
除了以上提到的,还有许多人阅读过各章的初稿、提供了图像或插图、对主题或其讲述方式提出建议或通过其他方式提供帮助,他们是(按字母顺序):John Anderson, Jim Arvo, Tom Banchoff, Pascal Barla, Connelly Barnes, Brian Barsky, Ronen Barzel, Melissa Byun, MariePaule Cani, Lauren Clarke, Elaine Cohen, Doug DeCarlo, Patrick Doran, Kayvon Fatahalian, Adam Finkelstein, Travis Fischer, Roger Fong, Mike Fredrickson, Yudi Fu, Andrew Glassner, Bernie Gordon, Don Greenberg, Pat Hanrahan, Ben Herila, Alex Hills, Ken Joy, Olga Karpenko, Donnie Kendall, Justin Kim, Philip Klein, Joe LaViola, Kefei Lei, Nong Li, Lisa Manekofsky, Bill Mark, John Montrym, Henry Moreton, Tomer Moscovich, Jacopo Pantaleoni, Jill Pipher, Charles Poynton, Rich Riesenfeld, Alyn Rockwood, Peter Schroeder, Franois Sillion, David Simons, Alvy Ray Smith, Stephen Spencer, Erik Sudderth, Joelle Thollot, Ken Torrance, Jim Valles, Daniel Wigdor, Dan Wilk, Brian Wyvill, Silvia Zuffi。尽管我们力图列出所有帮助过我们的人的名单,但仍可能有所遗漏,在此谨致歉意。
作为本领域团结与合作的例证,我们也收到了其他同类书作者的书信,他们对本书写作表示了极大的支持。Eric Haines、Greg Humphreys、Steve Marschner、Matt Pharr和Pete Shirley对本书的出版提供了很好的意见。能在这样一个学术领域中工作我们深感荣幸。
没有彼此之间的支持、宽容、对任务的执着以及责任编辑Peter Gordon独到的视角,本书的出版是不可想象的!尤为感谢我们的家人在整个项目期间对本项工作的理解和巨大支持!
致学生
也许你的老师已经选择了一种讲授本书的方式,选择时已考虑各主题之间的相互衔接,或者可能采用了上面所建议的一种教学思路。不过你不必受此束缚。倘若你有意了解某些内容,可根据目录直接阅读。如感到缺乏某方面的背景知识,难以领悟所阅读的内容,可阅读必要的背景材料。因为有动机,你会感到此时比其他时候学起来更容易。停下来时,可从网上搜索他人的实现代码,下载并运行。假如感到结果有问题,可检查执行程序,尝试进行反向推断。有时候这的确是一种学习某些内容的有效方式,即采用实践理论再实践的学习模式:先尝试做某件事,看能否成功,倘若不成,则研读别人怎样做此事,然后再试。初次尝试可能会遭遇一些挫折,但一旦成功,你会获得对其理论的更深的理解。如果难以采取实践理论再实践的学习模式,至少应该花点时间完成你所阅读章节中的课内练习。
图形学是一门年轻的学科,经常可看到本科生作为合作作者在SIGGRAPH上发表论文。只需一年,你就可以掌握足够的知识并开始形成新的思想。
图形学也涉及许多数学知识。假如对你来说数学总是显得那么抽象和理论化,图形学将改变你的这一印象。数学在图形学中的应用可谓立竿见影,你很容易在所绘图中见到应用某一理论的实际效果。倘若你运用数学已得心应手,则可尝试采用本书提出的学术思路并做进一步推广,从而享受其中的乐趣。尽管本书包含了大量的数学内容,然而,对于当代研究论文中用到的数学而言,它不过刚刚触及其表皮而已。
最后,质疑一切。尽管作者已尽最大努力按当今的理解讲述所有内容,但只能说绝大部分内容叙述准确。在少数地方,当引入一个概念时,我们有意只讲述了部分内涵,而在稍后章节讨论细节时才全面展开。但在除此之外的其他地方,我们并未都这样做。有时候甚至会出错,遗漏一个“负号”或在循环中犯“循环次数少一次”的错误。在某些情形中,图形学领域对某概念的理解可能存在偏差,而我们采信了某一些人的观点,这只能留待未来纠正。上述问题读者都可能遇到。正如Martin Gardner所言,在科学探索中真正的声音不是“啊哈!”而是“哟,有点奇怪啊……”。假如你在阅读中发现某处显得有点怪,请大胆质疑,再仔细看几遍。如果证实是对的,将可澄清你理解中的混乱之处。如果真有问题,则将成为你推动学科进展的机会。
致教师
如果你是教师,你也许已浏览了上面“致学生”的内容(尽管它不是面向教师的,但你的学生也读了此节)。在那部分中,我们建议学生可以按任意顺序阅读本书各章,并可质疑一切。
我们向你建议两件事。第一,你应鼓励甚至要求你的学生完成本书中的课内练习。对那些声称“我有许多事要做,不能浪费时间停下来做练习”的人,你只需说:“是呀,我们没时间将车停下来加油……因为我们已经迟了!”第二,你在给学生布置课题或作业时,应既有一个确定的任务,也有一个开放的目标。那些成绩稳定的学生将会完成确定的任务,并学习你指定的内容。而另一些学生,当有机会做点有趣的事时,可能会做朝向开放目标的练习而让你惊讶。在做此类练习时,他们将会感到需要学习一些恰巧不懂的知识,而当他们掌握了这些知识后,问题就会迎刃而解。图形学就是这样一种特别的学问:成功马上看得见而且立刻有回报,从而形成一个推动向前的正反馈。可见性反馈加上算法的可扩展性(计算机科学中经常遇到)能给人以启示。
讨论和延伸阅读
本书中许多章都包含了“讨论和延伸阅读”一节,其中会给出若干背景参考文献或对该章思想的深层次应用。对前言来说,唯一适合延伸阅读的内容并非特定文献而是一般化的读物:我们建议读者着手查阅ACM SIGGRAPH和Eurographics、Computer Graphics International或其他图形学会议的论文集。根据你的兴趣,还可关注一些更为专门的会议,如Eurographics Symposium on Rendering、I3D、Symposium on Animation等。乍一看,这些会议的论文似乎涉及大量的知识,但你很快就会觉察哪些事是有可能做到的(假若只看图形效果),以及需要哪些技能才能达到目的。你会很快发现某些问题在你非常感兴趣的领域中多次出现,在后面学习图形学时这将指引你做延伸阅读。

上架指导

计算机\图形图像

封底文字

本书是计算机图形学领域久负盛名的经典教材,被国内外众多高校选作教材。第3版全面升级,新增17章,从形式到内容都有极大的变化,与时俱进地对图形学的关键概念、算法、技术及应用进行了细致的阐释。为便于教学,中文版分为基础篇和进阶篇两册,此为进阶篇,主要内容包括三角形网格面的简化和修复及细节层次表示、复杂形状的建模技术、细分曲线曲面、图像的表示及存储格式、图像的采样和重建方法、表面材质散射模型、颜色感知与颜色描述、图形着色器、表意式绘制、计算机动画、现代图形硬件等。
主要特点
首先介绍预备数学知识,然后对不同的图形学主题展开讨论,并在需要时补充新的数学知识,从而搭建起易于理解的学习路径,实现理论与实践的相互促进。
更新并添加三角形网格面、图像处理等当代图形学的热点内容,摒弃了传统的线画图形内容,同时关注经典思想和技术的发展脉络,培养解决问题的能力。
基于WPF和G3D展开应用实践,用大量伪代码展示算法的整体思路而略去细节,从而聚焦于基础性原则,在读者具备一定的编程经验后便能够做到举一反三。
本书网站http://cgpp.net提供了书中相关的测试程序和实现实例,并且包含许多章节的附加参考材料及相关章节的交互实验。

译者序

计算机图形学是信息社会的重要支撑技术之一。在众多的计算机图形学教材中,J.D.Foley等人编写的Computer Graphics:Principles and Practice是公认的经典教材。早在1982年,J.D.Foley就和A.van Dam合作出版了Fundamentals of Interactive Computer Graphics,1990年,他们继续与Steven K.Feiner和John F.Hughes合作,编写了该系列教材的第2版。1995年,作者将第2版中的所有实例和算法程序从Pascal语言改写成C语言。我国学者唐泽圣、董士海等将该版教材译成中文版《计算机图形学原理及实践:C语言描述》。由于第2版教材概念清晰,叙述深入,注重实践环节和能力培养,因此被广大图形学教师作为教材或作为必备的教学参考书,产生了很大的影响。
在过去的20年间,图形学取得了飞速的发展。基于CPU的传统图形流水线(又称为2D显卡)被基于GPU的3D图形流水线所取代。与此同时,三角形网格表面成为图形系统中景物表面的主要表示形式。计算机图形学与数字图像处理、计算机视觉等学科日益交叉,形成了基于图像的绘制、增强现实等新的学科方向。为了反映图形学的新发展,由第2版的4位作者中的John F.Hughes领衔,作者增加至7人,于2013年7月出版了本系列教材的第3版。
新版教材由38章组成。与第2版教材(共21章)相比,新版从内容到形式都有巨大的改变。第一,传统的线画图形内容,包括直线和圆弧的生成算法、线裁剪、线消隐、基于扫描线的多边形生成等经典算法已不再是计算机图形学关注的重点,因此不再列为本书的教学内容。第二,三角形网格面便于GPU处理,因而成为图形学研究的热点。本书专辟章节介绍三角形网格面的表示和简化、多层次网格的构建和传输以及细分曲面的生成。第三,新增了若干关于图像处理的内容,包括常用的图像格式、图像信号的采样与重建、图像的自适应缩放等。第四,由于计算机图形学是一门面向应用的学科,本书重点讲述了图形学中各种常用的近似模型及其表示方法、基于GPU的图形流水线的组成以及各种实用的实时3D图形平台。由于新版教材内容丰富,为了便于安排教学,我们将中文版划分为基础篇和进阶篇两册出版。这本进阶篇对应原书的第17~38章,内容涵盖三角形网格面的简化和修复及细节层次表示、复杂形状的建模技术、细分曲线曲面、图像的表示及存储格式、图像的采样和重建方法、表面材质散射模型、颜色感知与颜色描述、图形着色器、表意式绘制、计算机动画、现代图形硬件等。
翻译如此一本经典教材无疑是一项极为艰巨的任务,尽管我们有翻译D.F.Rogers的Procedural Elements of Computer Graphics第1、2版的经验,但面对这本久负盛名的教材,我们仍感到压力巨大。在翻译中,我们采取了分工合作的方法。参加进阶篇各章初稿翻译的有浙江大学CAD&CG国家重点实验室冯结青、王锐、张宏鑫、吴鸿智、刘新国、万华根,浙江工业大学陈佳舟,武汉大学肖春霞,广州大学方美娥等。浙江大学吴鸿智(第31、32章)、王锐(第38章)、刘新国(第24、36章)分别参加了相应各章初稿的审核和修改。全书最后由彭群生逐章仔细校对,修改定稿。
由于译者的水平和学识有限,译文中翻译不当之处在所难免,恳请读者批评指正。

译者
2020年11月

图书目录

出版者的话
译者序
前言
作者简介
第17章 图像表示与操作1
 17.1 引言1
 17.2 什么是图像1
  17.2.1 一幅图像存储的信息2
 17.3 图像文件格式2
  17.3.1 选择图像格式3
 17.4 图像合成4
  17.4.1 图像合成中像素的含义5
  17.4.2 计算U over V5
  17.4.3 简化合成6
  17.4.4 其他合成运算6
  17.4.5 物理单位和合成7
 17.5 其他图像类型7
  17.5.1 术语8
 17.6 MIP图8
 17.7 讨论和延伸阅读9
 17.8 练习10
第18章 图像和信号处理11
 18.1 引言11
  18.1.1 概述11
  18.1.2 重要的术语、假设和概念13
 18.2 历史动因14
 18.3 卷积17
 18.4 卷积的性质19
 18.5 卷积的计算20
 18.6 重建21
 18.7 函数类21
 18.8 采样22
 18.9 数学考虑23
  18.9.1 基于频率的合成与分析25
 18.10 傅里叶变换的定义28
 18.11 在一个区间上的函数的傅里叶变换28
  18.11.1 采样和区间上的带宽限制30
 18.12 推广到更大的区间和整个R上31
 18.13 傅里叶变换的例子32
  18.13.1 基本例子32
  18.13.2 盒函数的变换是sinc函数32
  18.13.3 区间上的例子34
 18.14 采样的近似34
 18.15 涉及极限的例子35
  18.15.1 窄盒函数和delta函数35
  18.15.2 梳子函数及其变换35
 18.16 傅里叶逆变换36
 18.17 傅里叶变换的性质36
 18.18 应用37
  18.18.1 带宽限制37
  18.18.2 在频谱中解释复制39
 18.19 重建和带宽限制40
 18.20 再谈走样43
 18.21 讨论和延伸阅读44
 18.22 练习47第19章 图像缩放48
 19.1 引言48
 19.2 图像放大49
 19.3 图像缩小51
 19.4 算法实用化52
 19.5 有限支撑近似54
  19.5.1 实用的带限函数56
 19.6 其他图像操作和效率56
 19.7 讨论和延伸阅读58
 19.8 练习59
第20章 纹理与纹理映射60
 20.1 引言60
 20.2 各种纹理映射61
  20.2.1 环境映射62
  20.2.2 凹凸映射62
  20.2.3 轮廓绘制63
 20.3 根据参数化构建切向量64
 20.4 纹理图的取值范围65
 20.5 确定纹理坐标66
 20.6 应用实例69
 20.7 采样、走样、滤波以及重构69
 20.8 纹理合成71
  20.8.1 基于傅里叶变换的纹理合成71
  20.8.2 Perlin噪声71
  20.8.3 反应扩散纹理73
 20.9 数据驱动的纹理合成74
 20.10 讨论和延伸阅读76
 20.11 练习77第21章 交互技术79
 21.1 引言79
 21.2 用户界面与计算机图形学79
  21.2.1 一般规则82
  21.2.2 交互事件处理84
 21.3 二维操作的多触点交互85
  21.3.1 问题定义86
  21.3.2 构建程序86
  21.3.3 交互器87
 21.4 三维空间中基于鼠标的物体操作90
  21.4.1 跟踪球界面90
  21.4.2 弧球界面93
 21.5 基于鼠标的相机操作:Unicam94
  21.5.1 平移94
  21.5.2 旋转95
  21.5.3 附加操作96
  21.5.4 评估96
 21.6 选择最佳界面96
 21.7 一些界面实例96
  21.7.1 第一人称射击游戏控制96
  21.7.2 3ds Max变换小工具97
  21.7.3 Photoshop的自由变换模式97
  21.7.4 Chateau98
  21.7.5 Teddy99
  21.7.6 Grabcut与通过笔画的选择99
 21.8 讨论和延伸阅读100
 21.9 练习102
第22章 样条曲线和细分曲线104
 22.1 引言104
 22.2 基本多项式曲线104
 22.3 两条曲线间的拟合曲线段:Hermite曲线104
  22.3.1 Bézier曲线106
 22.4 曲线拼接与CatmullRom样条107
  22.4.1 CatmullRom样条的推广109
  22.4.2 CatmullRom样条的应用110
 22.5 三次B样条110
  22.5.1 其他B样条111
 22.6 细分曲线112
 22.7 讨论和延伸阅读113
 22.8 练习113
第23章 样条曲面和细分曲面114
 23.1 引言114
 23.2 Bézier曲面片114
 23.3 CatmullClark细分曲面116
 23.4 细分曲面造型119
 23.5 讨论和延伸阅读120
第24章 形状的隐式表示121
 24.1 引言121
 24.2 隐式曲线121
 24.3 隐式曲面124
 24.4 表示隐函数125
  24.4.1 插值方法125
  24.4.2 样条曲线126
  24.4.3 数学模型及采样隐式表示127
 24.5 隐式函数的其他表示127
 24.6 转换成多面体网格128
  24.6.1 移动立方体131
 24.7 多面体网格到隐式表示的转换132
 24.8 纹理隐式模型132
  24.8.1 模型变换和纹理132
 24.9 光线跟踪隐式曲面133
 24.10 动画中的隐式形状133
 24.11 讨论和延伸阅读134
 24.12 练习135
第25章 网格136
 25.1 引言136
 25.2 网格拓扑137
  25.2.1 表面三角化和有边界表面138
  25.2.2 计算和存储邻接关系139
  25.2.3 更多网格术语141
  25.2.4 网格嵌入和网格拓扑142
 25.3 网格几何143
  25.3.1 网格含义144
 25.4 细节层次145
  25.4.1 渐进式网格148
  25.4.2 其他网格简化途径151
 25.5 网格应用1:移动立方体算法、网格修复、网格优化151
  25.5.1 移动立方体算法的变化形式151
  25.5.2 网格修复153
  25.5.3 差分或拉普拉斯坐标系154
  25.5.4 拉普拉斯坐标的应用156
 25.6 网格应用2:变形传递和三角形排序优化158
  25.6.1 变形传递158
  25.6.2 有利于提高硬件效率的三角形重排序161
 25.7 讨论和延伸阅读163
 25.8 练习164
第26章 光165
 26.1 引言165
 26.2 光的物理学原理165
 26.3 微观角度166
 26.4 光的波动性169
  26.4.1 衍射170
  26.4.2 偏振171
  26.4.3 光在界面的偏折172
 26.5 菲涅耳定律和偏振174
  26.5.1 辐射度计算与非偏振形式的菲涅耳方程175
 26.6 将光建模为连续流176
  26.6.1 概率密度的简单介绍177
  26.6.2 进一步对光进行建模178
  26.6.3 角度和立体角178
  26.6.4 计算立体角180
  26.6.5 一个重要的变量置换182
 26.7 对光的度量184
  26.7.1 辐射术语185
  26.7.2 辐射度185
  26.7.3 两个辐射度计算的例子186
  26.7.4 辐射照度187
  26.7.5 辐射出射度189
  26.7.6 辐射功率或辐射通量189
 26.8 其他度量190
 26.9 导数的方法190
 26.10 反射率191
  26.10.1 相关项193
  26.10.2 镜子、玻璃、互易性和BRDF194
  26.10.3 L的不同写法195
 26.11 讨论和延伸阅读195
 26.12 练习196
第27章 材质和散射198
 27.1 引言198
 27.2 物体级散射198
 27.3 表面散射199
  27.3.1 脉冲现象199
  27.3.2 散射模型的种类199
  27.3.3 散射的物理约束200
 27.4 散射类型200
 27.5 基于经验和现象的散射模型204
  27.5.1 镜面“散射”204
  27.5.2 朗伯反射204
  27.5.3 Phong和BlinnPhong模型206
  27.5.4 Lafortune模型208
  27.5.5 采样209
 27.6 基于测量的模型209
 27.7 镜面反射和漫反射的物理模型210
 27.8 基于物理的散射模型210
  27.8.1 重谈菲涅耳方程组211
  27.8.2 TorranceSparrow模型212
  27.8.3 CookTorrance模型214
  27.8.4 OrenNayar模型215
  27.8.5 波动理论模型216
 27.9 表达形式的选择216
 27.10 评估标准217
 27.11 沿表面的变化217
 27.12 对用户的适用性218
 27.13 更复杂的散射218
  27.13.1 参与介质218
  27.13.2 次表面散射220
 27.14 材质模型的软件接口221
 27.15 讨论和延伸阅读222
 27.16 练习223
第28章 颜色225
 28.1 引言225
  28.1.1 颜色的含义225
 28.2 光的光谱分布226
 28.3 颜色感知现象和眼睛生理学227
 28.4 颜色的感知229
  28.4.1 亮度感知229
 28.5 颜色描述233
 28.6 关于颜色的传统认识235
  28.6.1 原色235
  28.6.2 紫色并不是真正的颜色236
  28.6.3 物体具有颜色,在白光下即可看出236
  28.6.4 蓝色和绿色合成青色237
  28.6.5 颜色就是RGB237
 28.7 颜色感知的长处和短处237
 28.8 标准的颜色描述238
  28.8.1 CIE颜色描述238
  28.8.2 色度图的应用241
 28.9 感知颜色空间242
  28.9.1 其他242
 28.10 阶段小结243
 28.11 白色244
 28.12 亮度编码、幂指数以及γ矫正244
 28.13 描述颜色245
  28.13.1 RGB颜色模型246
 28.14 CMY和CMYK颜色模型248
 28.15 YIQ颜色模型248
 28.16 视频标准249
 28.17 HSV和HLS250
  28.17.1 颜色选择250
  28.17.2 调色板250
 28.18 颜色插值251
 28.19 计算机图形学中对颜色的使用252
 28.20 讨论和延伸阅读253
 28.21 练习253
第29章 光线传播255
 29.1 引言255
 29.2 光线传播概述255
  29.2.1 绘制方程(第一种类型)257
 29.3 略做前瞻258
 29.4 一般散射的绘制方程260
  29.4.1 度量方程261
 29.5 再谈散射262
 29.6 实例263
 29.7 求解绘制方程265
 29.8 光线传播路径分类265
  29.8.1 引人注目的视觉现象和光线传播266
 29.9 讨论268
 29.10 练习268
第30章 概率和蒙特卡罗积分269
 30.1 引言269
 30.2 数值积分269
 30.3 随机变量和随机算法270
  30.3.1 离散概率及其与计算机程序的联系270
  30.3.2 期望值272
  30.3.3 数学期望的性质和相关术语273
  30.3.4 连续型概率274
  30.3.5 概率密度函数276
  30.3.6 球面域上的应用278
  30.3.7 一个简单的例子279
  30.3.8 在光线散射中的应用279
 30.4 再谈连续型概率280
 30.5 重要性采样和积分283
 30.6 混合概率284
 30.7 讨论和延伸阅读285
 30.8 练习285
第31章 解绘制方程:理论方法288 31.1 引言288
 31.2 方程的近似求解法288
 31.3 方法1:构建近似方程288
 31.4 方法2:限制定义域289
 31.5 方法3:采用统计方法估计290
  31.5.1 通过采样和估计求级数的和290
 31.6 方法4:二分法292
 31.7 其他方法293
 31.8 再谈绘制方程293
  31.8.1 关于符号295
 31.9 我们需要计算什么296
 31.10 离散化方法:辐射度算法298
 31.11 对光线传播路径进行分离303
 31.12 绘制方程的级数解304
 31.13 光线传播的其他表述方式305
 31.14 级数解的近似值306
 31.15 对散射的近似:球面调和函数307
 31.16 蒙特卡罗方法入门309
 31.17 路径跟踪313
 31.18 路径跟踪和马尔可夫链314
  31.18.1 马尔可夫链方法314
  31.18.2 递归法318
  31.18.3 建立一个路径跟踪器320
  31.18.4 多种重要性采样324
  31.18.5 双向路径跟踪325
  31.18.6 中心光线传播算法326
 31.19 光子映射327
  31.19.1 图像空间的光子映射算法330
 31.20 讨论和延伸阅读331
 31.21 练习333
第32章 绘制实践334
 32.1 引言334
 32.2 表示法334
 32.3 曲面表示及BSDF的局部表示方法334
  32.3.1 镜面和点光源338
 32.4 光的表示方法339
  32.4.1 光源的表示方法339
 32.5 基本的路径跟踪器340
  32.5.1 预备知识341
  32.5.2 路径跟踪器的代码343
  32.5.3 结果与讨论351
 32.6 光子映射353
  32.6.1 结果与讨论359
  36.6.2 对光子映射的进一步讨论361
 32.7 泛化362
 32.8 绘制与调试363
 32.9 讨论和延伸阅读366
 32.10 练习370
第33章 着色器373
 33.1 引言373
 33.2 不同形式的图形管线373
 33.3 发展历史374
 33.4 一个包含着色器的简单图形程序377
 33.5 Phong着色器381
 33.6 环境映射382
 33.7 两个版本的卡通着色器384
 33.8 基本的XToon着色385
 33.9 讨论和延伸阅读387
 33.10 练习387
第34章 表意式绘制388
 34.1 引言388
  34.1.1 表意式绘制的例子390
  34.1.2 本章结构390
 34.2 表意式绘制的挑战391
 34.3 标记和笔画392
 34.4 感知与显著特征393
 34.5 几何曲线提取394
  34.5.1 脊点与谷点398
  34.5.2 示意轮廓399
  34.5.3 明显脊线400
  34.5.4 非几何特征401
 34.6 抽象401
 34.7 讨论和延伸阅读402
第35章 运动405
 35.1 引言405
 35.2 导引例子407
  35.2.1 行人(关键姿势)407
  35.2.2 开炮(仿真)410
  35.2.3 走廊导航(运动规划)412
  35.2.4 符号413
 35.3 绘制的考虑415
  35.3.1 双缓存技术415
  35.3.2 运动感知415
  35.3.3 隔行扫描417
  35.3.4 时序走样和运动模糊418
  35.3.5 利用时间连贯性421
  35.3.6 第一帧问题422
  35.3.7 时间连贯性带来的负担422
 35.4 运动表示424
  35.4.1 物体425
  35.4.2 限制自由度426
  35.4.3 关键姿势426
  35.4.4 动力学426
  35.4.5 过程动画427
  35.4.6 混合控制模式427
 35.5 姿势插值430
  35.5.1 顶点动画430
  35.5.2 根坐标系运动430
  35.5.3 关节物体431
  35.5.4 骨架动画432
 35.6 动力学433
  35.6.1 粒子433
  35.6.2 微分方程公式434
  35.6.3 分段常量近似435
  35.6.4 常见的力的模型436
  35.6.5 粒子碰撞443
  35.6.6 动力学微分方程446
  35.6.7 求解常微分方程的数值方法450
 35.7 动力学求解的稳定性453
 35.8 讨论454
第36章 可见性判定455
 36.1 引言455
  36.1.1 可见性函数456
  36.1.2 基本可见性459
  36.1.3 (二值)覆盖459
  36.1.4 目前的实践和动机460
 36.2 光线投射460
  36.2.1 BSP光线多边形求交461
  36.2.2 光线测试的并行度评估463
 36.3 深度缓存464
  36.3.1 通用深度缓存编码467
 36.4 列表优先级算法469
  36.4.1 画家算法470
  36.4.2 深度排序算法471
  36.4.3 聚类和BSP排序471
 36.5 视域剔除和裁剪472
  36.5.1 视域剔除472
  36.5.2 裁剪473
  36.5.3 全视域体裁剪474
 36.6 背面剔除475
 36.7 层次遮挡剔除476
 36.8 基于分区的保守可见性477
  36.8.1 穿刺树478
  36.8.2 入口和镜子479
 36.9 部分覆盖480
  36.9.1 空间反走样(xy)481
  36.9.2 散焦(uv)485
  36.9.3 运动模糊(t)486
  36.9.4 覆盖作为材质属性(α)487
 36.10 讨论和延伸阅读487
 36.11 练习488
第37章 空间数据结构489
 37.1 引言489
  37.1.1 动因举例490
 37.2 程序界面491
  37.2.1 求交方法492
  37.2.2 提取关键字和包围体495
 37.3 数据结构的特征分析499
  37.3.1 一维链表举例499
  37.3.2 一维树举例500
 37.4 多维数据结构概述501
 37.5 列表502
 37.6 树504
  37.6.1 二叉空间剖分树505
  37.6.2 构建BSP树:八叉树、四叉树、BSP树、kd树509
  37.6.3 包围体层次结构512
 37.7 网格513
  37.7.1 构造513
  37.7.2 光线求交515
  37.7.3 选择网格分辨率518
 37.8 讨论和延伸阅读520
第38章 现代图形硬件522
 38.1 引言522
 38.2 NVIDIA GeForce 9800 GTX 523
 38.3 体系结构与实现525
  38.3.1 GPU体系结构526
  38.3.2 GPU实现528
 38.4 并行化528
 38.5 可编程性531
 38.6 纹理、内存和时延533
  38.6.1 纹理映射534
  38.6.2 内存基础537
  38.6.3 应对时延539
 38.7 局部性541
  38.7.1 访问的局部性541
  38.7.2 高速缓存543
  38.7.3 分歧545
 38.8 其他组织方案548
  38.8.1 延迟着色548
  38.8.2 分片绘制549
  38.8.3 Larrabee:GPU和CPU的混合体551
 38.9 GPU作为计算引擎553
 38.10 讨论和延伸阅读554
 38.11 练习554
参考文献
 参考文献为网络资源,请访问华章网站www.hzbook.com下载。——编辑注

教学资源推荐
作者: [英] 理查德?伯德(Richard Bird) 著
作者: 范策 周世平 胡潇琨 等编著
作者: 孙正兴 周良 郑洪源 谢强
作者: 刘春燕 吴黎兵 黄华 主编 扉页署名:刘春燕 吴黎兵 黄华 主编熊建强 康卓 何宁 黄文斌 高建华 熊素萍 林莉 参编
参考读物推荐
作者: 赵军 等编著
作者: 华诚科技 编著
作者: [比] 希普·万登·布鲁克(Seppe vanden Broucke),巴特·巴森斯(Bart Baesens) 著