计算机图形学原理及实践(原书第3版)(基础篇)
作者 : [美]约翰·F. 休斯(John F. Hughes)安德里斯·范·达姆(Andries van Dam)摩根·麦奎尔(Morgan Mcguire)戴维·F. 斯克拉(David F. Sklar)詹姆斯·D. 福利(James D. Foley)史蒂文· K. 费纳(Steven K. Feiner)科特·埃克里(Kurt Akeley) 著
译者 : 彭群生 刘新国 苗兰芳 吴鸿智 等译
丛书名 : 计算机科学丛书
出版日期 : 2018-11-09
ISBN : 978-7-111-61180-6
定价 : 99.00元
教辅资源下载
扩展信息
语种 : 简体中文
页数 : 414
开本 : 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世纪初期的Grassmann公式。我们希望,指出这些参考源头能增加读者对许多早已开发并有望应用于图形学的方法的了解。
教学方法
日常生活中图形学最令人瞩目的应用是视频游戏中的3D形象以及娱乐行业和广告中的特效。然而,我们每天在家庭电脑和手机中的交互也都离不开计算机图形学。这些界面之所以不那么显眼也许是由于它们太成功:其实,最好的界面是你完全忘记了它的存在。虽然“2D图形学要比3D图形学简单”这句话听上去很诱人,但是3D图形学不过是它的一个稍复杂的版本而已。2D图形学中的许多问题,诸如在方形发光单元(像素)组成的屏幕上如何最佳地显示一幅图像,或者如何构建高效且功能强大的界面等,都和在绘制3D场景图像时遇到的问题一样困难。而2D图形学中通常采用的简单模型在怎样最佳地表示颜色和形状等方面也可能对学生造成误导。因此,我们将2D和3D图形学的讲述交织在一起,分析和讨论两者共同的敏感问题。
本书设置“黑盒”的层次与众不同。几乎每一本计算机科学的书都需要选择一个合适的层次来讲述计算机的有关内容,该层次应便于读者理解和掌握。在图形学教科书中,我们同样需要选择一个读者将会遇到的图形学系统。也许,在输入某些指令后,计算机的硬件和软件就能在屏幕上生成一个彩色三角形。但这一切是怎样发生的?其中的细节与图形学的大部分内容并无关联。举例来说,假如你让图形系统绘制一个位于屏幕可显示区域下方的红色三角形,将会发生什么?是先确定那些应置为红色的像素的位置然后因其不在屏幕显示区域内而将其抛弃?还是图形系统尚未开始计算任何像素值之前因发现该三角形位于屏幕之外而终止后面的过程?从某种意义上说,除非你正在设计一块图形卡,否则上述问题并不那么重要,它并非一个图形系统用户所能控制的。因此,我们假定图形系统能够显示像素的值,或画出三角形和直线,而不考虑该过程是怎样实现的。具体实现的细节将在光栅化和图形硬件的相关章节中介绍,但因其大都超出了我们的控制范围,诸如裁剪、直线反走样、光栅化算法等内容均将推迟到其后面章节予以介绍。
本书教学方法的另一点是试图展示相关的思想和技术是怎样浮现出来的。这样做无疑会增长篇幅,但我们希望会有所帮助。当学生需要独立推导自己的算法时,他们遇到过的研究案例可能会为当前问题提供解决思路。
我们相信,学习图形学最好的途径是先学习其背后的数学。与直接跨入图形学应用相比,先学习较为抽象的数学确实会延长你开始学习最初的几个图形算法所需的时间,但这个代价是一次性的。等你学习到第10个算法时,先前的投入将会完全得到补偿,因为你会发现新的方法组合了之前已经学过的许多内容。
当然,阅读本书表明你有兴趣编写一个绘图程序。因此,本书一开始就引入多个题目并直接给出解决方案,然后再回过头仔细讨论更广泛的数学背景。书中大部分篇幅都集中于其后面的处理上。在打下必要的数学基础后,我们将结束上述题目,延伸到其他的相关问题并给出求解思路。由于本书聚焦于基础性的原则,因此并未提供这些方法的实现细节。一旦读者领会了基础原则,每一个求解思路的具体算法就会了然于胸,并将具有足够的知识来阅读和理解其原始参考文献中给出的论述,而不是基于我们的转述。我们能做的是采用更为现代化的形式来介绍那些早期的算法,当读者回头阅读原始文献时,能比较容易理解文献中词汇的含义及其表达方式。
编程实践
图形学是一门需要自己动手实践的学科。由于图形产业为观众提供的是视觉类信息以及相关的交互手段,图形工具也经常用来为新开发的图形算法排错。但这样做需具备编写图形程序的能力。如今已有许多不同的方法可在计算机上生成图像,对本书中介绍的大部分算法而言,每一种方法都有其优点。尽管将一种编程语言和库转化为另一种编程语言和库已成为常规,但从教学的角度,最好是采用单一编程语言以便学生可以聚焦于算法的更深层面。对本书提供的所有练习,我们建议使用WPF(Windows Presentation Foundation,一种广泛使用的图形系统)完成。为此,我们编写了一段基本且易于修改的程序(称为test bed)以便学生使用。对于一些不适于采用WPF的情形,我们通常采用G3D(一个公共的图形库,由本书的一位作者维护)。大多数情况下,我们使用伪代码,因为它提供了一种简洁的算法表述方式,而且,绝大多数算法的实际代码(按你所选语言编制)均可从网上下载,因此将其编入书中并无意义。注意代码形成过程中的变化,在有些情形中,它的最初版本只是一个非正式的框架,然后逐步发展成采用某种语言编写的接近于完成的程序,因此对其之前的版本进行语法检查并无意义,可以免去。有时,我们希望代码能反映出数学的推导过程,故会采用诸如xR之类的变量名,这使得其看上去如同数学表达式。总的来说,伪代码并非正式编程语言,我们用它来表达宏观的思路而非算法的细节。
本书并非一本讨论如何编写图形程序的书,也不讨论应用图形程序中的细节。例如,读者无法从本书中找到有关Adobe最新图像编辑软件存储图像最好方式的任何提示。但只要读者领会了书中的概念并具备足够的编程能力,就一定能编写图形程序,并知道如何应用这些程序。
原则
在本书中,我们列出了一些计算机图形学的原则,希望对读者未来的工作有所帮助。也收入了一些有关图形学实践的章节,如怎样运用当今的硬件来逼近理想解,或者更快速地计算出实际解。虽然这些实现方法是面向当今硬件的,但对未来也有价值。也许十年后不能直接照搬这些实现方法,但其中蕴含的算法在多年内仍有意义。
预备知识
本书大部分内容所需的预备知识并未超出有一定实际能力的理工类在校生现有知识的范围,如:编写面向对象程序的能力;掌握微积分工具;对向量有所了解(可能是从数学、物理学甚至是计算机科学的课程中学到的);至少遇到过线性变换等。我们也希望学生编写过一两个含有2D图形对象(如按钮、复选框、图标等)的程序。
本书一部分内容会涉及更多的数学知识,但在有限的篇幅内讲授这些知识是不现实的。一般而言,这些稍显复杂的数学知识将被精心安排于少数章节内,而这些章节更适合作为研究生的课程。它们和某些涉及一定深度数学知识的练习均注有“数学延伸”()标记。同样,涉及计算机科学中较深概念的内容注有“计算机科学延伸”()标记。
书中某些数学表述可能令那些曾在其他地方接触过向量的人感到困惑。本书的第一作者是一位数学博士,当第一次看到图形学研究论文中涉及数学问题的表述时,他也同样感到奇怪。本书试图清晰和彻底地解释它们与标准的数学表述之间的不同之处。
讲授本书的方式
本书可作为一个学期或一个学年的本科生课程的教科书,或者作为研究生课程的参考书。作为本科生的教学用书时,其中较深的数学内容(如仿重心坐标标架、流形网格、球面调和函数等)可以略去,而集中于几何模型的建模与显示,各种变换的数学原理,相机的数学描述,以及标准的光照、颜色、反射率模型及其局限性等基础问题上。也应介绍一些基本的图形学应用和用户界面,讨论在设计中如何对各种因素进行权衡和折中以使其更有效率,也许最后再介绍几个特殊的主题,如怎样创建一段简单的动画、编写一个基础的光线跟踪程序等。上述内容对一学期的课程而言可能太多,即使是一学年的课程,也不可能覆盖书中的每一节,未讲授的内容可供有兴趣的学生课后学习。
安排较满的一学期课程(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, Melissa 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 Moreton, 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章,从形式到内容都有极大的变化,与时俱进地对图形学的关键概念、算法、技术及应用进行了细致的阐释。为便于教学,中文版分为基础篇和进阶篇两册,此为基础篇,重点包括基本图形学概念、图形生成算法、简单的场景建模方法、2D和3D图形变换以及实时3D图形平台等内容。
主要特点
首先介绍预备数学知识,然后对不同的图形学主题展开讨论,并在需要时补充新的数学知识,从而搭建起易于理解的学习路径,实现理论与实践的相互促进。
更新并添加三角形网格面、图像处理等当代图形学的热点内容,摒弃了传统的线画图形内容,同时关注经典思想和技术的发展脉络,培养解决问题的能力。
基于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处理,因而成为图形学研究的热点。本书专辟章节介绍三角形网格面的表示和简化、多层次网格的构建和传输以及细分曲面的生成。第三,新增了若干图像处理的内容,包括常用的图像格式、图像信号的采样与重建、图像的自适应缩放等。第四,由于计算机图形学是一门面向应用的学科,本书重点讲述了图形学中各种常用的近似模型及其表示方法、基于CPU的图形流水线的组成以及各种实用的实时3D图形平台。由于新版教材内容丰富,为了便于安排教学,我们将中文版划分为基础篇和进阶篇两册出版。其中基础篇为原书的第1~16章,内容覆盖了基本的图形学概念、主要的图形生成算法、简单的场景建模方法、2D和3D图形变换、实时3D图形平台等。进阶篇则讲述与图形生成相关的图像处理技术、复杂形状的建模技术、表面真实感绘制、表意式绘制、计算机动画、现代图形硬件等。
翻译如此一本经典教材无疑是一件极为艰巨的任务,尽管我们有翻译D.F.Rogers的《Procedural Elements of Computer Graphics》第1、2版的经验,但面对这本久负盛名的教材,我们仍感到压力巨大。在翻译中,我们采取了分工合作的方法。参加基础篇各章初稿翻译的有浙江大学CAD&CG国家重点实验室冯结青、陈为,浙江师范大学苗兰芳,武汉大学肖春霞等。浙江大学彭群生翻译了前言并对第1、5、7、8、9章的翻译初稿进行了审核和修改。浙江师范大学苗兰芳(第2、10、11、12、13章),浙江大学刘新国(第3、4、6章)、吴鸿智(第15、16章)、廖子承(第15章),杭州电子科大学吴向阳(第14章)参加了对所列各章翻译初稿的审核和修改。浙江工业大学陈佳舟对插图中的文字进行了翻译。全书最后由彭群生逐章仔细校对,修改定稿。
由于译者的水平和学识有限,译文中翻译不当之处在所难免,恳请读者批评指正。

译者
2018年10月

图书目录

出版者的话
译者序
前言
作者简介
第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图形学简介——基于WPF26
 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+b134
 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 计算SVD186
  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
参考文献
 参考文献为网络资源,请访问华章网站www.hzbook.com下载。——编辑注

教学资源推荐
作者: 方昊 黄苏雨 张帆 主编
作者: 赵莉,熊建强,陈红
作者: 刘远东 何思文 吴斌新
参考读物推荐
作者: 华诚科技 编著
作者: 尼春雨 等编著
作者: 知力 吴雄华等