计算机图形学导论

图形学渲染技术 专栏收录该内容
12 篇文章 6 订阅

 

一.计算机图形学概念

1.1什么是计算机图形学?(Computer Graphics)

关于计算机图形学的定义众说纷纭。

IEEE 对计算机图形学的定义为:Computer graphicsis the art or science of producing graphical images with the aid of computer。

国际标准化组织 ISO 将计算机图形学定义为:计算机图形学是一门研究通过计算机将数据转换成图形,并在专门显示设备上显示的原理方法和技术的学科。它是建立在传统的图学理论、应用数学及计算机科学基础上的一门边缘学科。

总而言之计算机图形学是研究怎样利用计算机来显示、生成和处理图形的原理、方法和技术的一门学科,这里的图形是指三维图形的处理。

1.2图形和图像

图形和图像辨析

计算机图形学(computer graphics)的基本含义是使用计算机通过算法和程序在显示设备上构造图形。图形是人们通过计算机设计和构造出来的,不是通过摄像机、扫描仪等设备输入的图像。这里的图形可以是现实中存在的图形,也可以是完全虚拟构造的图形。以矢量图的形式呈现,更强调场景的几何表示,记录图形的形状参数与属性参数。例如,工程图纸,其最基本的图形单元是点、线、圆/弧等,其信息包含图元的几何信息与属性信息(颜色、线型、线宽等显式属性和层次等隐式属性)。

图像处理(image processing)则是研究图像的分析处理过程,图像处理研究的是图像增加、模式识别、景物分析等,研究对象一般为二维图像。图像以点阵图形式呈现,并记录每个点的灰度或色彩。例如,照片、扫描图片和由计算机产生的真实感和非真实感图·形等, 最基本的图像单元(pels,picture elements)是点—像素(pixel),其信息实际上是点与它的属性信息(颜色、灰度、亮度等)。

 

1.3计算机图形学发展

  • 20 世纪 50 年代:1946 年 2 月 14 日,世界上第一台电子计算机ENIAC在美国宾夕法尼亚大学问世,1950 年第一台图形显示器诞生于麻省理工学院,从此计算机具有了图象显示功能,也开启了图形显示与计算机技术联系的桥梁。

  • 20 世纪 60 年代:1962 年美国 MIT 林肯实验室的 Ivan E.Sutherland 发表了一篇题为“sketchpad:一个人机交互通信的图形系统”的博士论文,首次使用了“Computer Graphics” 这一概念,证明了交互式计算机图形学是一个可行的、有应用价值的研究领域,从而确立了计算机图形学正式成为一个独立学科的分支。随着光栅显示器的诞生,对光栅图形学算法的研究迅速地发展壮大起来,大量基本概念以及相应的算法应运而生。

  • 20 世纪 70 年代:图形学在这一时期进入了兴盛期,光栅图形学算法迅速发展,区域填充、裁剪、消隐等概念及其相应算法纷纷被提出,实用的 CAD 图形系统也开始出现。除此之外,真实感图形学和实体造型技术的产生也是 70 年代计算机图形学的两个重要进展。

  • 20 世纪 80 年代以后:出现了带有光栅扫描显示器的微型计算机和图形工作站,极大的推动了计算机图形学的发展,如 Machintosh、IBM 公司的 PC 及其兼容机,Apollp、Sun 工作站等。随着奔腾 III 和奔腾 IV 系列 CPU 的出现,计算机图形软件功能一开始部分地由硬件实现。高性能显卡和液晶显示屏的使用,高传输率大容量硬盘的出现,特别是 Internet 的普及使得微型计算机和图形工作站在运算速度、图形显示细节上的差距越来越小,这些都为图形学的飞速发展奠定了物质基础。

  • 20 世纪 90 年代以后:微机和软件系统的普及使得图形学的应用领域日益广泛,计算机图形学朝着标准化、集成化和智能化的方向发展,多媒体、人工智能、计算机可视化、虚拟现实等分支蓬勃发展,三维造型也获得了长足发展。ISO 公布的图形标准越来越精细,更加成熟。这是存在着一些事实上的标准,如 SGI 公司开发的 OpenGL 开放式三维图形标准,微软公司为PC 游戏开发的应用程序接口标准DirectX 等,Adobe 公司 Postscript 等,均朝着开放式、高效率的方向发展。

 

二.计算机图形学总体框架

数学基础:主要包括一些基本的算法,例如向量与几何的变换,如几何建模时的三维空间变换、绘制时的三维到二维的投影变换和二维空间的窗口和视图变换等。

建模:三维和二维空间的各种几何模型,有解析式表达的简单形体,也有隐函数表达的复杂曲线等。建模的主要工作是几何计算。

渲染:或者叫做绘制,指的是模型的视觉实现过程,计算机图形学的光照、纹理等理论和算法都需要对模型进行处理,其中也要用到大量的几何计算。

交互技术:如今的交互式图形学已经可以提供图形通讯手段,成为图形交互的主要工具。几何计算贯穿于以上各个过程之中,是计算机图形学的基础。在图形学中那些看上去是“绘制”的内容,本质上仍是几何计算的问题。例如隐藏线、隐藏面的消除以及具有光照效果的真实感图形显示虽是提升图形显示效果的手段,但其主要的工作恰是几何计算。Gourand 插值模型(通过对多边形顶点颜色进行线性插值来绘制其内部各点)和 Phong 插值模型(对多边形顶点的法线方向进行插值以产生中间各点的法线方向)的实质均是几何插值问题;光线跟踪的工作和时间花费主要是几何计算-光线与景物的求交计算及交点处景物表面的法向、反射光线与折射光线的方向计算等。

 

