标题：交互式计算机图形学——基于OpenGL的自顶向下方法（第4版）
图书信息
作者：吴文国 图书详细信息： ISBN：9787302152651 定价：79.99元 印次：4-1 装帧：平装 印刷日期：2007-8-27
图书简介
本书介绍计算机图形学，重点讲解图形学的应用编程。从最初作为图形学讲义到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。ISTEC1(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为我的第一本图形学书绘制了里面的插图。这些插图的一部分成为了本书插图的基础。可能只有其他作家才能完全理解在出版过程中作者所投入的精力以及我的合作伙伴为此所作出的贡献和牺牲。也谨把此书献给我的夫人，感谢她为我所做的工作。1 ISTEC是伊比利亚美洲教育技术研究联盟。[1]
图书目录
第1章 图形系统和模型 11.1 计算机图形学的应用 11.1.1 信息的显示 21.1.2 设计 21.1.3 仿真与动画 31.1.4 用户界面 31.2 计算机图形系统 41.2.1 像素与帧缓存 51.2.2 输出设备 61.2.3 输入设备 81.3 图像：物理方法和人工合成方法 81.3.1 对象与观察者 91.3.2 光照与图像 101.3.3 成像模型 121.4 成像系统 131.4.1 针孔照相机 131.4.2 人眼视觉系统 151.5 虚拟照相机模型 161.6 程序员接口 181.6.1 笔式绘图仪模型 191.6.2 三维API软件包 211.6.3 彩图介绍 231.6.4 建模-绘制模式 241.7 图形系统的体系结构 251.7.1 显示处理器 251.7.2 流水线体系结构 261.7.3 图形处理流水线 271.7.4 顶点处理 271.7.5 裁剪与图元组装 281.7.6 光栅化 281.7.7 片元处理 281.8 可编程流水线 281.9 性能特性 291.10 小结 301.11 补充阅读材料 301.12 习题 31第2章 图形学编程 332.1 Sierpinski镂垫 332.2 编写二维应用程序 342.3 OpenGL API工具包 392.3.1 图形函数 402.3.2 图形流水线和状态机 412.3.3 OpenGL接口 412.4 图元与属性 422.4.1 多边形基本概念 442.4.2 OpenGL里的多边形类型 462.4.3 球体的近似表示 472.4.4 字符 482.4.5 曲线和曲面 502.4.6 属性 502.5 颜色 512.5.1 RGB颜色 532.5.2 索引颜色 552.5.3 设置颜色属性 562.6 视图处理 572.6.1 正交视图 572.6.2 二维视图 602.6.3 矩阵模式 602.7 控制函数 612.7.1 与Windows操作系统的交互作用 612.7.2 纵横比和视口 632.7.3 main、display和myinit函数 642.7.4 程序结构 652.8 Sierpinski镂垫程序 652.9 多边形与递归 672.10 三维Sierpinski镂垫 692.10.1 使用三维点 692.10.2 在三维空间里使用多边形 712.10.3 隐藏面消除 732.11 描绘隐函数曲线 742.12 小结 822.13 补充阅读材料 832.14 习题 84第3章 输入与交互 873.1 交互模式 873.2 输入设备 883.2.1 物理输入设备 893.2.2 逻辑设备 923.2.3 输入模式 923.3 客户-服务器结构 943.4 显示列表 953.4.1 显示列表的定义和运行 973.4.2 字符和显示列表 983.4.3 GLUT库里的字体 1013.5 事件驱动编程 1023.5.1 使用指向输入设备 1023.5.2 窗口事件 1053.5.3 键盘事件 1063.5.4 显示函数和空闲回调函数 1063.5.5 窗口管理 1073.6 菜单 1083.7 拾取 1093.8 一个简单的画图程序 1153.9 建立交互模型 1203.10 交互式动画程序 1233.10.1 旋转的正方形 1233.10.2 双缓存 1253.10.3 使用定时器 1263.11 交互式程序的设计 1273.12 逻辑运算 1283.12.1 绘制可删除的直线 1293.12.2 异或操作(XOR)和颜色 1323.12.3 光标与覆盖层位平面 1323.13 小结 1333.14 补充阅读材料 1343.15 习题 134第4章 几何对象与坐标变换 1384.1 标量、点和矢量 1384.1.1 几何对象 1394.1.2 与坐标无关的几何对象 1414.1.3 数学观点：矢量与仿射空间 1414.1.4 计算机科学的观点 1424.1.5 几何抽象数据类型 1424.1.6 直线 1444.1.7 仿射加 1444.1.8 凸性 1454.1.9 点积和叉积 1464.1.10 平面 1474.2 三维几何图元 1484.3 坐标系与标架 1504.3.1 矢量表示与N-元组 1524.3.2 坐标系变换 1534.3.3 表示变换的示例 1554.3.4 齐次坐标 1564.3.5 标架变换的示例 1594.3.6 表示矩阵的运算处理 1614.4 OpenGL里的标架系统 1624.5 建立一个彩色立方体模型 1664.5.1 立方体模型 1664.5.2 内侧面与外侧面 1674.5.3 对象表示的数据结构 1684.5.4 彩色立方体 1694.5.5 双线性插值 1694.5.6 顶点数组 1714.6 仿射变换 1734.7 平移、旋转和缩放 1754.7.1 平移变换 1754.7.2 旋转变换 1764.7.3 缩放变换 1784.8 齐次坐标表示的变换公式 1794.8.1 平移 1804.8.2 缩放 1814.8.3 旋转 1814.8.4 剪切变换 1834.9 变换的串乘运算 1844.9.1 绕某一固定点的旋转 1854.9.2 一般的旋转变换 1864.9.3 实例变换 1874.9.4 绕任一轴旋转 1884.10 OpenGL中的变换矩阵 1924.10.1 当前变换矩阵 1924.10.2 旋转、平移和缩放 1934.10.3 在OpenGL中绕固定点旋转 1944.10.4 变换次序 1944.10.5 立方体的旋转 1954.10.6 矩阵的装载、压栈和弹栈操作 1964.11 三维应用程序的交互方式 1974.11.1 利用屏幕区域设置交互 1974.11.2 一个虚拟跟踪球 1984.11.3 平滑旋转 1994.11.4 递增式旋转 2004.12 四元数 2014.12.1 复数与四元数 2014.12.2 四元数与旋转 2024.13 小结 2044.14 补充阅读材料 2054.15 习题 205第5章 视图 2085.1 经典视图和计算机视图 2085.1.1 经典视图 2105.1.2 正射投影 2105.1.3 轴测法投影 2115.1.4 斜投影 2125.1.5 透视图 2135.2 计算机视图 2145.3 照相机定位 2155.3.1 照相机标架的定位 2155.3.2 两个视图处理API工具包 2205.3.3 Look-At 函数 2235.3.4 其他视图API工具包 2245.4 简单投影 2255.4.1 透视投影 2255.4.2 正交投影 2285.5 OpenGL的投影视图 2295.5.1 OpenGL的透视投影 2305.5.2 OpenGL的平行视图 2325.6 隐藏面消除 2325.7 交互式网格显示 2345.7.1 网格 2345.7.2 在场景中漫游 2365.7.3 多边形偏移 2385.8 平行投影矩阵 2395.8.1 投影归一化 2395.8.2 正交投影矩阵 2405.8.3 斜投影 2425.9 透视投影矩阵 2445.9.1 透视正则化 2455.9.2 OpenGL的透视变换 2485.10 投影与阴影 2495.11 小结 2525.12 补充阅读材料 2535.13 习题 253第6章 明暗处理 2556.1 光与材质 2556.2 光源 2586.2.1 彩色光源 2596.2.2 环境光 2606.2.3 点光源 2606.2.4 聚光灯 2616.2.5 远距离光源 2626.3 Phong反射模型 2636.3.1 环境反射 2656.3.2 漫反射 2656.3.3 镜面反射 2666.3.4 改进的Phong模型 2686.4 矢量计算 2696.4.1 法向矢量 2706.4.2 反射角度 2726.5 多边形的明暗处理 2736.5.1 平面明暗处理 2746.5.2 插值和Gouraud明暗处理方法 2766.5.3 Phong明暗处理方法 2776.6 球面的递归细分逼近 2786.7 OpenGL中的光源 2826.8 OpenGL程序中的材质设置 2846.9 球体模型的明暗处理 2856.10 全局照明 2876.11 小结 2886.12 补充阅读材料 2896.13 习题 290第7章 从顶点到片元 2927.1 绘制实现的基本策略 2927.2 绘制实现过程的4个主要任务 2947.2.1 建模 2957.2.2 几何处理 2957.2.3 光栅化 2967.2.4 片元处理 2977.3 裁剪 2977.4 线段裁剪 2987.4.1 Cohen-Sutherland裁剪算法 2987.4.2 Liang-Barsky裁剪算法 3007.5 多边形裁剪 3017.6 其他图元的裁剪 3057.6.1 包围盒与包围体 3057.6.2 曲线、曲面和字符 3067.6.3 帧缓存里的裁剪操作 3077.7 三维裁剪 3077.8 光栅化 3107.9 Bresenham算法 3137.10 多边形光栅化 3157.10.1 内外测试法 3157.10.2 OpenGL与凹多边形 3177.10.3 填充与排序 3187.10.4 泛洪填充法 3187.10.5 奇异性 3197.11 隐藏面消除 3197.11.1 景物空间和图像空间 3197.11.2 排序与隐藏面消除 3217.11.3 扫描线填充算法 3217.11.4 背面剔除 3237.11.5 Z-Buffer算法 3247.11.6 带Z-Buffer算法的扫描转换 3267.11.7 深度排序和画家算法 3277.12 反走样 3307.13 显示器因素 3327.13.1 颜色系统 3327.13.2 颜色矩阵 3357.13.3 γ校正 3367.13.4 抖动技术与半色调技术 3367.14 小结 3377.15 补充阅读材料 3397.16 习题 339第8章 离散技术 3428.1 缓存 3428.2 数字图像 3448.3 缓存写操作 3468.3.1 写入模式 3478.3.2 异或写入模式 3498.4 OpenGL的位运算与像素运算 3498.4.1 OpenGL缓存和像素管道 3508.4.2 位图 3518.4.3 光栅字体 3528.4.4 像素与图像 3538.4.5 查找表 3548.5 示例 3568.5.1 Mandelbrot 集合 3568.5.2 验证第7章的算法 3588.5.3 用于拾取操作的缓存 3598.6 映射方法 3598.7 纹理映射 3618.8 OpenGL的纹理映射 3668.8.1 二维纹理映射 3678.8.2 纹理采样 3698.8.3 纹理坐标设置 3728.8.4 纹理对象 3748.8.5 多纹理通道 3748.9 纹理生成过程 3758.10 环境贴图 3768.11 合成技术 3808.11.1 不透明性与融合 3818.11.2 图像合成 3828.11.3 OpenGL中的融合与图像合成 3828.11.4 反走样 3838.11.5 从后至前绘制与从前至后绘制 3858.11.6 景深提示和雾效果 3868.12 多通道绘制与累加缓存 3878.12.1 场景反走样 3888.12.2 凹凸贴图和浮雕效果 3888.12.3 图像处理 3898.12.4 OpenGL的图像处理扩展集 3908.12.5 其他多通道方法 3908.13 采样与走样 3918.13.1 采样理论 3918.13.2 重构 3968.13.3 量化 3988.14 小结 3988.15 补充阅读材料 3998.16 习题 400第9章 可编程着色器 4029.1 可编程流水线 4029.2 着色语言 4039.3 OpenGL功能扩展 4059.3.1 OpenGL版本和扩展集 4059.3.2 GLSL和Cg 4069.4 OpenGL着色语言(上) 4069.4.1 顶点着色器 4069.4.2 片元着色器 4089.5 OpenGL着色语言(下) 4099.5.1 GLSL执行过程 4099.5.2 数据类型与修饰符 4109.5.3 运算符与函数 4129.6 着色器连接到OpenGL程序 4139.7 顶点移动 4159.7.1 缩放顶点位置 4159.7.2 渐变效果 4169.7.3 粒子系统 4179.8 光照作用与着色器 4189.8.1 Phong着色 4189.8.2 非真实感着色 4219.9 片元着色器 4229.10 基于顶点与基于片元的Phong着色模型 4229.11 采样器 4249.12 立方体贴图 4279.12.1 反射贴图 4279.12.2 折射 4299.12.3 法线贴图 4329.13 凹凸映射 4339.13.1 凹凸贴图的原理 4339.13.2 高度场与凹凸映射 4359.13.3 凹凸映射与片元着色器 4369.13.4 示例 4379.14 小结 4389.15 补充阅读材料 4399.16 习题 439第10章 建模 44110.1 图符与实例 44110.2 层级模型 44310.3 机器手 44510.4 树与树的遍历 44810.5 树形数据结构的应用 45110.6 动画 45510.7 图形对象 45610.7.1 方法、属性和消息 45710.7.2 一个立方体对象 45810.7.3 实现立方体对象 46010.7.4 对象与层级结构 46010.7.5 几何对象 46110.8 场景图 46210.9 一个简单的场景图形API工具包 46410.9.1 结点类 46410.9.2 几何结点 46610.9.3 照相机类 46810.9.4 光源和材质 46810.9.5 变换类 47010.9.6 机器人类 47010.9.7 实现观察者类 47210.9.8 实现结点类 47510.10 其他的树形结构 47810.10.1 CSG树 47910.10.2 BSP树 48010.10.3 四叉树和八叉树 48210.11 图形与因特网 48410.11.1 网络与协议 48410.11.2 超媒体与HTML语言 48510.11.3 数据库与VRML 48610.11.4 Java与Java小程序 48710.12 过程建模 48710.13 基于物理模型和粒子系统 48910.14 牛顿粒子 49010.14.1 独立粒子 49110.14.2 弹簧力 49210.14.3 吸引力与排斥力 49310.15 粒子系统的求解方法 49510.16 约束 49710.16.1 碰撞 49710.16.2 软约束 49910.17 小结 50010.18 补充阅读材料 50110.19 习题 501第11章 曲线与曲面 50311.1 曲线和曲面的表示方法 50311.1.1 显式表示法 50311.1.2 隐式表示 50411.1.3 参数形式 50511.1.4 参数多项式曲线 50711.1.5 参数多项式曲面 50811.2 设计准则 50911.3 三次多项式参数曲线 51111.4 插值 51211.4.1 调和函数 51411.4.2 三次插值面片 51511.5 Hermite曲线和曲面 51711.5.1 Hermite形式 51711.5.2 几何连续和参数连续 51911.6 Bezier曲线和曲面 52111.6.1 Bezier曲线 52111.6.2 Bezier曲面面片 52411.7 三次B-样条 52511.7.1 三次B-样条曲线 52511.7.2 B-样条与基函数 52811.7.3 样条曲面 52911.8 通用的B样条函数 53011.8.1 B-样条的递归定义 53011.8.2 均匀样条 53111.8.3 非均匀B-样条 53211.8.4 NURBS 53211.9 曲线和曲面的绘制 53311.9.1 多项式求值方法 53411.9.2 Bezier多项式的递归细分 53511.9.3 其他多项式曲线的细分绘制法 53711.9.4 细分Bezier曲面 53811.10 犹他大学的茶壶模型 54011.11 代数曲面 54111.11.1 二次曲面 54211.11.2 曲面的光线跟踪绘制方法 54211.11.3 曲线与曲面的细分方法 54311.11.4 网格的细分方法 54411.12 OpenGL里的曲线与曲面 54711.12.1 Bezier曲线 54711.12.2 Bezier曲面 54811.12.3 绘制茶壶 54911.12.4 NURBS函数 55011.12.5 二次曲面对象 55111.13 小结 55111.14 补充阅读材料 55211.15 习题 552第12章 高级绘制 55412.1 超越流水线绘制 55412.2 光线跟踪 55512.3 建立一个简单的光线跟踪器 55812.3.1 光线跟踪的递归算法 55812.3.2 求交计算 56012.3.3 光线跟踪的变异形式 56312.4 绘制方程 56312.5 辐射度法 56612.5.1 辐射度方程 56612.5.2 求解辐射度方程 56812.5.3 形状因子的计算方法 56912.5.4 实现辐射度算法 57112.6 RenderMan 57212.7 大规模场景绘制 57312.7.1 中排序绘制法 57512.7.2 后排序绘制 57612.7.3 先排序绘制 57912.8 基于图像的绘制 58012.9 小结 58212.10 补充阅读材料 58312.11 习题 583附录A 实例程序 585附录B 空间 645附录C 矩阵 654附录D OpenGL函数简介 663参考文献 678