标题：交互式计算机图形学基于OpenGL的自顶向下方法（第三版）
图书信息
作者：吴文国 图书详细信息： ISBN：9787302123903 定价：62元 印次：1-1 装帧：平装 印刷日期：2006-1-23
图书简介
本书从OpenGL编程角度讨论了图形学基本原理及基本算法。全书共13章，分为三大部分：第一部分为第1～6章，主要介绍三维图形程序的开发环境、三维对象的表示方法、空间坐标变换、三维视图的生成过程等内容；第二部分为第7～10章，主要介绍光栅扫描、区域填充、画直线和画圆弧、裁剪及消隐等基本理论和基本算法；第三部分为第11～13章，主要介绍过程建模技术、可视化处理方法以及高级绘制方法等高级内容。本书的特点是采用了自顶向下的方法，集知识性和趣味性为一体，全书还包括17个完整的、令人感兴趣的OpenGL程序。本书可作为计算机及相关专业本科生和研究生的图形学教材，也适合相关程序员、工程技术人员及科研人员使用。
图书前言
这是一本介绍计算机图形学的书，尤其强调图形学的应用编程。从最初作为图形学讲义到1997年正式出版第一版的7年时间里，图形学领域发生了翻天覆地的变化，其速度之快出乎大多数人的意料。在以后的5年时间里，我们经历了更多更深刻的变化。具有正片电影长度的计算机动画不仅在商业上获得成功，而且在艺术上也取得了一定的成就。在电影中使用计算机特技效果已经成为一种标准，而且很难分辨真实动作与计算机制作的动画效果之间的差异。最近的硬件技术也模糊了计算机和实际游戏制作棚之间的界线。在因特网上对图形学应用程序的兴趣呈爆炸式增长，而且这种增长趋势还将继续。不仅图形系统的功能增加了许多，而且高端和低端工作站的价格也大幅度下降。在最近几年里，每秒能显示一千多万个三维多边形，且带有光照处理功能和纹理映射功能的图形系统的价格从最初的数十万美元下降到现在的数千美元，甚至价格不到1000美元的个人计算机也支持基本的三维图形应用。个人计算机专用图形显示卡的出现有其特别深远的意义，这些显示卡只需大约100美元，并提供工作站的性能。在软件方面，无论是编写图形学应用程序还是在科学研究领域里开发高端产品，OpenGL仍然是图形开发人员的标准接口。自顶向下的方法图形学最近的发展和本书前两版的成功，增强了笔者的信念：即采用自顶向下的、面向编程的方法介绍计算机图形学。尽管许多计算机科学和工程系提供了不止一门与计算机图形学相关的课程，但就大多数学生而言，他们只能选修其中一门课程。现在的教学计划往往把图形学课程安排在编程语言、数据结构、算法设计、软件工程和基础数学等课程之后。计算机图形学课程的老师应该以知识性和兴趣性为出发点并逐步深入讨论图形学相关内容。笔者希望选修图形学课程的学生尽可能快地动手编写三维图形应用程序，而等到学生掌握了建立图形技术之后再开始介绍画线和多边形填充等底层算法。 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工具包中得到实现。大概8年前我把我所教授的学生的兴趣转到OpenGL上，其结果令人吃惊。到了学期期中时，每个学生都能编写出具有相当难度的、用到三维视图知识和具有事件驱动输入模式的三维图形程序。在我前15年的图形学教学生涯里，从没有取得这么好的效果。对这个班级的成功教学最终促使我从头开始重新编写图形学课本。这是一本计算机图形学的教科书，而不是一本OpenGL使用手册。因此并没有对OpenGL API的各个方面都进行详细讨论，只是对掌握本书内容必不可少的那部分OpenGL知识作介绍。本书对OpenGL的介绍达到这样的程度，即其他API的用户在遇到相关资料时不会感到有很大的困难。对于那些想深入了解OpenGL的读者，可以参考笔者最近出版的《OpenGL :A Primer》（OpenGL入门，Addison-Wesley ,2002），这是一本很有价值的参考书。在本版里，笔者同时使用了C和C++语言，其中C作为主要语言。对于这种安排有两个理由。第一，由于OpenGL本身不是面向对象，所以除非要在OpenGL与用户之间建立一个面向对象的三维几何对象库，否则使用C++或Java等面向对象语言对基本问题的描述没有实质性的帮助。虽然这个方法看起来非常有吸引力，但本书没有这样做，因为这会影响学生掌握图形学那部分知识，而且会使那些有很强的编程能力但不熟悉面向对象编程的学生不能很好地理解本书。第二，面向对象方法会使用户看不到底层的知识（他们应该知道这些底层的东西）。然而作为图形学的导论课，学生应该了解底层知识。尽管图形学是向学生介绍面向对象编程方法的极好工具，但面向对象并不是向计算机科学和工程系学生介绍图形学最有效的方法。一个例外的情况是介绍场景图形，本书采用了面向对象的方法，而且这部分内容得益于C++的知识。至于本科学生，由于C++是他们最先要学习的课程之一，所以他们在阅读本书代码时，不管是对C或C++程序都不会有很大困难。在计算机图形学领域，关于OpenGL的未来地位以及是否会被DirectX取代有很多争论。然而对于计算机图形学教育者来说，毫无疑问OpenGL仍将是图形学课程的首选API。尽管DirectX是游戏开发的一个标准，但在许多人看来，它并不十分适合作为计算机图形学的教学工具，也不适合于那些想开发自己应用程序的用户。而且由于DirectX专门针对Windows操作平台，所以要想编写可移植的应用程序必须要写很多额外的代码。从更高的层次来看，OpenGL和DirectX在很多方面都支持相同的功能。所以本书的读者如需要转到DirectX编程并不会有太大的困难。本书的读者本书适合计算机科学和工程系的高年级本科生和一年级研究生，以及其他学科有相当编程能力的学生。本书对许多图形学专业人员也有帮助。笔者曾为专业人员举办过大约一百期的短期培训，与专业人员的交往经历对编写本书有很大助益。使用本书的先决条件是精通C或C++编程，具备基本的数据结构（链表和树）知识以及线性代数和三角几何方面的初步知识。而计算机系的学生，不管是本科生还是研究生，数学知识良莠不齐。所以在本书里插入了一些有关线性代数和三角几何等内容，这些内容是学习计算机图形学的必备条件。本书的附录B和附录C里概括介绍了这两方面的知识。 本书的组织本书的内容安排如下。第1章综述了图形学领域，并介绍光学设备的成像过程，接着开始讨论三维图形概念。第2章介绍OpenGL编程，本章以及后面各章都要介绍一个或多个完整的编程实例，尽管这些实例都是二维的，但是它们都置于一个三维环境里。第3章讨论最新C-S环境里的交互式图形学，并介绍几个事件驱动图形程序。第4章和第5章集中介绍三维图形概念，其中第4章介绍三维对象的定义和处理方法；第5章介绍三维对象的视图生成过程。第6章介绍光与材质的相互作用以及明暗处理方法。以上这些章节都要求按顺序阅读，并且在10周左右时间内完成。本书后面7章可以按任意次序进行阅读。这7章所有内容都安排成开放形式，即既可以快速浏览，也可以对某个专题进行深入讨论。第7章介绍许多最新的离散技术, 它们得到了图形硬件技术和OpenGL的支持。这些离散技术都与各个不同的缓存器有关，本章的结尾对计算机图形学中存在的走样问题进行简单讨论。第8章讨论算法实现。本章讨论了视图处理流水线过程的基本步骤，针对每一基本步骤都给出一两个主要算法。第9章把多个并不十分相关的专题都归纳到层级结构和面向对象图形学的标题下。这些专题范围比较广，从如何建立封装多个子部件及相互之间关系的复杂模型到如何访问Internet上图形这样的高级问题。本章还包括了一个简单场景图形API。第10章讨论了曲线和曲面。第11章介绍过程建模方法，主要内容有基于语言的建模、分形方法和粒子系统。这些方法主要弥补多边形建模方法的不足。第12章介绍科学可视化。目前人们对这一领域产生了浓厚的兴趣，更重要的是该领域为我们提供了验证前面几章介绍的各种技术的一个机会。第13章内容是新增内容，主要介绍其他绘制技术。这一章对光线跟踪和辐射度方法进行深入讨论，同时也简单介绍了基于图像的绘制技术和并行绘制技术。本书第一部分的程序都包括在附录A里。这些程序都有相应的电子版（参看后面的补充阅读材料这一节）。对第二版的修改本书第一、二版的绝大多数读者对本书的反应都是肯定的。他们都特别肯定了本书采用OpenGL和自顶向下的方法。尽管如此，还是有需要改进的地方以及需要增加图形学的最新进展。第三版就是针对这些问题进行补充和修改。笔者对第二版做了3个方面的修改。第一，加强了对数学知识的讨论；第二，增加了一些目前令人十分感兴趣的新内容，如场景图形、不同的绘制方法等；第三，增加了OpenGL编程实例。为了这些修改，要对第二版后半部的内容进行重新组织。对于把本书作为一学期的导论课的老师们来说，这些修改对他们的教学过程没有多大影响；但是对于把本书当作两个学期课程的老师们来说，本书更容易使用。第1、2章只作稍微修改。第3章增加异或写入模式，读者利用这个模式在开发程序时使用橡皮筋方法。这一章还增加了一节OpenGL选择模式下的拾取功能。笔者重写了第4章部分内容，目的是把这些数学问题描述得更加清晰易懂。这一章的末尾增加了一节四元数的内容，本书的第三版对平滑旋转等问题的深入讨论正好要用到这方面的知识。第5章基本不变。第6章主要讨论流水线绘制方法，把有关全局绘制的内容放到了第13章。第二版的第9章内容前移变成现在的第7章，这主要想反映映射和离散缓存器的重要性。本章还详细讨论了OpenGL中的纹理映射函数，并增加了许多编程实例。第8章为第二版的第7章，内容大致不变。本版的第9章就是第二版的第8章。本章增加了对场景图形的详细讨论，使用了我的学生Ye Cong同学作为课堂作业开发的一个场景图形。对于是否采用VRML或Java3D等标准化场景图形这个问题，我考虑了很久，最后认为场景图形本身就没有所谓“标准化”的东西。我对VRML和Java3D等能否像本书的第三版一样经得起时间的考验没有多大把握，但我确信概念的重要性，所以采用了一个简单场景图形的例子，并将它的源代码放在了Internet上，读者可以下载进行测试。第10章现在包括了对细分曲线和曲面的介绍。第11、12章基本不变。第13章是新增内容。本章包括了对光线跟踪方法和辐射度方法的详细介绍，还对绘制方程进行了深入讨论。前两版把绘制方程放在第6章。本章还增加了基于图像绘制技术的介绍。该领域采用了多种方法，日渐引起人们的兴趣。笔者还增加了一节关于并行绘制技术的内容，它与笔者个人兴趣有关。随着采用图形显示卡的个人PC机代替了用特殊硬件技术制造的超级计算机，并行绘制越显其重要性。附录A包括了新增的程序实例。附录B里包括了对特征值和特征向量的简单讨论，它们与平滑旋转等专题内容有关。补充材料英文原书附带的光盘包含以下内容：软件开发工具（GLUT和MESA的最新版本）、书中的实例程序（以及新增的实例）的源代码和它们的Windows可执行文件、OpenGL使用手册（html和ps文件格式）、笔者发表在SIGGRAPH2001的OpenGL教案（pdf文件格式）以及Nate Robins 的OpenGL教学材料。非常幸运在过去几年里我一直与新墨西哥州大学一群非常优秀的学生合作。是他们最先激发了我对OpenGL的兴趣，我从他们那里学到很多东西。他们是Hue Bumgarner-Kirby（Walker）、Ye Cong、Pat Crossno、Tommie Daniel、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、Martin Muller、David Munich、Jim Pinkerton、Jim Prewett、Dave Rogers、Hal Smyer、Dave Vick和Brian Wylie。彩图里的许多图片是他们绘制生成的。本书的第一版是我在假期里完成的。本书的不同部分在5个不同的国家完成，这个经历本身说明了手提电脑的强大作用和Internet无所不在。尽管如此，如果没有许多人的帮助和一些机构为我提供的便利，我是很难完成这个任务的。我非常感谢委内瑞拉安第斯大学（the Universidad de los Andes）的Jonas Montilva和Chris Birkbeck、厄瓜多尔赤道理工大学（the Universidad Tecnologica Equinoccial）的Rodrigo Gallegos 和Aristides Novoa、中国台湾国立清华大学的Long Wen Chang、中国香港中文大学的Kin Hong Wong和Pheng Ann Heng。ISTEC （Ibero-American Research Education Technology Consortium）的Ramiro Jordan和新墨西哥州大学的资助才使这些访问成为可能。不管我身在何处，新墨西哥州大学的John Brayer和Jason Stewart，以及Addison-Wesley出版社的Helen Goldstein总是想方设法把各种各样的资料传给我。我的个人主页上对我在编写本书第一版过程中的经历有详尽的描述。本书的第二版和第三版都是在新墨西哥州完成的。前两版的成千上万教师和学生读者给我寄来反馈意见，我从他们的反馈意见中受益匪浅，根据他们的要求和反馈意见，我对前两版进行了许多修改。Silicon图形公司和苹果电脑公司慷慨地为我提供了设备。Conix公司、Portable 图形公司、Template 图形公司和Metrowerks公司为我提供了软件，利用这些软件可以在各个不同平台上对书中程序实例进行测试。NVidia公司的David Kirk和Mark Kilgard为我提供了显示卡，利用这些图形卡我可以对书中的一些最新算法进行测试。在新墨西哥州大学，高性能计算中心为我的可视化项目工作提供了支持。新墨西哥州大学的计算机科学系、国家科学基金、Sandia国家实验室和洛斯阿拉莫斯国家实验室（Los Alamos National Laboratory）为我的学生和他们的研究项目提供了资助，这些项目与本书部分内容有关。David Beining和北极星天文馆（Lodestar Planetarium）为Sheryl Hurley、Christopher Jordan、Laurel Ladwig和Hue Bumgarner-Kirby（Walker）等人的研究项目Full Dome提供了大力支持，该项目提供了本书封面和彩图中的一些图片。本书原稿的审稿人员就本书的内容及本书的深度和广度提供了各自不同的观点。这些审稿人员是Hamid Arabnia（佐治亚大学）、Wayne Carlson（俄亥俄州立大学）、Jim X. Chen（乔治?梅森大学）、Norman Chin（Silicon 图形公司）、Andrew Duchowski（克莱姆森大学）、Matthew Evett（东密歇根大学）、Michael Garland（伊利诺斯州立大学）、Scott Grissom（伊利诺斯州立大学斯普林菲尔德分校）、Ardeshir Goshtasby（莱特州立大学）、John C. Kelly, Jr.（北卡罗莱纳农工州立大学）、Kwan-Liu Ma（加州大学戴维斯分校）、David McAllister（北卡罗莱纳州立大学）、Tom McReynolds（Silicon图形公司）、Jim Miller（堪萨斯州州立大学）、Dick Phillips（前洛斯阿拉莫斯国家实验室工作人员）、Yang Wang（州立东南密苏里大学）、Jane Wilhelms（加州大学圣克鲁兹分校）、Edward Wong（布鲁克林工学院）和Mike Wozny（伦斯勒工业学院）。尽管最后的修改并不一定反映他们的全部观点，原因是这些观点往往存在很大的分歧，但是他们的观点迫使我不得不对原稿的每一页进行反复推敲。感谢Addison-Wesley出版公司的整个团队，他们除了要完成各自的份内工作外，还要承担起一份额外的重任，即要与一个从没有在一个地方住很久的人进行合作。在出版本书的3个不同版本和OpenGL入门等书的过程中，我与我的编辑Peter Gordon和Maite Suarez-Rivas合作一直很愉快。在编写这本书的过程中，Windfall软件公司的Paul Anagnostopoulos在我使用TEX排版软件遇到问题时提供了极大的帮助。特别感谢Lyn Dupré，由于我天生就不是一个作家，如果读者有机会看到本书的原稿，你们就会知道Lyn Dupré在原稿上所创造的奇迹。我的夫人Rose Mary Molnar为我的第一本图形学书描绘了插图，其中的一些插图是本书插图的基础。她很理智，从不与我抢用家里的惟一一台笔记本电脑，她维持了我们的亲密关系并为它贡献了一切。
图书目录
第1章 图形系统和模型 11.1 计算机图形学的应用 11.1.1 信息显示 11.1.2 设计 21.1.3 仿真与动画 21.1.4 用户界面 31.2 计算机图形系统 31.2.1 像素与帧缓存 41.2.2 输出设备 41.2.3 输入设备 61.3 图像：物理方法和人工合成方法 61.3.1 对象与观察者 61.3.2 光照与图像 71.3.3 光线跟踪 81.4 人眼的视觉系统 91.5 针孔照相机 111.6 虚拟照相机模型 121.7 程序员接口 131.7.1 应用程序开发人员的接口 141.7.2 笔式绘图仪模型 141.7.3 三维API函数 161.7.4 彩图介绍 171.7.5 建模-绘制模式 181.8 图形系统的体系结构 191.8.1 显示处理器 191.8.2 流水线结构 201.8.3 变换 201.8.4 裁剪 211.8.5 投影 211.8.6 光栅化 211.8.7 性能特性 211.9 小结 221.10 补充阅读材料 22习题 23第2章 图形学编程 252.1 Sierpinski镂垫 252.2 二维应用程序编程 262.3 OpenGL API工具包 292.3.1 图形函数 302.3.2 图形流水线和状态机 312.3.3 OpenGL接口 312.4 图元与属性 322.4.1 多边形基本概念 332.4.2 OpenGL里的多边形类型 342.4.3 绘制球体 352.4.4 字符 372.4.5 曲线和曲面 382.4.6 属性 382.5 颜色 392.5.1 RGB颜色 412.5.2 索引颜色 422.5.3 设置颜色属性 442.6 视图处理 442.6.1 二维视图 442.6.2 正交视图 452.6.3 矩阵模式 462.7 控制函数 472.7.1 与Windows操作系统的交互作用 472.7.2 纵横比和视口 482.7.3 main()、display()和myinit()函数 492.7.4 程序结构 502.8 Sierpinski镂垫程序 502.9 多边形与递归过程 522.10 三维Sierpinski镂垫 542.10.1 使用三维点 542.10.2 在三维空间里使用多边形 552.10.3 隐藏面消除 562.11 小结 572.12 补充阅读材料 58习题 59第3章 输入与交互 623.1 交互模式 623.2 输入设备 633.2.1 物理输入设备 633.2.2 逻辑设备 653.2.3 测量与触发 663.2.4 输入模式 663.3 客户-服务器结构 673.4 显示列表 683.4.1 显示列表的定义和运行 693.4.2 字符和显示列表 713.4.3 GLUT库里的字体 733.5 事件驱动输入的编程 743.5.1 使用指向输入设备 743.5.2 窗口事件 763.5.3 键盘事件 783.5.4 显示回调函数和空闲回调函数 783.5.5 窗口管理 793.6 菜单 793.7 拾取 803.8 一个简单的画图程序 853.9 交互式动画程序 893.9.1 旋转的正方形 903.9.2 双缓存 913.9.3 其他一些缓存问题 923.10 交互式程序的设计 933.11 逻辑运算 943.11.1 绘制可以删除的线段 953.11.2 异或操作（XOR）和颜色 973.11.3 光标与覆盖层位平面 973.12 小结 983.13 补充阅读材料 98习题 99第4章 几何对象与坐标变换 1024.1 标量、点和矢量 1024.1.1 几何观点 1024.1.2 与坐标无关的几何对象 1044.1.3 数学观点：矢量与仿射空间 1044.1.4 计算机科学的观点 1054.1.5 几何抽象数据类型（ADT） 1054.1.6 直线 1064.1.7 仿射加 1074.1.8 凸性 1074.1.9 点积和叉积 1084.1.10 平面 1094.2 三维图元 1104.3 坐标系与标架 1114.3.1 矢量表示与n元组 1124.3.2 坐标系的变换 1134.3.3 坐标变换的例子 1144.3.4 齐次坐标 1154.3.5 标架变换的例子 1174.3.6 表示矩阵的运算处理 1194.3.7 标架系统与抽象数据类型 1194.3.8 OpenGL里的标架系统 1214.4 建立一个彩色立方体模型 1234.4.1 一个立方体模型 1234.4.2 内侧面与外侧面 1244.4.3 对象表示的数据结构 1244.4.4 彩色立方体 1254.4.5 双线性插值 1264.4.6 顶点数组 1274.5 仿射变换 1284.6 平移、旋转和缩放 1304.6.1 平移变换 1304.6.2 旋转变换 1314.6.3 缩放变换 1324.7 齐次坐标表示的变换公式 1334.7.1 平移 1334.7.2 缩放 1344.7.3 旋转 1344.7.4 剪切变换 1354.8 变换的串乘运算 1364.8.1 绕某一固定点的旋转 1374.8.2 一般的旋转变换 1384.8.3 实例变换 1394.8.4 绕任一轴旋转 1404.9 OpenGL中的变换矩阵 1424.9.1 当前变换矩阵 1424.9.2 旋转、平移和缩放 1434.9.3 在OpenGL中绕固定点旋转 1444.9.4 变换次序 1444.9.5 立方体的旋转 1454.9.6 矩阵的装载、压栈和弹栈操作 1464.10 三维应用程序的交互方式 1464.10.1 利用屏幕区域 1474.10.2 一个虚拟跟踪球 1474.10.3 平滑旋转 1494.10.4 递增式旋转 1494.11 四元数 1504.11.1 复数与四元数 1504.11.2 四元数与旋转 1514.12 小结 1524.13 补充阅读材料 153习题 153第5章 视图 1555.1 经典视图和计算视图 1555.1.1 经典视图 1565.1.2 正则投影 1575.1.3 轴测法投影 1575.1.4 斜投影 1585.1.5 透视图 1585.2 计算机视图 1595.3 照相机定位 1605.3.1 照相机标架定位 1605.3.2 两个处理视图的API工具包 1645.3.3 Look-At函数 1665.3.4 其他视图API工具包 1675.4 简单投影 1685.4.1 透视投影 1685.4.2 正交投影 1705.5 OpenGL的投影视图 1715.5.1 OpenGL的透视投影 1725.5.2 OpenGL平行视图 1735.6 隐藏面消除 1745.7 在场景中漫游 1755.8 平行投影矩阵 1775.8.1 投影正则化 1775.8.2 正交投影矩阵 1785.8.3 斜投影 1795.9 透视投影矩阵 1815.9.1 透视正则化 1825.9.2 OpenGL的透视变换 1845.10 投影与阴影 1855.11 小结 1875.12 补充阅读材料 188习题 188第6章 明暗处理 1906.1 光与材质 1906.2 光源 1926.2.1 彩色光源 1926.2.2 环境光 1936.2.3 点光源 1936.2.4 聚光灯 1946.2.5 远距离光源 1946.3 Phong反射模型 1956.3.1 环境反射 1966.3.2 漫反射 1966.3.3 镜面反射光 1976.4 矢量计算 1996.4.1 法向矢量 1996.4.2 反射角度 2016.4.3 利用中值矢量 2026.4.4 折射光 2026.5 多边形的明暗处理 2036.5.1 平面明暗处理 2046.5.2 插值和Gouraud明暗处理方法 2056.5.3 Phong明暗处理方法 2066.6 球面的递归细分逼近 2066.7 OpenGL中的光源 2096.8 OpenGL里的材质说明 2116.9 球体模型的明暗处理 2136.10 全局绘制 2146.11 小结 2156.12 补充阅读材料 216习题 216第7章 离散技术 2187.1 缓存 2187.2 数字图像 2197.3 缓存写操作 2217.3.1 写入模式 2227.3.2 异或写入模式 2237.4 OpenGL里的位运算和像素运算 2237.4.1 OpenGL的缓存和像素管道 2247.4.2 位图 2257.4.3 光栅字体 2257.4.4 像素与图像 2267.4.5 查找表 2277.4.6 用于拾取的缓存 2287.5 映射方法 2287.6 纹理映射 2297.6.1 二维纹理映射 2307.6.2 OpenGL里的纹理映射 2347.6.3 纹理对象 2397.6.4 多纹理通道 2397.6.5 创建纹理对象 2397.7 环境贴图 2407.8 凹凸贴图 2427.9 图像合成技术 2437.9.1 不透明性与融合 2437.9.2 图像合成 2447.9.3 OpenGL里的融合与合成 2447.9.4 反走样 2457.9.5 从后至前和从前至后的绘制过程 2467.9.6 景深提示和雾效果 2477.10 多通道绘制与累积缓存 2487.10.1 场景反走样 2487.10.2 凹凸贴图和浮雕效果 2487.10.3 图像处理 2497.10.4 OpenGL的图像处理扩展集 2507.10.5 其他多通道方法 2507.11 采样与走样 2517.11.1 采样理论 2517.11.2 重构 2547.11.3 量化 2557.12 小结 2567.13 补充阅读材料 256习题 257第8章 渲染器的实现 2598.1 实现的基本策略 2598.2 实现过程的4个主要任务 2608.2.1 建模 2618.2.2 几何处理 2618.2.3 光栅化 2628.2.4 显示 2628.3 变换的实现 2628.4 线段裁剪 2648.4.1 Cohen-Sutherland裁剪算法 2648.4.2 Liang-Barsky裁剪算法 2668.5 多边形裁剪 2678.6 其他图元的裁剪 2698.6.1 包围盒和包围体 2708.6.2 曲线、曲面和字符 2708.6.3 帧缓存里的裁剪操作 2718.7 三维裁剪 2718.8 隐藏面消除 2738.8.1 景物空间和图像空间 2738.8.2 排序与隐藏面消除 2758.8.3 背面剔除 2758.8.4 z-buffer算法 2758.8.5 深度排序和画家算法 2778.8.6 扫描线算法 2798.9 扫描转换 2798.10 Bresenham算法 2818.11 多边形的扫描转换 2838.11.1 内外测试法 2838.11.2 OpenGL与凹多边形 2848.11.3 带z-buffer算法的扫描转换 2858.11.4 填充与排序 2868.11.5 种子填充算法 2868.11.6 扫描线填充算法 2878.11.7 奇异性 2878.12 反走样 2888.13 显示器因素 2898.13.1 颜色系统 2908.13.2 颜色矩阵 2928.13.3 校正 2928.13.4 抖动技术与半色调技术 2938.14 小结 2938.15 补充阅读材料 294习题 295第9章 层级结构和面向对象的建模方法 2979.1 图符与实例 2979.2 层级模型 2989.3 一个机器人手臂 3009.4 树与树的遍历 3029.5 树形数据结构的用途 3059.6 动画 3089.7 图形对象 3099.7.1 方法、属性和消息 3099.7.2 一个立方体对象 3109.7.3 实现立方体对象 3129.7.4 对象与层级结构 3129.7.5 几何对象 3139.8 场景图 3149.9 一个简单场景图的API 3159.9.1 结点类 3169.9.2 几何结点 3179.9.3 照相机类 3199.9.4 光源和材质 3209.9.5 变换类 3219.9.6 机器人类 3229.9.7 实现观察者类 3249.9.8 实现结点类 3279.10 其他的树形结构 3309.10.1 CSG树 3309.10.2 明暗处理树 3329.10.3 BSP树 3329.10.4 四叉树和八叉树 3349.11 图形与万维网 3359.11.1 网络与协议 3359.11.2 超媒体与HTML语言 3369.11.3 数据库与VRML 3379.11.4 Java与Applets 3379.12 小结 3389.13 补充阅读材料 338习题 339第10章 曲线与曲面 34010.1 曲线和曲面的表示方法 34010.1.1 显式表示法 34010.1.2 隐式表示 34110.1.3 参数形式 34210.1.4 参数多项式曲线 34310.1.5 参数多项式曲面 34410.2 设计准则 34510.3 三次多项式参数曲线 34610.4 插值 34710.4.1 调和函数 34810.4.2 三次插值面片 34910.5 Hermite曲线和曲面 35110.5.1 Hermite形式 35110.5.2 几何连续和参数连续 35310.6 Bezier曲线和曲面 35410.6.1 Bezier曲线 35410.6.2 Bezier曲面面片 35610.7 三次B-样条 35610.7.1 三次B-样条曲线 35710.7.2 B-样条与基函数 35910.7.3 样条曲面 36010.8 一般的B-样条函数 36010.8.1 B-样条的递归定义 36110.8.2 均匀样条 36210.8.3 非均匀B-样条 36210.8.4 NURBS 36210.9 曲线和曲面的绘制 36310.9.1 多项式求解方法 36310.9.2 Bezier多项式的递归细分 36410.9.3 其他多项式曲线的细分绘制 36610.9.4 Bezier曲面的细分 36710.10 犹他大学茶壶模型 36810.11 代数曲面 37010.11.1 二次曲面 37010.11.2 曲面的光线跟踪方法绘制 37010.11.3 曲线与曲面的细分 37110.12 OpenGL里的曲线与曲面 37310.12.1 Bezier曲线 37310.12.2 Bezier曲面 37410.12.3 茶壶显示 37510.12.4 NURBS函数 37610.12.5 二次曲面 37710.13 小结 37710.14 补充阅读材料 377习题 378第11章 过程建模方法 37911.1 使用过程建模的理由 37911.2 基于物理模型和粒子系统 38011.3 牛顿粒子 38111.3.1 独立粒子 38211.3.2 弹簧力 38211.3.3 吸引力与排斥力 38311.4 求解粒子系统 38411.5 约束 38611.5.1 碰撞 38611.5.2 球体内的粒子 38811.5.3 软约束 38911.6 基于语言的模型 38911.7 递归方法与分形几何 39211.7.1 标尺与长度 39211.7.2 分形维数 39311.7.3 中点分割与布朗运动 39411.7.4 分形山体 39511.8 Mandelbrot集合 39611.9 小结 39811.10 补充阅读材料 398习题 399第12章 可视化 40012.1 数据+几何 40012.2 高度场和等高线 40012.2.1 网格 40112.2.2 等高线图 40312.2.3 Marching Squares 40312.3 表面和标量场的可视化 40812.3.1 体数据集 40912.3.2 隐函数的可视化 41012.4 等值面和Marching Cubes 41112.5 网格简化 41312.6 直接体绘制 41412.6.1 颜色和不透明度赋值 41412.6.2 溅射法 41512.6.3 体光线跟踪法 41612.6.4 体的纹理映射 41712.7 向量场可视化 41712.7.1 Hedgehog法 41712.7.2 图示符 41812.7.3 颜色 41912.7.4 粒子轨迹和流线 42012.8 张量可视化 42112.9 小结 42212.10 补充阅读材料 422习题 422第13章 高级绘制方法 42413.1 流水线绘制技术不能解决的问题 42413.2 光线跟踪 42513.3 建立一个简单的光线跟踪器 42713.3.1 光线跟踪的递归过程 42713.3.2 交点计算 42813.3.3 光线跟踪的变异形式 43013.4 绘制方程 43113.5 辐射度 43213.5.1 辐射度方程 43213.5.2 求解辐射度方程 43313.5.3 计算形状因子 43413.5.4 实现辐射度算法 43613.6 RenderMan 43713.7 大规模场景绘制 43713.7.1 中排序绘制法 43813.7.2 后排序绘制法 43913.7.3 先排序绘制法 44113.8 基于图像的绘制 44213.9 小结 44313.10 补充阅读材料 444习题 444附录A 实例程序 446A.1 Sierpinski镂垫程序 447A.2 生成Sierpinski镂垫的递归程序 448A.3 生成三维Sierpinski镂垫程序 450A.4 生成三维Sierpinski镂垫的递归程序 452A.5 生成正方形程序 454A.6 画图程序 457A.7 介绍双缓存使用的程序 464A.8 用选择模式实现拾取功能程序 466A.9 立方体旋转程序 469A.10 利用顶点数组旋转立方体程序 472A.11 用虚拟跟踪球实现立方体旋转程序 474A.12 观察者漫游程序 478A.13 球体的细分逼近程序 481A.14 像素读写程序 485A.15 带纹理立方体的旋转程序 486A.16 场景图形程序实例 490A.17 画Bezier曲线程序 495附录B 空间 501B.1 标量 501B.2 向量空间 501B.3 仿射空间 503B.4 欧几里德空间 504B.5 投影 505B.6 格莱姆－施密特正交化 505B.7 补充阅读材料 506习题 506附录C 矩阵 507C.1 定义 507C.2 矩阵运算 507C.3 行矩阵和列矩阵 508C.4 秩 509C.5 不同表示之间的转换 510C.6 叉乘运算 511C.7 特征值和特征向量 511C.8 补充阅读材料 512习题 512参考文献 514[1]