2.1 建模

没有模型,图形就无从谈起,建模是计算机图形学各项工作的基础和前提,建模技术的核心是根据研究对象的三维空间信息构造其立体模型,尤其是几何模型,并利用相关建模软件或编程语言生成该模型的图形显示,然后对其进行处理。目前,物体的三维几何模型就其复杂程度来说可以分为三类:线模型、面模型和体模型。对三维建模技术的研究基本上都是针对三维面元模型和体元模型来展开的。

 

2.2 渲染

计算机图形学的一项主要工作是将计算机中抽象的模型转换为人们直观可见、可以形象理解的图形。它综合利用数学、物理学、计算机等知识,将模型的形状、物理特性(如材料的折射率、反射率、物体发光温度等,机械强度、材料密度等对运动模拟的影响等),以及物体间的相对位置、遮挡关系等性质在计算机屏幕上模拟出来,是一个将“几何”演绎到画面上的再创造过程,这就是渲染,也叫绘制。

2.2.1什么是渲染?

当需要把模型或者场景输出成图像文件、视频信号或者电影胶片时就需要用到渲染

(Render)。渲染是指软件由模型生成图像的过程。模型是用语言或者数据结构进行严格定义的三维物体或虚拟场景,它包括几何、视点、纹理、照明等信息。图像是数字图像或者位图图像。除去后期制作,渲染是计算机图形处理的最后一道工序,通过它得到模型与动画的最终显示效果。实现渲染依靠多种软件,如各种 CG 软件自带渲染引擎、RenderMan 等。

随着计算机图形学的不断深入发展,渲染的应用领域越来越广泛:计算机与视频游戏、模拟、电影或者电视特效以及可视化设计。作为产品来看,现在已经有各种不同的渲染工具产品,有些集成到更大的建模或者动画工具中,有些是独立产品,有些是开放源代码的产品。从内部来看,渲染工具都经过了仔细的设计,其理论基础是光学、视觉感知、数学以及软件开发等各种科学理论。

2.2.2渲染技术有哪些?

扫描线渲染与栅格化:扫描线渲染是一行一行进行的一项技术和算法集。所有待渲染的多边形首先按照顶点 y 坐标出现的顺序排序,然后使用扫描线与列表中前面多边形的交点计算图像的每行或者每条扫描线,在活动扫描线逐步沿图像向下计算的时候更新列表。这种方法的一个优点是没有必要将主内存中的所有顶点都转到工作内存,只有与当前扫描线相交边界的约束顶点才需要读到工作内存,并且每个定点数据只需读取一次。主内存的速度通常远远低于中央处理单元或者高速缓存,避免多次访问主内存中的顶点数据,就可以大幅度地提升运算速度。

栅格化又叫光栅化,是将几何数据经过一系列变换后最终转换为像素,从而呈现在显示设备上的过程。栅格化将顶点数据转换为片元,片元中的每一个元素对应于帧缓冲区中的一个像素。如下图。

 

光线投射:从不同视角观察场景,并根据几何与反射强度的基本光学原理计算观察到的图像,这就是光线投射。光线投射算法的基本思想是从视平面每个像素发出一条光线,穿过体数据,基于最基本的光线吸收和发射模型,沿着光线方向对颜色和阻光度进行积累。当光线与物体交叉的时候,交叉点的颜色可以用几种不同的方法来计算。其中最简单的方法是用交叉点处物体的颜色表示该点的实际颜色;也可以用纹理映射的方法来确定;一种更加复杂的方法是依据局部光照模型进行计算。为了减少人为误差,可以对多条相邻方向的光线进行平均。另外的一些计算涉及到从光源到物体的入射角,以及根据光源的强度计算像素的亮度值。

光线投射算法从视点发出一组光线,对光线经过的三维数据集上的数据可以间隔均匀地采样,与人类真实视觉相似,适用于透视投影。因此光线投射主要被用于实时模拟场景下, 例如三维计算机游戏以及动画等,这类场景往往对细节不太重视而且通过人为制造细节可以得到更好的表现效果。

辐射着色:辐射着色是模拟反射光线如何反射到它表面以及如何照亮周围环境的方法。这种方法可以生成较为真实的浓淡效果,并且更加易于捕捉室内场景的环境光。这种模拟的光线基础是特定物体表面某一点的漫反射的光线散布在很大的方向范围内并且会照亮周围 的环境。 各种模拟技术的复杂性可能会有所不同。许多渲染方法所用的辐射着色模型都非常原始, 它们只是简单地根据环境因数变化照亮整个场景。但是当高级的辐射着色与高质量的光线跟 踪算法组合在一起使用的时候,它们能够生成相当真实的图像,尤其是对于室内场景更是这样。在高级的辐射着色模拟中,递归的有限元分析算法不断地将光线在模型表面之间来回反射,直到达到一定的递归条件为止。这样一个表面的色彩就会影响其它相邻表面的色彩,反之亦然。整个模型的照明结果会被保存起来,在光线投射或者光线跟踪模型中作为输入使用。由于这项技术的递归特性,所以对于复杂物体的模拟速度非常缓慢。一些先进的辐射着色计算方法可能只计算房间中从墙面、地板与房顶反射的环境光,而并不计算复杂物体反光对于辐射着色的影响,或者在辐射着色计算中使用同样尺寸及纹理的简单物体取代复杂物体。如果场景中运动的辐射着色物体很少,那么可以在多帧画面中重复使用同样的辐射着色数据。

