当前位置:首页 > 百科

交互式计算机图形学--基于OpenGL的自顶向下方法

《交互式计算机图形学--基于来自OpenGL的360百科自顶向下方法情林永友(第4版)》是2007年8月27日清华大学出版社出版的图书,作者是(美)安吉尔(EdwaN Angel),译者是吴文国。

  • 书名 交互式计算机图形学--基于OpenGL的自顶向下方法(第4版)
  • 作者 (美)安吉尔(EdwaN Angel)
  • 译者 吴文国。
  • 出版社 清华大学出版社
  • 出版时间 2007年8月27日

内容简介

  本书介绍计算机图形学,重点讲解图形学的应用编程。从最初作为图形学讲义到1997正式出版第1版的7年时间里,图形学领域发生了巨大的变化,变化之迅速出乎多数人的意料。在此后的8年时间里(本书前3版),计算机图形学领域发生了更多的变来自化。具有正片电影离还及尼拉培术若冲长度的计算机动画不仅在商业上获得了成功,而且在艺术上也取得360百科了一定的成就。在电影中使用计算机特效已成为一种标准,而且很难辨别真实动作与计算机制作的动画效果之间的差异。近来的先进善向审象硬件技术模糊了计算机和实际游戏制作棚之间的界线。可编程图形处理器使得何活爱础精九真新个人计算机具有灵活的图形处理功能,这些功能几年前即使在最昂贵的工作站上也是不可能实现的。

  不仅图形系统一思频科通绿代的性能提高了许多,而且高端和低端工作站的价格也大幅度地下降。在最近几年里,每秒能生成一千多万个三维多边形,且带有光照效果和纹理映射的图形系统的价格从最初数十万美元下降到现在的不到1000美元。为个人计算机提供的专用图形显示卡的出现具有其特别深远的意义。这些显示卡起价虽然大约只有100美元,但能实现复杂的三维图形功能。在软件方面,无论是编写图形学应用程序还是在科学研究领域里开发高端产品,Ope随司造入教留站土扩争或nGL仍将是图形开发考题却青差绝人员的标准工具包。

  自顶向下的方法

  图形学的最新样而队粉发展和本书前3版的成功流京乡相,使我进一步增强了以下信念:即采用自顶向下的、面向编程的方法介绍计算机图形学。尽管许多计算机科学与工程系都提供了多门与计算机图形学有关的课程,但是就大多数学生而言,他们只能选修其中一门课程。现在的教学计划往往把图形学课程安排在编程语言、数据结构、算法设计、软件工程和基础数学等课程之后。计算机图形学的门部龙斤城讲授方式应该以知识性和趣味性为出发点,并逐步深入讨论与图形学相关的内容。我希望选频云话村科修图形学课程的学生尽早动手编写三维图形应用程序,只有当学生掌握了如何创建图形之后才可以向他们介绍画线和多边形填充等底层算法。

  欢凯John Kemeny是计算机听缺整另教育领域里的开拓者,他用大家非常熟悉的汽车作了一个非常形象的比喻。即大家并不真正需要理解汽车发动机的工作原理,但是如果不掌握汽车驾驶技术,就只能坐在汽车的后座里看人家开车。这个比喻同样可以类推到计算机图形学的教学方法上。讲授图形学有3种不同的方法。方法1--算法法,就是要求学生掌握与汽车工作原五终层理有关的各方面知识,如发动选著盐全拿复祖机、传动装置和燃烧过程等;方法2-- 观察法,相当于让一个车夫开车,让学生坐在后排做一个旁观者欣赏这个世界;方法3--编程法,就是指导学生如何驾驶,如何把车开到任何我们想要去的地方,本书就是采用这种方法。

  用Op神待选径曲enGL和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

  1.1 计算机图形学的应用 1

  1.1.1 信息的显示 2

  1.1.2 设计 2

  1.1.3 仿真与动画 3

  1.1.4 用户界面 3

  1.2 计算机图形系统 4

  1.2.1 像素与帧缓存 5

  1.2.2 输出来自设备 6

  1.2.3 输入设备 8

  1.3 京育氢践王岩找灯势图像:物理方法和人工

  合成方法 8

  1.3.1 对象与观察者 9

  1.3.2 光照与图像 10

  1.3.3 成像模型 12

  1.4 成像系统 1沉即川终九3

  1.4.1 针孔照相机 13

  1.4.2 人眼视觉系统 15

  1.5 虚拟照相机模型 16

  1.6 程序员接口 18

  1.6.1 笔式绘图仪模型 19

  1.6.2 三维API软件包 21

  1.6.3 彩图介绍 23

  1.6.4 建模-绘制模式 24

  1.7 图形系统的体系结构 25

  1.7.1 显示处理器 25

  1.7.2 流水线体系结构 26

  1.7.3 图形处理流水线 27

  1.位念装移宗感击高7.4 顶点处理 27

  1.7360百科.5 裁剪与图元组装 28

  1.7.6 光栅化 28

  1.7.7 片元处理 28

  1.8 可编程流水线 28

  1.9 性能特性 29

  1.10 小结 30

  1.11 补充阅读材料 30

  1.棉里石什提间可只委或12 习题 31

  第2章 图形学编程 33

  2.1 Sierpinski镂垫 33

  2.2 编写二维应用程束谈阻械械怀般序 34

  2.3 Op法农说层胶投凯enGL API工具包 39

  2.3.1 图形函数 短起罪即刑块讨40

  2.3.2 图形流水线和状态机 41

  2.3.3 OpenGL接口 41

  2.4 图元与属性 42

  2.4.1 多边形基本概念 44

  2.4.2 OpenGL里的多边形类型 46

  践走虽材水怎散2.4.3 球体的近被今语太程编略刚河度似表示 47

  2.4.4 字符 48

  2.4.5 曲线和曲面 50

  2.4.6 属性 50

  2.5 颜色 51

  2.5.1 RGB颜色 53

  2.5.2 索引颜色 55

  2.5.3 设置颜色属性 56

  2.6 视图处理 57

 官而侵太未群船 2.6.1 正交视图 57

  2.6.2 二维视图 60

  2.6.3 矩阵模式 60

  2.7 控制函数 61

  2.7.1 与Windows操作系统的

  交互作用 61

  2.7.低首故元服治站2 纵横比和视口 63

  2.7.3 main、display和myinit

  函数 64

  2.7.4 程序结构 6效坚杀施刻虽左己5

  2.8 Sierpin茶转金的训粒培来次校ski镂垫程序 65

  2.9 多边形与递归 67

  2.1村类越流选女乙有绝0 三维Sierpinski镂垫 69

  2.10.1 使用三维点 69

  2.10.2 在三维空间里使用

  多边形 71

  2.10.3 隐藏面消除 7么源被六还权员3

  2.11 描绘隐函数曲线 74

  2.12 小结 82

  2.13 补充阅读材料 83

  2.14 习题 84

 阶形战煤盾易儿 第3章 输入与交互 87

  3.1 交互模式 87

  3.2 输入设备 88

  3.2.1 物理输入设备 89

  3.2.2 逻辑设备 92

  3.2.3 输入模式 92

  3.3 客户-看卫另沿书增世笑呢双全服务器结构 94

  3.4 显示列表 95

  3.4.1 显示列表的定义和运行 97

  3.4.2 字符和显示列表 98

  3.4.3 GLUT库里的字体 101

  3.5 事件驱动编程 102

  3.5.1 使用指向输入设备 102

  3.5.2 窗口事件 105

  3.5.3 键盘事件 106

  3.5.4 显示函数和空闲回调函数 106

  3.5.5 窗口管理 107

  3.6 菜单 108

  3.7 拾取 109

  3.8 一个简单的画图程序 115

  3.9 建立交互模型 120

  3.10 交互式动画程序 123

  3.10.1 旋转的正方形 123

  3.10.2 双缓存 125

  3.10.3 使用定时器 126

  3.11 交互式程序的设计 127

  3.12 逻辑运算 128

  3.12.1 绘制可删除的直线 129

  3.12.2 异或操作(XOR)和颜色 132

  3.12.3 光标与覆盖层位平面 132

  3.13 小结 133

  3.14 补充阅读材料 134

  3.15 习题 134

  第4章 几何对象与坐标变换 138

  4.1 标量、点和矢量 138

  4.1.1 几何对象 139

  4.1.2 与坐标无关的几何对象 141

  4.1.3 数学观点:矢量与

  仿射空间 141

  4.1.4 计算机科学的观点 142

  4.1.5 几何抽象数据类型 142

  4.1.6 直线 144

  4.1.7 仿射加 144

  4.1.8 凸性 145

  4.1.9 点积和叉积 146

  4.1.10 平面 147

  4.2 三维几何图元 148

  4.3 坐标系与标架 150

  4.3.1 矢量表示与N-元组 152

  4.3.2 坐标系变换 153

  4.3.3 表示变换的示例 155

  4.3.4 齐次坐标 156

  4.3.5 标架变换的示例 159

  4.3.6 表示矩阵的运算处理 161

  4.4 OpenGL里的标架系统 162

  4.5 建立一个彩色立方体模型 166

  4.5.1 立方体模型 166

  4.5.2 内侧面与外侧面 167

  4.5.3 对象表示的数据结构 168

  4.5.4 彩色立方体 169

  4.5.5 双线性插值 169

  4.5.6 顶点数组 171

  4.6 仿射变换 173

  4.7 平移、旋转和缩放 175

  4.7.1 平移变换 175

  4.7.2 旋转变换 176

  4.7.3 缩放变换 178

  4.8 齐次坐标表示的变换公式 179

  4.8.1 平移 180

  4.8.2 缩放 181

  4.8.3 旋转 181

  4.8.4 剪切变换 183

  4.9 变换的串乘运算 184

  4.9.1 绕某一固定点的旋转 185

  4.9.2 一般的旋转变换 186

  4.9.3 实例变换 187

  4.9.4 绕任一轴旋转 188

  4.10 OpenGL中的变换矩阵 192

  4.10.1 当前变换矩阵 192

  4.10.2 旋转、平移和缩放 193

  4.10.3 在OpenGL中绕固

  定点旋转 194

  4.10.4 变换次序 194

  4.10.5 立方体的旋转 195

  4.10.6 矩阵的装载、压栈和弹栈

  操作 196

  4.11 三维应用程序的交互方式 197

  4.11.1 利用屏幕区域设置交互 197

  4.11.2 一个虚拟跟踪球 198

  4.11.3 平滑旋转 199

  4.11.4 递增式旋转 200

  4.12 四元数 201

  4.12.1 复数与四元数 201

  4.12.2 四元数与旋转 202

  4.13 小结 204

  4.14 补充阅读材料 205

  4.15 习题 205

  第5章 视图 208

  5.1 经典视图和计算机视图 208

  5.1.1 经典视图 210

  5.1.2 正射投影 210

  5.1.3 轴测法投影 211

  5.1.4 斜投影 212

  5.1.5 透视图 213

  5.2 计算机视图 214

  5.3 照相机定位 215

  5.3.1 照相机标架的定位 215

  5.3.2 两个视图处理API工具包 220

  5.3.3 Look-At 函数 223

  5.3.4 其他视图API工具包 224

  5.4 简单投影 225

  5.4.1 透视投影 225

  5.4.2 正交投影 228

  5.5 OpenGL的投影视图 229

  5.5.1 OpenGL的透视投影 230

  5.5.2 OpenGL的平行视图 232

  5.6 隐藏面消除 232

  5.7 交互式网格显示 234

  5.7.1 网格 234

  5.7.2 在场景中漫游 236

  5.7.3 多边形偏移 238

  5.8 平行投影矩阵 239

  5.8.1 投影归一化 239

  5.8.2 正交投影矩阵 240

  5.8.3 斜投影 242

  5.9 透视投影矩阵 244

  5.9.1 透视正则化 245

  5.9.2 OpenGL的透视变换 248

  5.10 投影与阴影 249

  5.11 小结 252

  5.12 补充阅读材料 253

  5.13 习题 253

  第6章 明暗处理 255

  6.1 光与材质 255

  6.2 光源 258

  6.2.1 彩色光源 259

  6.2.2 环境光 260

  6.2.3 点光源 260

  6.2.4 聚光灯 261

  6.2.5 远距离光源 262

  6.3 Phong反射模型 263

  6.3.1 环境反射 265

  6.3.2 漫反射 265

  6.3.3 镜面反射 266

  6.3.4 改进的Phong模型 268

  6.4 矢量计算 269

  6.4.1 法向矢量 270

  6.4.2 反射角度 272

  6.5 多边形的明暗处理 273

  6.5.1 平面明暗处理 274

  6.5.2 插值和Gouraud明暗

  处理方法 276

  6.5.3 Phong明暗处理方法 277

  6.6 球面的递归细分逼近 278

  6.7 OpenGL中的光源 282

  6.8 OpenGL程序中的材质设置 284

  6.9 球体模型的明暗处理 285

  6.10 全局照明 287

  6.11 小结 288

  6.12 补充阅读材料 289

  6.13 习题 290

  第7章 从顶点到片元 292

  7.1 绘制实现的基本策略 292

  7.2 绘制实现过程的4个

  主要任务 294

  7.2.1 建模 295

  7.2.2 几何处理 295

  7.2.3 光栅化 296

  7.2.4 片元处理 297

  7.3 裁剪 297

  7.4 线段裁剪 298

  7.4.1 Cohen-Sutherland

  裁剪算法 298

  7.4.2 Liang-Barsky裁剪算法 300

  7.5 多边形裁剪 301

  7.6 其他图元的裁剪 305

  7.6.1 包围盒与包围体 305

  7.6.2 曲线、曲面和字符 306

  7.6.3 帧缓存里的裁剪操作 307

  7.7 三维裁剪 307

  7.8 光栅化 310

  7.9 Bresenham算法 313

  7.10 多边形光栅化 315

  7.10.1 内外测试法 315

  7.10.2 OpenGL与凹多边形 317

  7.10.3 填充与排序 318

  7.10.4 泛洪填充法 318

  7.10.5 奇异性 319

  7.11 隐藏面消除 319

  7.11.1 景物空间和图像空间 319

  7.11.2 排序与隐藏面消除 321

  7.11.3 扫描线填充算法 321

  7.11.4 背面剔除 323

  7.11.5 Z-Buffer算法 324

  7.11.6 带Z-Buffer算法的

  扫描转换 326

  7.11.7 深度排序和画家算法 327

  7.12 反走样 330

  7.13 显示器因素 332

  7.13.1 颜色系统 332

  7.13.2 颜色矩阵 335

  7.13.3 γ校正 336

  7.13.4 抖动技术与半色调技术 336

  7.14 小结 337

  7.15 补充阅读材料 339

  7.16 习题 339

  第8章 离散技术 342

  8.1 缓存 342

  8.2 数字图像 344

  8.3 缓存写操作 346

  8.3.1 写入模式 347

  8.3.2 异或写入模式 349

  8.4 OpenGL的位运算与

  像素运算 349

  8.4.1 OpenGL缓存和像素管道 350

  8.4.2 位图 351

  8.4.3 光栅字体 352

  8.4.4 像素与图像 353

  8.4.5 查找表 354

  8.5 示例 356

  8.5.1 Mandelbrot 集合 356

  8.5.2 验证第7章的算法 358

  8.5.3 用于拾取操作的缓存 359

  8.6 映射方法 359

  8.7 纹理映射 361

  8.8 OpenGL的纹理映射 366

  8.8.1 二维纹理映射 367

  8.8.2 纹理采样 369

  8.8.3 纹理坐标设置 372

  8.8.4 纹理对象 374

  8.8.5 多纹理通道 374

  8.9 纹理生成过程 375

  8.10 环境贴图 376

  8.11 合成技术 380

  8.11.1 不透明性与融合 381

  8.11.2 图像合成 382

  8.11.3 OpenGL中的融合与

  图像合成 382

  8.11.4 反走样 383

  8.11.5 从后至前绘制与从前至

  后绘制 385

  8.11.6 景深提示和雾效果 386

  8.12 多通道绘制与累加缓存 387

  8.12.1 场景反走样 388

  8.12.2 凹凸贴图和浮雕效果 388

  8.12.3 图像处理 389

  8.12.4 OpenGL的图像处理

  扩展集 390

  8.12.5 其他多通道方法 390

  8.13 采样与走样 391

  8.13.1 采样理论 391

  8.13.2 重构 396

  8.13.3 量化 398

  8.14 小结 398

  8.15 补充阅读材料 399

  8.16 习题 400

  第9章 可编程着色器 402

  9.1 可编程流水线 402

  9.2 着色语言 403

  9.3 OpenGL功能扩展 405

  9.3.1 OpenGL版本和扩展集 405

  9.3.2 GLSL和Cg 406

  9.4 OpenGL着色语言(上) 406

  9.4.1 顶点着色器 406

  9.4.2 片元着色器 408

  9.5 OpenGL着色语言(下) 409

  9.5.1 GLSL执行过程 409

  9.5.2 数据类型与修饰符 410

  9.5.3 运算符与函数 412

  9.6 着色器连接到OpenGL程序 413

  9.7 顶点移动 415

  9.7.1 缩放顶点位置 415

  9.7.2 渐变效果 416

  9.7.3 粒子系统 417

  9.8 光照作用与着色器 418

  9.8.1 Phong着色 418

  9.8.2 非真实感着色 421

  9.9 片元着色器 422

  9.10 基于顶点与基于片元的

  Phong着色模型 422

  9.11 采样器 424

  9.12 立方体贴图 427

  9.12.1 反射贴图 427

  9.12.2 折射 429

  9.12.3 法线贴图 432

  9.13 凹凸映射 433

  9.13.1 凹凸贴图的原理 433

  9.13.2 高度场与凹凸映射 435

  9.13.3 凹凸映射与片元着色器 436

  9.13.4 示例 437

  9.14 小结 438

  9.15 补充阅读材料 439

  9.16 习题 439

  第10章 建模 441

  10.1 图符与实例 441

  10.2 层级模型 443

  10.3 机器手 445

  10.4 树与树的遍历 448

  10.5 树形数据结构的应用 451

  10.6 动画 455

  10.7 图形对象 456

  10.7.1 方法、属性和消息 457

  10.7.2 一个立方体对象 458

  10.7.3 实现立方体对象 460

  10.7.4 对象与层级结构 460

  10.7.5 几何对象 461

  10.8 场景图 462

  10.9 一个简单的场景图形

  API工具包 464

  10.9.1 结点类 464

  10.9.2 几何结点 466

  10.9.3 照相机类 468

  10.9.4 光源和材质 468

  10.9.5 变换类 470

  10.9.6 机器人类 470

  10.9.7 实现观察者类 472

  10.9.8 实现结点类 475

  10.10 其他的树形结构 478

  10.10.1 CSG树 479

  10.10.2 BSP树 480

  10.10.3 四叉树和八叉树 482

  10.11 图形与因特网 484

  10.11.1 网络与协议 484

  10.11.2 超媒体与HTML语言 485

  10.11.3 数据库与VRML 486

  10.11.4 Java与Java小程序 487

  10.12 过程建模 487

  10.13 基于物理模型和粒子系统 489

  10.14 牛顿粒子 490

  10.14.1 独立粒子 491

  10.14.2 弹簧力 492

  10.14.3 吸引力与排斥力 493

  10.15 粒子系统的求解方法 495

  10.16 约束 497

  10.16.1 碰撞 497

  10.16.2 软约束 499

  10.17 小结 500

  10.18 补充阅读材料 501

  10.19 习题 501

  第11章 曲线与曲面 503

  11.1 曲线和曲面的表示方法 503

  11.1.1 显式表示法 503

  11.1.2 隐式表示 504

  11.1.3 参数形式 505

  11.1.4 参数多项式曲线 507

  11.1.5 参数多项式曲面 508

  11.2 设计准则 509

  11.3 三次多项式参数曲线 511

  11.4 插值 512

  11.4.1 调和函数 514

  11.4.2 三次插值面片 515

  11.5 Hermite曲线和曲面 517

  11.5.1 Hermite形式 517

  11.5.2 几何连续和参数连续 519

  11.6 Bezier曲线和曲面 521

  11.6.1 Bezier曲线 521

  11.6.2 Bezier曲面面片 524

  11.7 三次B-样条 525

  11.7.1 三次B-样条曲线 525

  11.7.2 B-样条与基函数 528

  11.7.3 样条曲面 529

  11.8 通用的B样条函数 530

  11.8.1 B-样条的递归定义 530

  11.8.2 均匀样条 531

  11.8.3 非均匀B-样条 532

  11.8.4 NURBS 532

  11.9 曲线和曲面的绘制 533

  11.9.1 多项式求值方法 534

  11.9.2 Bezier多项式的

  递归细分 535

  11.9.3 其他多项式曲线的细分

  绘制法 537

  11.9.4 细分Bezier曲面 538

  11.10 犹他大学的茶壶模型 540

  11.11 代数曲面 541

  11.11.1 二次曲面 542

  11.11.2 曲面的光线跟踪

  绘制方法 542

  11.11.3 曲线与曲面的

  细分方法 543

  11.11.4 网格的细分方法 544

  11.12 OpenGL里的曲线与曲面 547

  11.12.1 Bezier曲线 547

  11.12.2 Bezier曲面 548

  11.12.3 绘制茶壶 549

  11.12.4 NURBS函数 550

  11.12.5 二次曲面对象 551

  11.13 小结 551

  11.14 补充阅读材料 552

  11.15 习题 552

  第12章 高级绘制 554

  12.1 超越流水线绘制 554

  12.2 光线跟踪 555

  12.3 建立一个简单的光线

  跟踪器 558

  12.3.1 光线跟踪的递归算法 558

  12.3.2 求交计算 560

  12.3.3 光线跟踪的变异形式 563

  12.4 绘制方程 563

  12.5 辐射度法 566

  12.5.1 辐射度方程 566

  12.5.2 求解辐射度方程 568

  12.5.3 形状因子的计算方法 569

  12.5.4 实现辐射度算法 571

  12.6 RenderMan 572

  12.7 大规模场景绘制 573

  12.7.1 中排序绘制法 575

  12.7.2 后排序绘制 576

  12.7.3 先排序绘制 579

  12.8 基于图像的绘制 580

  12.9 小结 582

  12.10 补充阅读材料 583

  12.11 习题 583

  附录A 实例程序 585

  附录B 空间 645

  附录C 矩阵 654

  附录D OpenGL函数简介 663

  参考文献 678

标签:

  • 关注微信
上一篇:孟浩然年谱
下一篇:仙路之体修

相关文章