本书介绍计算机图形学,重点讲解图形学的应用编程。从最初作为图形学讲义到1997正式出版第1版的7年时间里,图形学领域发生了巨大的变化,变化之迅速出乎多数人的意料。在此后的8年时间里(本书前3版),计算机图形学领域发生了更多的变化。具有正片电影长度的计算机动画不仅在商业上获得了成功,而且在艺术上也取得了一定的成就。在电影中使用计算机特效已成为一种标准,而且很难辨别真实动作与计算机制作的动画效果之间的差异。近来的先进硬件技术模糊了计算机和实际游戏制作棚之间的界线。可编程图形处理器使得个人计算机具有灵活的图形处理功能,这些功能几年前即使在最昂贵的工作站上也是不可能实现的。 不仅图形系统的性能提高了许多,而且高端和低端工作站的价格也大幅度地下降。在最近几年里,每秒能生成一千多万个三维多边形,且带有光照效果和纹理映射的图形系统的价格从最初数十万美元下降到现在的不到1000美元。为个人计算机提供的专用图形显示卡的出现具有其特别深远的意义。这些显示卡起价虽然大约只有100美元,但能实现复杂的三维图形功能。在软件方面,无论是编写图形学应用程序还是在科学研究领域里开发高端产品,OpenGL仍将是图形开发人员的标准工具包。 自顶向下的方法 图形学的最新发展和本书前3版的成功,使我进一步增强了以下信念:即采用自顶向下的、面向编程的方法介绍计算机图形学。尽管许多计算机科学与工程系都提供了多门与计算机图形学有关的课程,但是就大多数学生而言,他们只能选修其中一门课程。现在的教学计划往往把图形学课程安排在编程语言、数据结构、算法设计、软件工程和基础数学等课程之后。计算机图形学的讲授方式应该以知识性和趣味性为出发点,并逐步深入讨论与图形学相关的内容。我希望选修图形学课程的学生尽早动手编写三维图形应用程序,只有当学生掌握了如何创建图形之后才可以向他们介绍画线和多边形填充等底层算法。 John Kemeny是计算机教育领域里的开拓者,他用大家非常熟悉的汽车作了一个非常形象的比喻。即大家并不真正需要理解汽车发动机的工作原理,但是如果不掌握汽车驾驶技术,就只能坐在汽车的后座里看人家开车。这个比喻同样可以类推到计算机图形学的教学方法上。讲授图形学有3种不同的方法。方法1——算法法,就是要求学生掌握与汽车工作原理有关的各方面知识,如发动机、传动装置和燃烧过程等;方法2—— 观察法,相当于让一个车夫开车,让学生坐在后排做一个旁观者欣赏这个世界;方法3——编程法,就是指导学生如何驾驶,如何把车开到任何我们想要去的地方,本书就是采用这种方法。 用OpenGL和C编程 在20年前,当我开始讲授图形学课程时,在设计面向编程的课程和编写相应的教材过程中遇到的最大困难是缺少普遍认可的图形系统函数库或应用程序开发人员接口(Application Programmer s Interface,简称API)。其他困难还包括:高成本、有限的资源、缺少通用性和系统的高度复杂性。OpenGL的成功开发为我们解决了在使用其他一些API(如GKS与PHIGS)和一些由开发人员自行开发的代用软件过程中遇到的许多困难。OpenGL得到了大多数工作站供货商的支持,并且通过第三方供货商,可以在绝大多数平台上运行。OpenGL与微软Windows操作系统的所有最新版本和苹果公司的Macintosh操作系统捆绑销售。OpenGL API还有一个称为Mesa的版本,它与Linux操作系统的绝大多数发行版捆绑发行。 作为一门图形学课程,我们要讲授的内容远不只是介绍某个特定API工具包的使用那样简单,但是一个优秀的API工具包可以使讲解图形学中的某些关键问题变得轻而易举。这些关键问题包括三维图形、阴影处理、客户-服务器图形学(简称C-S图形学)、建模以及实现算法等内容。我坚信OpenGL强大的功能和良好的结构能够使它成为讲授图形学原理与实践的一个强有力工具,它也是讲授纹理映射和图像合成等最新功能的有用工具,这些功能直到最近还没有在任何其他API工具包中得以实现。 大约在12年前,我把学生的兴趣转移到OpenGL上,其结果令我非常吃惊。到了学期期中时,每个学生都能编写出具有一定难度,且结合了三维视图理论并具有事件驱动输入模式的三维图形程序。在我此前的15年图形学教学生涯里从来没有取得过这么好的成绩。这一成绩最终促使我从头开始编写图形学教材。 本书是计算机图形学的教科书,而不是OpenGL使用手册。因此我并没有对OpenGL API的各个方面都进行详细讨论。只是对掌握本书内容必不可少的那部分OpenGL内容作了较为详细的介绍。本书对OpenGL的介绍只是想让其他API的用户在遇到相关资料时不会感到有很大的困难。对于那些想深入了解OpenGL的同学们,可以参考我最近出版的OpenGL:A Primer (Addison-Wesley,2002)一书,它是本书最有价值的补充阅读材料。 在本版中,我同时使用C和C++语言,但是以C语言为主。对于这样的安排,我有两个理由:第一,由于OpenGL本身并不面向对象,所以除非我要在OpenGL与用户之间建立一个面向对象的三维几何对象库,否则使用C++或Java等面向对象语言对于基本问题的讨论没有实质性的帮助。虽然采用面向对象这个想法看起来非常有吸引力,但我不想这样做,因为这会影响学生掌握图形学的理论知识,而且会使那些有很强的编程能力但不熟悉面向对象编程的学生不能很好地理解本书。第二,我的经验表明,面向对象方法会使用户看不到底层的工作原理(他们应该知道这些底层的东西)。然而作为计算机图形学的导论课,我希望我的学生了解底层知识。尽管图形学是向学生介绍面向对象编程方法的极好工具,但面向对象并不是向计算机科学与工程系学生介绍图形学最有效的方法。一种例外的情况是在介绍场景图形时我采用了面向对象的方法,而且这部分内容使用了C++知识。至于我的本科学生,由于C++是他们最先要学习的课程之一,因此他们在阅读本书代码时,不管是C或C++程序代码都不会有太大困难。 在计算机图形学领域里,关于OpenGL的未来地位以及是否会被DirectX取代有很多争论。然而在计算机图形学教育者中间,毫无疑问,OpenGL仍将是他们讲授图形学课程的首选API工具包。尽管DirectX是游戏开发的一个标准,但是在许多人看来,它并不十分适合于作为计算机图形学的教学工具,也不适合于那些想自己开发应用程序的用户。而且由于DirectX是专门针对Windows操作平台的,因此要想编写可移植的基本应用程序必须要写很多额外的代码。从更高的层次上来看,OpenGL和DirectX在很多方面以相同的方式支持相同的功能。所以本书的读者如需要转到DirectX编程并不会有太大的困难。 本书读者对象 本书适合计算机科学与工程系的高年级本科生和一年级研究生,以及其他学科有相当编程能力的学生。本书对许多图形学专业人员也有帮助。我曾为图形学专业人员举办过大约100期短期培训,我与他们的交往经历对编写本书有很大影响。 使用本书的先决条件是要精通C或C++编程,基本的数据结构(链表和树)知识以及线性代数与三角几何方面的初步知识。据我所知,计算机系的学生,不管是本科生还是研究生,数学知识良莠不齐,所以我在本书不少地方插入了有关线性代数和三角几何等方面的知识,这些知识是学习计算机图形学的必备条件。我在书后的两个附录里也概括介绍了这两方面的知识。 本书的结构安排 本书的内容安排如下。第1章综述了图形学领域,并介绍了光学设备的成像过程,接着我们开始讨论三维图形的概念。第2章介绍OpenGL编程,本书的第一个实例以及本章和本书其他章节的编程实例,尽管都是二维的,但它们都置于一个三维环境中。第3章讨论最新C-S环境的交互式图形学,并介绍了几个事件驱动图形程序。第4章和第5章集中介绍三维图形的概念。其中第4章介绍三维对象的定义和操作方法。第5章介绍三维对象的视图生成过程。第6章介绍光与材质的相互作用以及明暗处理方法。以上这些章节都要求读者按顺序阅读,并且要在10周(假设一学期为15周)内完成。 本书后面6章可以按任意次序进行阅读。这6章的内容都呈开放形式,即既可以采用概览方式,也可以对某章或某个专题进行深入讨论。第7章概括了光栅化技术,针对裁剪、线段生成、多边形填充等每一个基本功能,本章都给出了一到两个重要的算法。第8章介绍了离散化技术的许多特性,这些特性在现在的图形硬件上和OpenGL里都已得到实现。所有这些离散化技术都与各种缓存有关。第9章介绍基于OpenGL着色语言(OpenGL Shading Language,简称GLSL)的可编程着色器,OpenGL着色语言已经成为OpenGL标准的一部分。我们可以利用可编程着色器实现如凹凸纹理映射等技术,这些技术在以前是不能实时实现的。第8、9章展开讨论了各种交互式图形系统所采用的标准视图处理流水线。 第10章在建模这个大标题下介绍了多个并不十分紧密相关的主题。从用于表示模型各部分之间关系的建模技术到图形在Internet上的高级表示,再到过程建模技术。本章还提供了一个简单的场景图形API工具包。第11章讨论了曲线、曲面及细分曲面等内容。第12章介绍了各种绘制方法,包括对光线跟踪方法和辐射度方法的深入讨论,并简单介绍了基于图像的绘制方法和并行绘制技术。 本书附录A的程序实例主要来自本书的第一部分。附录B和附录C简单复习了本书中用到的数学基础知识。附录D是本版新增的内容,概括介绍了本书中用到的OpenGL函数的用法。 针对第3版的修改 本书前3版的绝大多数读者对本书的反应是肯定的,他们都特别推崇本书采用OpenGL和自顶向下的方法。尽管如此,还是存在一些需要改进的地方以及一些有关图形学的最新进展。可编程图形处理器的研制成功就是图形学的一个最重要成就,我相信它将大大影响我们讲授计算机图形学的方式。在编写前3版时,一些技术由于不能在大多数系统上实现,因此我们没有对它们进行深入讨论;而现在这些技术已经很常用,因此可以在计算机图形学的第一门课程中讲授。此外,我们还要对来自前3版的内容重新进行组织,这样做会使得本版的章节组织顺序比前面几版更严格地按照OpenGL的流水线过程。 新增了第9章的内容,本章介绍可编程着色器。可编程着色器采用OpenGL着色语言,是OpenGL 2.0的一部分。现在利用可编程着色器,许多技术都可以实时实现。因此本章内容变动较大。在第3版中,我们在讨论凹凸映射之前先讨论的是纹理映射,但是在本版里,我们是先讨论片元着色器(fragment shader)。有的老师一开始可能会认为这样安排有点怪,但是我想当他们开始讲授顶点和像素绘制器时就会发现这样安排的好处。 在第3版中,我把科学可视化与过程建模方法这两部分安排成单独的一章,在第4版中则全部删除了这一章内容。除了讨论最先进的绘制技术的小部分内容外,这一章的其他内容都分散到其他章节中,目的是让讲授图形学的老师们可以有针对性地讨论这些图形学的高级内容。例如,我们把Marching Squares(移动正方形方法)移到第2章的末尾,目的是为读者提供一个复杂的二维应用程序实例,而实际上它对于阅读第3章并非是必须的。 我相信这样的变动会给一学期计算机图形学导论课的教学产生一些不利的影响,但会给两学期的图形学课程带来不少的便利。 致谢 在过去几年里,我有幸与新墨西哥大学的一群非常优秀的学生合作。是他们最先激发我对OpenGL的兴趣,我从他们那里学到了很多东西。这些学生包括Hue Bumgarner- Kirby(Walker)、Ye Cong、Pat Crossno、Tommie Daniel、Chris David、 Lisa Desjarlais、Kim Edlund、Lee Ann Fisk、Maria Gallegos、Brian Jones、Christopher Jordan、Max Hazelrigg、Sheryl Hurley、Thomas Keller、Ge Li、Pat McCormick、Al McPherson、Ken Moreland、Martin Muller、David Munich、Jim Pinkerton、Jim Prewett、Dave Rogers、Hal Smyer、Takeshi Hakamata、Dave Vick、Brian Wylie和Jin Xiong。彩图里的许多图片由他们绘制生成。 本书的第1版,我是在假期里完成的。本书的不同部分在5个不同的国家完成。这个经历本身很好地说明了手提计算机的强大作用和Internet无处不在。尽管如此,如果没有许多人的帮助和一些机构为我提供的便利,我不可能完成这个任务。我非常感谢委内瑞拉安第斯大学的(the Universidad de Los Andes)的Jonas Montilva和Chris Birkbeck、厄瓜多尔赤道理工大学(Universidad Tecnologica Equinoccial)的Rodrigo Gallegos 和Aristides Novoa、香港中文大学的Kin Hong Wong和Pheng Ann Heng。ISTEC (Ibero-American Research Education Technology Consortium)的Ramiro Jordan和新墨西哥大学的资助才使这些访问成为可能。不管我身在何方,新墨西哥大学的John Brayer和Jason Steward以及Addison-Wesley出版社的Helen Goldstein总是想方设法把各种资料传给我。我的个人主页上对我在编写本书第1版过程中遇到的冒险经历有详尽的描述。 本版是在新墨西哥大学完成的。前3版的成千上万教师和学生给我提供了一些反馈意见和评价,我从这些反馈意见和评价中受益匪浅,前几版的修改大多都来自他们的要求和反馈意见。 NVIDIA公司的David Kirk和Mark Kilgard好心地为我提供了图形显示卡,利用这些图形卡我可以对书中的一些最新算法进行测试。还有其他人员为我提供了重要的帮助。在此,我要感谢Ben Bederson、Gonzalo Cartagenova、Tom Caudell、Kathi Collins、 Kathleen Danielson、 Roger Ehrich、Robert Geist、Chuck Hansen、Mark Henne、Bernard Moret、Dick Nordhaus、Helena Saona、Dave Shreiner、Vicki Shreiner、Gwen Sylvan 以及Mason Woo。OpenGL领域的研究人员要向Mark Kilgard、Brian Paul和Nate Robins等人致敬,他们开发的软件能够使OpenGL程序在各种平台上运行。 在新墨西哥大学,高性能计算中心和IBM公司为我的可视化项目提供了支持。新墨西哥大学的计算机科学系、美术学院的艺术技术中心、国家科学基金、桑迪亚国家实验室和洛斯阿拉莫斯国家实验室(Los Alamos National Laboratory)为我的学生和他们的研究项目提供了资助,这些项目与本书的部分内容有关。David Beining和北极星天文馆(Lodestar Planetarium)为Sheryl Hurley、Christopher Jordan、Laurel Ladwig和Hue (Bumgarner-Kirby)(Walker) 等人的研究项目(Full Dome)提供了大力支持,该项目为本书提供了书中彩色插图中的一些图片。 本书原稿的审稿人员就本书的内容及本书的深度和广度提出了各自不同的观点。这些审稿人员是Gur Saran Adhar (北卡罗来纳大学威明顿分校) 、Mario Agrular(杰克逊维尔州立大学)、Michael Anderson(哈特福德大学)、C. S. Bauer(中佛罗里达大学)、Marty Barrett(东田纳西州立大学)、Robert P. Burton(伯明翰扬大学)、Sam Buss(加州大学圣地亚哥分校)、Kai H. Chang(奥本大学)、Ron DiNapoli(康乃尔大学)、Eric Alan Durant(密尔瓦基工程学校)、David S. Ebert(普渡大学)、Chenyi Hu(中阿肯色大学)、Mark Kilgard(NVIDIA公司)、Lisa B. Lancor(南康康涅狄格州立大学)、Chung Lee(加州州立理工大学波莫那分校)、John L. Lowther(密歇根理工大学)、R. Marshall(波士顿大学、布利基沃特州立学院)、Bruce A. Maxwell(史瓦斯摩尔学院)、James R. Miller(堪萨斯州立大学)、Han-Wei Shen(俄亥俄州州立大学)、Oliver Staadt(加州大学戴维斯分校)、Stephen L. Stepoway(南卫理公会大学)、Michael Wainer(伊利诺斯州大学卡本代尔分校)、George Wolberg(纽约城市学院)、Yang Wang(南卫理公会大学)、Steve Warren(堪萨斯州立大学)、MikeWay(佛罗里达南部学院)以及Ying Zhu(乔治亚州立大学)。尽管最后的定稿并不一定都能反映他们的全部观点(原因是这些观点往往存在很大的分歧),但是他们的观点促使我不得不对原稿的每一页进行反复推敲。 感谢Addison-Wesley出版公司的整个团体。在本书的4个版本及OpenGL Primer等书的出版过程中,我与我的编辑Peter Gordon、Maite Suarez-Rivas和Matt Goldstein的合作一直很愉快。我所有由Addison-Wesley公司出版的图书在出版过程中一直得到了Katherine Harutunian的帮助。在我遇到TEX排版问题时,Windfall软件公司的Paul Anagnostopoulos为我做了很多超出其职责范围之内的事情。特别感谢Lyn Dupré,由于我天生就不是一个作家,如果读者有机会看到本书第1版的原稿,就会知道Lyn Dupré在原稿上所创造的奇迹。 我的夫人Rose Mary Molnar为我的第一本图形学书绘制了里面的插图。这些插图的一部分成为了本书插图的基础。可能只有其他作家才能完全理解在出版过程中作者所投入的精力以及我的合作伙伴为此所作出的贡献和牺牲。也谨把此书献给我的夫人,感谢她为我所做的工作。