光线跟踪:类似于光线投射,但是光线跟踪使用了更加先进的光学模拟方法,并且通常使用蒙特·卡罗方法以实现更加真实的结果,不过这样做的代价通常是速度的大幅度降低。

光线跟踪是比其他渲染方法如扫描线渲染等更加能够实现的模拟光线,因此像反射和阴影这样一些需要复杂精确渲染的效果,就需要光线跟踪算法来实现。因此,在要求高质量渲染效果的光线跟踪中,通常每个像素都需要采样多条光线,并且不仅是跟踪到第一次相交, 而是需要按照“入射角等于反射角”这样的光学定律以及更加高级的处理折射与粗糙表面反射的定律处理多次连续反射。一旦光线遇到光源更可能出现的是光线反射次数已经达到设定的限制,那么最终点的表面照明就通过上面的方法确定下来,并且经过多次反射发生的变化也可以估计在观察点看到的亮度。每个采样点、每个像素都要重复这个过程。在有些场合中每个交点可能生成多条光线。

作为一种非常有效的方法,光线跟踪的处理速度很慢,但也在一些需要高真实感效果的场合下得到应用,例如电影制作、广告制作等。此外,简化的光线跟踪方法可以广泛应用于不需要高质量细节的场合。目前已经出现了一些处于原型阶段硬件加速的光线跟踪设备,在一些游戏演示中也有实时软件或者硬件光线跟踪的应用。

 

2.3 图形交互

l 几何约束 :几何约束可以用于对图形的方向、对齐方式等进行规定和标准。

l 引力场 :

引力场可以看作是一种定位约束,通过在特定点周围假想有一个区域,当光标中心落在这个区域内时,会自动地被直线上最近的一个点代替。就像一个质点进入直线周围的引力场,然后被吸引到这条直线上去一样。引力场的大小要适中,太小了不容易进入引力区,太大了线和线的引力区相交,光标在进入引力区相交部分有可能会被吸引到不希望选的线段上去,增大误接的概率。

l 拖动 :要把一个对象移动到一个新的位置时,如果不是简单地用光标指定新位置的一个点,而是用光标移动时拖动着被移动的对象,会使用户感到更直观,并且可以使对象放置的位置更恰当。

l 橡皮筋技术 :

被拖动对象的形状和位置随着光标位置的不同而变化,是一个不断地进行画图—擦除— 画图的过程。

①从起点到光标中心点(x,y)处画图

②擦除起点到光标中心点(x,y)处的图形

③光标移动到新的位置:x=x+△x,y=y+△y

④转第①步,重复这个过程,直到按下确认键。

l 操作柄技术 :

可以用来对图形图像进行缩放、旋转、错切等几何变换。先选择要处理的图形对象,该图形对象的周围会出现操作柄,移动或者旋转操作柄就可以实现相应的变换。

 

2.4几何计算

 

三.计算机图形学著名公司

世界著名图形学教材,完整版,带完整电子目录。 《计算机图形学(OpenGL版)第3版》是一本国外很有影响的教材,为许多国外著名大学所采用。《计算机图形学(OpenGL版)第3版》通过最能代表技术发展状况的示例综合介绍了计算机图形学方面的原则和技巧,《计算机图形学(OpenGL版)第3版》对每个概念都进行了详细介绍,阐述了其背后的数学原理,并给出了用OpenGL实现的代码以及实现结果展示。新版本还为读者提供了计算机图形学领域的最前沿信息。《计算机图形学(OpenGL版)第3版》是计算机图形学课程的很好教材,也是计算机图形学专业人员的很好参考书。 编辑推荐 《计算机图形学(OpenGL版)第3版》配套的网站提供了书中使用到的代码、彩色插图、完整程序以及与《计算机图形学(OpenGL版)第3版》密切相关的参考素材。 推荐理由:   以C++语言作为程序设计语言。   深入介绍3D图形学及其数学知识,使学生可以创建真实的3D图形。   每章后面都给出了实际的案例研究。   清晰地介绍了计算机图形学的原理和技术。   大量真实而逼真的示例。   大量实践练习(每章大概有30多道)。 目录 第1章 计算机图形学概述 1.1 什么是计算机图形学 1.2 计算机生成的图片用在哪里 1.2.1 艺术、娱乐和出版行业 1.2.2 计算机图形学、感知和图像处理 1.2.3 过程监视 1.2.4 仿真显示 1.2.5 计算机辅助设计 1.2.6 科学分析与体可视化 1.3 计算机图形学中制作图像的基本元素 1.3.1 折线 1.3.2 文本 1.3.3 填充区域 1.3.4 光栅图像 1.3.5 光栅图像的灰度和色彩表达 1.4 图形显示设备 1.4.1 线画显示 1.4.2 光栅显示器 1.4.3 视频卡/3D加速器 1.4.4 其他的光栅显示设备 1.4.5 硬拷贝光栅设备 1.5 图形输入的基本单元和设备 1.5.1 逻辑上的输入图形基元类型 1.5.2 物理输入设备的类型 本章小结 本章习题 进一步阅读 第2章 OpenGL绘图入门 2.1 生成图像初步 2.1.1 设备无关的编程和OpenGL 2.1.2 窗口的编程 2.1.3 如何打开一个窗口画图 2.2 OpenGL的基本图形元素 2.2.1 几个点丛绘制的例子 2.3 OpenGL中的直线绘制 2.3.1 绘制折线和多边形 2.3.2 使用moveTo()和lineTo()绘制线段 2.3.3 绘制边校正的矩形 2.3.4 边校正矩形的长宽比 2.3.5 填充多边形 2.3.6 OpenGL中的其他图形元素 2.4 与鼠标和键盘的交互 2.4.1 用鼠标交互 2.4.2 键盘交互 2.5 程序中的菜单设计与使用 本章小结 案例分析 进一步阅读 第3章 更多的绘图工具 3.1 概述 3.2 世界窗口和视口 3.2.1 窗口到视口的映射 3.3 裁减线 3.3.1 如何裁减一条线 3.3.2 Cohen-Sutherland裁减算法 3.4 正多边形、圆和圆弧 3.4.1 正多边形 3.4.2 正n边形的变种 3.4.3 绘制圆弧和圆 3.4.4 曲线的逐次细化 3.5 曲线的参数形式 3.5.1 曲线的参数形式 3.5.2 绘制参数曲线 3.5.3 极坐标形状 本章小结 案例分析 进一步阅读 第4章 图形学中的向量工具 4.1 概述 4.2 向量回顾 4.2.1 向量基本运算法则 4.2.2 向量线性组合 4.2.3 向量的度量和单位向量 4.3 点积 4.3.1 点积的性质 4.3.2 两个向量的夹角 4.3.3 b·c的符号和正交性 4.3.4 二维正交向量 4.3.5 正交投影和点到直线的距离 4.3.6 投影的应用:反射 4.4 两个向量的叉积 4.4.1 叉积的几何解释 4.4.2 求平面的法向量 4.4.3 判断平面多边形的凸性 4.5 重要几何对象的表示 4.5.1 坐标系统和坐标框架 4.5.2 点的仿射组合 4.5.3 两个点的线性插值 4.5.4 使用内插的艺术和动画 4.5.5 预览:用二次、三次内插生成贝塞尔曲线 4.5.6 表示直线和平面 4.6 求两个线段的交点 4.6.1 直线求交的应用:过三点的圆 4.7 直线和平面求交及裁剪 4.8 多边形求交问题 4.8.1 处理凸多边形和凸多面体 4.8.2 射线与凸多边形的交点以及裁剪问题 4.8.3 Cyrus-Beck裁剪算法 4.8.4 更高级的裁剪问题 本章小结 案例分析 进一步阅读 第5章 物体变换 5.1 概述 5.2 几何变换初步 52.1 点和物体变换 5.2.2 仿射变换 5.2.3 二维基本仿射变换的几何效果 5.2.4 仿射变换的逆变换 5.2.5 组合一个仿射变换 5.2.6 二维组合变换的实例 5.2.7 仿射变换的一些有用的性质 5.3 三维仿射变换 5.3.1 基本三维变换 5.3.2 组合一个三维仿射变换 5.3.3 旋转的组合 5.3 4总结三维仿射变换的性质 5.4 如何实现坐标系变换 5.5 在程序中使用仿射变换 5.5.1 为后面的使用保存CT 5.6 使用OpenGL绘制电维场景 5.6.1 观察过程和图形绘制管道概述 5.6.2 OpenGL中的建模和视点工具 5.6.3 用OpenGL绘制基本形状 5.6.4 使用sDI。从文件中读取一个场景的描述 本章小结 案例分析 进一步阅读 第6章 使用多边形网格建模 6.1 概述 6.2 多边形网格实体建模初步 6.2.1 定义多边形网格 6.2.3 文件格式举例 6.2.3 计算法向量 6.2.4 网格的性质 62.5 非实体对象的网格模型 6.2.6 在程序中使用网格 6.3 多面体 6.3.1 棱柱 6.3.2 柏拉图实体 6.3.3 其他有趣的多面体 6.4 拉伸形体 第7章 三维观察 第8章 几何体的真实感渲染 第9章 光栅显示工具 第10章 曲线和曲面设计 第11章 颜色理论 第12章 光线跟踪基础 附录1 图形工具:怎样获取和安装OpenGL 附录2 计算机图形学的数学基础 附录3 有用的类、例种以及SDL 附录4 分形和曼德布洛特集合 附录5 相对性和海龟绘图 书摘 第1章 计算机图形学概述   本章学习目标   纵览计算机图形学领域   描述重要的图形输入和输出设备   预览   1.1节 介绍计算机图形学的相关领域。1.2节给出了一些当今计算机图形学应用的例子。1.3节介绍用计算机生成图像的基本方法。在1.3.4节中特别介绍了光栅图像的概念,它的应用贯穿本书始终。1.4节描述了一些现在常用的图形显示设备,1.5节简要介绍用于交互式图形应用的各种输入设备。   本书原著在国外是很有影响力的教材,被许多国外著名的大学所采用。译者在尽量保持原书精髓的基础上,对原书做了一些表述上的调整,以符合中文习惯,原书中的一些笔误,也给予了纠正。本书译者中,胡事民、刘永进、张松海来自清华大学计算机科学与技术系,刘利刚来自浙江大学数学系,均在第一线从事计算机图形学的教学和科研工作。在本书的翻译中,胡事民教授负责第1、2、8章,刘利刚副教授负责10、11、12章,刘永进副教授负责5、6、7章,张松海博士负责3、4、9章。经过一年多的努力,本书终于完成翻译,并付印。在翻译过程中,得到了许多同事和学生的帮助,研究生徐昆、高岳、李勇、张砚、雷励星、陈韬、张一飞、藏域、程明明、来煜坤、勒力、杨永亮、张国鑫、王王禹屏、边哲、佟强、白石、沈超慧、卢少平、陈中贵、陈仁杰、陈军、胡建伟、孟敏、张冬梅等参与翻译了部分初稿,在此一并表示感谢。   由于译者水平有限,本书翻译过程中难有疏漏和不妥之处,敬请读者批评和指正。前 言 对于有志于学习计算机图形学基本原理和技术,并且渴望自己能够编写优质图形学程序的读者,本书为他们提供了入门的详细介绍。计算机图形学具有强大的生命力并正在持续发展。动画电影已经展示给人们图形学知识所能做到的令人激动的视觉效果。电脑游戏和因特网中的图形效果同样激励人们去学习如何自己动手做出这样的效果。   图形软硬件系统正在以惊人的速度朝着更好、更快和更廉价的方向发展。每年从研究和业界中提出的大量新技术不断地涌现。然而,图形学最基本的原理和方法,却保持着稳定和连贯,并且这些知识中的大部分可以通过一个图形学课程学习得到。本书将图形学的一些基本思想和方法组织起来,通过阅读使读者从只会编写简单程序的水平,提高到能够自行设计并编写出优良图形学程序的水平。   适用的读者范围   该书被设定为本科高年级或研究生一年级的一个或两个学期的课程教材。该书也可用于自学。该书的主要对象是专业为计算机科学或计算机工程的学生,当然也适用于其他专业如物理和数学的学生。   对数学基础的要求   读者应该具备相当于大学一年级的数学水平;并具备初等代数、几何、三角函数和初等微积分的基本知识。向量和矩阵的有关知识将有助于本书的阅读,但不是必须的。本书在相关章节中介绍了向量和矩阵的基本知识,同时,附录中总结了向量和矩阵的关键概念。   计算机图形学中使用了大量的数学符号来表达线、面和视点之间的基本几何关系。虽然每个数学符号都很容易理解,但所需的符号数量却令人生畏。书中特别强调了使用每种符号或技术的原因,以及如何利用这些数学符号合理地描述图形程序中感兴趣的对象。   对编程水平的要求   一般情况下,读者应具有至少一个学期使用C、C++或Java编写程序的经验。相当多有关图形的编程涉及到将几何关系直接转换为代码,包括使用变量、函数、数组、循环和条件测试等,而这些东西在不同编程语言中都是类似的。本书使用的编程语言是C++,但是,有C语言背景的读者可以轻易地读懂大部分材料。   读者如果熟练掌握C中的结构或C++中的类,将非常有助于本书的阅读。如用于描述复杂场景的图形对象结构,这些场景(如一个城堡或一架飞机)可能由许多部分组成,而这些部分本身又由复杂的更小部分组成。如果能熟练使用链表或树结构也会有一些帮助,但不是必须的。   对于只懂得C但不懂得C++的读者来说,需要掌握面向对象的编程理念。本书中定义了许多有用的类(如网格、场景、相机和纹理等类),并且说明了这些类为什么方便易用。在某些场合下,为了使程序更加清晰易读,我们使用了面向对象编程中的一些技术,如继承和多态,不过,我们并不过分强调面向对象的方法。   计算机图形学 (OpenGL版)(第3版)前言教学理念   第3版与前两版相比,几乎被完全重新组织和改写,但是基本的教学理念没有改变: 我们坚信计算机图形学是在实际使用中学习到的,一定要动手编写程序并进行测试,才能真正地掌握计算机图形学。本书的一个主要目标就是让读者懂得如何将一个特定的设计任务转换成相应的几何结构,并找到一个合适的数学表达,最后将这个表达转换为算法和程序代码。本书将以循序渐进的方式让读者首先学习到如何编写简单的程序来绘制简单的图像,然后一步一步深入地掌握如何生成更加复杂的特殊效果的技巧。   练习和问题   本书包含超过350道来源于实际问题的练习题。其中大部分都是让读者停下来进行思考但并不需要编程的那种类型,这可以让读者自己测试一下知识掌握的程度。其余小部分则需要编程实现。   此外,在所有章节的末尾,列出了总共超过50个的实例分析。它们都是一些编程的项目,难易程度由简到繁,适合于作为课后作业。这些案例分析对相应章节内的内容进行了扩展。无论是否全部完成这些实例分析任务,它们都应该作为相应章节的一个有机组成部分。   每一个实例分析任务都注明了相应的难易程度,用以判断完成该任务所需的大致时间。学生编程能力各异,编程过程不可预测,但可大致总结如下。   难易程度   Ⅰ. 简单的练习,应该可以一晚完成。   Ⅱ. 较难任务,应该可以一周内完成,读者需要一定的时间来设计程序,并且有足够的时间反复测试和调试程序。   Ⅲ. 复杂任务,一般需要3周时间来完成设计和实现。完成它可以被视为一项重大进步。   OpenGL的使用   刚开始学习计算机图形学时,一个很大的障碍就是如何绘制一幅图像。写一个程序通常很简单,但最终要通过某些工具在屏幕上绘制出来。现在,这些工具已经存在并且很容易获取。1992年, Silicon Graphics 公司推出了OpenGL。现在它已经成为最广泛使用的图形应用编程接口(API)之一。OpenGL通过提供可以在程序中调用的方法接口来绘制图像,并且它可以在因特网上免费下载。正如附录1中所述,在大专院校和工业界中使用的各种计算机系统上,都可以使用OpenGL。它易于安装和使用,目前作为标准的图形API已经成熟。它的制定和修改由OpenGL评审委员会(一个负责引导OpenGL发展的工业协会)负责。   OpenGL非常适用于计算机图形的一个特殊原因是因为它的设备独立性或可移植性。不同院校的机房使用不同种类的计算机,学生可以利用OpenGL在任何一台计算机上开发并运行程序。此外,该程序也可以在不同操作系统下、不同类型的另一台计算机上运行,两台计算机上生成的图像也一定相同。   OpenGL提供了丰富且易用的二维图形和图像操作的API函数,然而OpenGL最强大之处在于处理三维图形。使用OpenGL,读者可以在一个学期之内学习并掌握制作精美动画效果的技巧。   OpenGL的发展历史   OpenGL的第一个版本1.0在1992年发布。从那时起, OpenGL一直都是一个成功的跨平台的图形API。第一个版本可以很好地兼容一个叫做IrisGL的专有API,这种API是由Silicon Graphics公司设计开发的。兼容的目的是为了建立一个工业标准。为此,Silicon Graphics公司联合其他几家图形硬件公司,共同制定了一个开放标准,命名为OpenGL。不足为奇,在随后的10年,人们努力使得OpenGL变得更好和更加强大。在这段时间,图形硬件也发展迅猛,产生了越来越强大的图形加速卡,这使得程序开发者迫切需要一个能够达到OpenGL最佳效果的API。因此,OpenGL提供了一系列的扩展函数,允许开发者在图形硬件新特征出现后就可以马上充分利用它们。   每当有一种强大的软件系统面世,标准的问题也随即产生。对于OpenGL,为使它朝着可控、有序的方向发展,Silicon Graphics成立了一个监督组织,该组织被称作OpenGL 架构评审委员会(Architecture Review Board, ARB). ARB的主要任务是指导OpenGL规范的制定和一致性测试。OpenGL规范详尽地描述了每个OpenGL方法和标识符的使用方法。目前,ARB的成员有3Dlabs、苹果公司、IBM、英特尔、nVidia、ATI、SGI和Sun Microsystems等。   OpenGL规范中定义的方法由各个图形硬件厂商在图形驱动程序中实现。这个过程需要大量的资金和时间,所以,通常在规范发布后过一段时间,支持该规范的驱动程序才会发布。最新的版本OpenGL 2.0在2004年9月发布,它包含了强大的OpenGL着色语言(Shading Language),将在第8章对此进行详细介绍。它的前一版本是OpenGL 1.5,该版本发布于2003年。   计算机图形学是一个发展迅速的领域,这使得开发人员往往很急切地等待OpenGL官方版本的发布。所以,必须存在一种机制,使得小规模增加的最新OpenGL功能可以马上在最新的图形硬件上开发和测试。为此,ARB提供了一个明确定义的扩展机制。在OpenGL扩展注册表(http://oss.sgi.com/projects/projects/ogl-sample/registry)中可以看到扩展的列表,其中定义了命名习惯,新扩展的指导方针和其他相关的扩展讨论。访问扩展是一个平台相关的任务,而可用的扩展取决于计算机上安装的图形硬件。一些库如GLEW和GLEE可以用来简化在应用程序中使用扩展。   扩展机制使得OpenGL以一个合理的成本运行。小规模的改动就可以拥有最新硬件的强大功能。这些扩展一旦被批准并在OpenGL扩展注册表中注册登记之后,即可以迅速发挥作用。当某个扩展已经成熟到可以加入OpenGL的核心功能中时,ARB就会讨论决定是否将其加入,然后发布新版本的OpenGL。这些内容将在第8章中进行讨论。   C++编程语言的使用   C++是大多数工程和计算机科学专业的首选编程语言。相比于C, C++有几个明显的优点,如引用传递函数参数,这使得显式指针不再需要,代码阅读更加易懂。通过使用流,文件的输入输出(I/O)也被极大地简化。一般来说,C++中的所有I/O的语法都比C中更为清晰。为了使得本书中的描述更为简单,我们没有特别强调C++中运算符的使用。   此外,C++中的类很容易开发应用,如二维或三维中的点、线、窗口或颜色,这使代码更加简单而且更加鲁棒。使用类之后,具体的操作如几何对象细节隐藏、编写绘制函数包装绘制、测试某个对象是否相交等都更加清晰易读。   注重三维计算机图形学   由于PC上的游戏越来越流行,电影中令人眼花缭乱的动画越来越多,学生都对开发三维交互式的图形应用程序特别有兴趣。为了能让读者更快地进入三维图形学的主题,本书重新组织了第一版和第二版中的若干章节。在很多地方,二维和三维的概念结合在一起论述,这可以帮助理解两者之间的相似和区别。   使用场景设计语言来描述三维场景   如果用原始的OpenGL命令来描述一个包含很多三维物体的场景,将会非常不雅观而且费时。例如,如果使用OpenGL的命令逐一定义6个面来描述一个立方体将显得非常乏味。所以,在第5章中会介绍一个简单的场景描述语言SDL(在附录中有更加详尽定义)。使用这个描述语言,学生可以使用熟悉的词汇来描述场景,如“立方体”、“球”和“旋转”等,并建立包含这些词汇的文件。这些文件可以在运行时读入到程序中。本书的附录(或本书的网站)中给出了一个能够阅读SDL文件并建立文件中所描述物体的解释程序。这样,用OpenGL来绘制场景文件中的物体列表就变得非常简单。   本书的结构和课程安排   本书包含多于一个学期的教学内容,甚至多于两个学期的内容(对前两版也是这种情况)。本书经过细致的编排,使得授课老师可以根据课程的长度和课程的背景选择不同的章节组合来授课。下面在介绍完各章的主要内容之后,将介绍几个建议的章节组合教学方案。
第1章绪论 1.1计算机图形学及其相关概念 1.2计算机图形学的发展 1.2.1计算机图形学学科的发展 1.2.2图形硬件设备的发展 1.2.3图形软件的发展 1.3计算机图形学的应用 1.3.1计算机辅助设计与制造 1.3.2计算机辅助绘图 1.3.3计算机辅助教学 1.3.4办公自动化和电子出版技术 1.3.5计算机艺术 1.3.6在工业控制及交通方面的应用 1.3.7在医疗卫生方面的应用 1.3.8图形用户界面 1.4计算机图形学研究动态 1.4.1计算机动画 1.4.2地理信息系统 1.4.3人机交互 1.4.4真实感图形显示 1.4.5虚拟现实 1.4.6科学计算可视化 1.4.7并行图形处理 第2章计算机图形系统及图形硬件 2.1计算机图形系统概述 2.1.1计算机图形系统的功能 2.1.2计算机图形系统的结构 2.2图形输入设备 2.2.1键盘 2.2.2鼠标器 2.2.3光笔 2.2.4触摸屏 2.2.5操纵杆 2.2.6跟踪球和空间球 2.2.7数据手套 2.2.8数字化仪 2.2.9图像扫描仪 2.2.10声频输入系统 2.2.11视频输入系统 2.3图形显示设备 2.3.1阴极射线管 2.3.2CRT图形显示器 2.3.3平板显示器 2.3.4三维观察设备 2.4图形显示子系统 2.4.1光栅扫描图形显示子系统的结构 2.4.2绘制流水线 2.4.3相关概念 2.5图形硬拷贝设备 2.5.1打印机 2.5.2绘图仪 2.6OpenGL图形软件包 2.6.1OpenGL的主要功能 2.6.2OpenGL的绘制流程 2.6.3OpenGL的基本语法 2.6.4一个完整的OpenGL程序 第3章用户接口与交互式技术 3.1用户接口设计 3.1.1用户模型 3.1.2显示屏幕的有效利用 3.1.3反馈 3.1.4一致性原则 3.1.5减少记忆量 3.1.6回退和出错处理 3.1.7联机帮助 3.1.8视觉效果设计 3.1.9适应不同的用户 3.2逻辑输入设备与输入处理 3.2.1逻辑输入设备 3.2.2输入模式 3.3交互式绘图技术 3.3.1基本交互式绘图技术 3.3.2三维交互技术 3.4OpenGL中橡皮筋技术的实现 3.4.1基于鼠标的实现 3.4.2基于键盘的实现 3.5OpenGL中拾取操作的实现 3.6OpenGL的菜单功能 第4章图形的表示与数据结构 4.1基本概念 4.1.1基本图形元素 4.1.2几何信息与拓扑信息 4.1.3坐标系 4.1.4实体的定义 4.1.5正则集合运算 4.1.6平面多面体与欧拉公式 4.2三维形体的表示 4.2.1多边形表面模型 4.2.2扫描表示 4.2.3构造实体几何法 4.2.4空间位置枚举表示 4.2.5八叉树 4.2.6BSP树 4.2.7OpenGL中的实体模型函数 4.3非规则对象的表示 4.3.1分形几何 4.3.2形状语法 4.3.3粒子系统 4.3.4基于物理的建模 4.3.5数据场的可视化 4.4层次建模 4.4.1段与层次建模 4.4.2层次模型的实现 4.4.3OpenGL中层次模型的实现 第5章基本图形生成算法 5.1直线的扫描转换 5.1.1数值微分法 5.1.2中点Bresenham算法 5.1.3Bresenham算法 5.2圆的扫描转换 5.2.1八分法画圆 5.2.2中点Bresenham画圆算法 5.3椭圆的扫描转换 5.3.1椭圆的特征 5.3.2椭圆的中点Bresenham算法 5.4多边形的扫描转换与区域填充 5.4.1多边形的扫描转换 5.4.2边缘填充算法 5.4.3区域填充 5.4.4其他相关概念 5.5字符处理 5.5.1点阵字符 5.5.2矢量字符 5.6属性处理 5.6.1线型和线宽 5.6.2字符的属性 5.6.3区域填充的属性 5.7反走样 5.7.1过取样 5.7.2简单的区域取样 5.7.3加权区域取样 5.8在OpenGL中绘制图形 5.8.1点的绘制 5.8.2直线的绘制 5.8.3多边形面的绘制 5.8.4OpenGL中的字符函数 5.8.5OpenGL中的反走样 第6章二维变换及二维观察 6.1基本概念 6.2基本几何变换 6.2.1平移变换 6.2.2比例变换 6.2.3旋转变换 6.2.4对称变换 6.2.5错切变换 6.2.6二维图形几何变换的计算 6.3复合变换 6.3.1二维复合平移变换和比例变换 6.3.2二维复合旋转变换 6.3.4其他二维复合变换 6.3.5相对任一参考点的二维几何变换 6.3.6相对于任意方向的二维几何变换 6.3.7坐标系之间的变换 6.3.8光栅变换 6.3.9变换的性质 6.4二维观察 6.4.1基本概念 6.4.2?用户坐标系到观察坐标系的变换 6.4.3?窗口到视区的变换 6.5?裁剪 6.5.1?点的裁剪 6.5.2直线段的裁剪 6.5.3多边形的裁剪 6.5.4其他裁剪 6.6OpenGL中的二维观察变换 第7章三维变换及三维观察 7.1三维变换的基本概念 7.1.1几何变换 7.1.2三维齐次坐标变换矩阵 7.1.3平面几何投影 7.2三维几何变换 7.2.1三维基本几何变换 7.2.2三维复合变换 7.3三维投影变换 7.3.1正投影 7.3.2斜投影 7.4透视投影 7.4.1一点透视 7.4.2二点透视 7.4.3三点透视 7.5观察坐标系及观察空间 7.5.1观察坐标系 7.5.2观察空间 7.6三维观察流程 7.6.1用户坐标系到观察坐标系的变换 7.6.2平行投影的规范化投影变换 7.6.3透视投影的规范化投影变换 7.7三维裁剪 7.7.1关于规范化观察空间的裁剪 7.7.2齐次坐标空间的裁剪 7.8OpenGL中的变换 7.8.1矩阵堆栈 7.8.2模型视图变换 7.8.3投影变换 7.8.4实例 第8章曲线与曲面 8.1基本概念 8.1.1曲线/曲面数学描述的发展 8.1.2曲线/曲面的表示要求 8.1.3曲线/曲面的表示 8.1.4插值与逼近 8.1.5连续性条件 8.1.6样条描述 8.2三次样条 8.2.1自然三次样条 8.2.2Hermite插值样条 8.3Bezier曲线/曲面 8.3.1Bezier曲线的定义 8.3.2Bezier曲线的性质 8.3.3Bezier曲线的生成 8.3.4Bezier曲面 8.4B样条曲线/曲面 8.4.1B样条曲线 8.4.2B样条曲线的性质 8.4.3B样条曲面 8.5有理样条曲线/曲面 8.5.1NURBS曲线/曲面的定义 8.5.2有理基函数的性质 8.5.3NURBS曲线/曲面的特点 8.6曲线/曲面的转换和计算 8.6.1样条曲线/曲面的转换 8.6.2样条曲线/曲面的离散生成 8.7OpenGL生成曲线/曲面 8.7.1Bezier曲线/曲面函数 8.7.2GLU中的B样条曲线/曲面函数 第9章消隐 9.1深度缓存器算法 9.2区间扫描线算法 9.3深度排序算法 9.4区域细分算法 9.5光线投射算法 9.6BSP树 9.7多边形区域排序算法 9.8OpenGL中的消隐处理 第10章真实感图形绘制 10.1简单光照模型 10.1.1环境光 10.1.2漫反射光 10.1.3镜面反射光 10.1.4光强衰减 10.1.5颜色 10.2基于简单光照模型的多边形绘制 10.2.1恒定光强的多边形绘制 10.2.2Gouraud明暗处理 10.2.3Phong明暗处理 10.3透明处理 10.4产生阴影 10.5模拟景物表面细节 10.5.1用多边形模拟表面细节 10.5.2纹理的定义和映射 10.5.3凹凸映射 10.6整体光照模型与光线追踪 10.6.1整体光照模型 10.6.2Whitted光照模型 10.6.3光线跟踪算法 10.6.4光线跟踪反走样 10.7 OpenGL中的光照与表面绘制函数 10.7.1 OpenGL点光源 10.7.2 OpenGL全局光照 10.7.3 OpenGL表面材质 10.7.4 OpenGL透明处理 10.7.5 OpenGL表面绘制 10.7.6 实例 10.8 OpenGL中的纹理映射
©️2022 CSDN 皮肤主题:Age of Ai 设计师:meimeiellie 返回首页

打赏作者

Papals

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值