计算机图形学及OpenGL简介摘记

计算机图形学(Computer Graphics)是研究怎样用计算机表示、生成、处理和显示图形的一门学科。图形的具体应用范围很广,但是按基本的处理技术划分只有两类。一类是线条,如工程图、地图、曲线图表等;另一类是明暗图,与照片相似。为了生成图形,就要有原始数据或数学模型。

计算机图形软件有两个大类:通常分为通用编程软件包和专用应用软件包。专用应用图形软件包是为非程序员设计的,是具有图形处理能力的交互式图形软件系统, 为非程序员提供的而且往往应用于某个或某些领域,使得他们在某些应用中能生成图形、表格而不关心显示所需的图形函数。专用软件包的接口通常是一组菜单,用户通过菜单按自己的概念与程序进行通信。这类应用的例子包括艺术家绘画程序和各种建筑、商务、医学及工程CAD系统。相反,通用图形编程软件包常常是图形库,一般由程序员在开发时使用,提供一个可用于C、C++、Java等高级程序设计语言的图形函数库。典型的图形库中的基本函数用来描述图元(直线、多边形、球面和其它对象)、设定颜色、观察选择的场景和进行旋转和其它变换等。通用图形程序设计软件包有GL(Graphics Library)、OpenGL(提供了生成各种图形、实现图形的处理和输入输出操作、控制和处理各种图形设备以及交互过程中的各种事件)、VRML(Virtual-Reality Modeling Language虚拟现实建模语言)、Java 2D等。由于图形函数库提供了程序设计语言和硬件之间的软件接口,所以这一组图形函数称为计算机图形应用编程接口。

常用的图形输入设备:(1)、矢量型图形输入设备:它采用跟踪轨迹、记录坐标点的方法输入图形。主要输入的数据形式为直线或折线组成的图形数据。常用的矢量型图形输入设备有数字化仪、鼠标器、光笔等;(2)、光栅扫描型图形输入设备:它采用逐行扫描、按一定密度采样的方式输入图形。主要的输入数据为一幅由亮度值构成的像素矩阵--图像(Image)。这类设备常采用自动扫描输入方式,因此输入快捷;但是,它所获得的图像数据必须被转换为图形(Graphics)数据,才能被CAD 系统和各子系统所使用。这种转换,是一种图形识别的过程。常用的光栅扫描型图形输入设备有扫描仪和摄像机。

在光栅显示器的荧光屏上生成一个对象,实质上是往帧暂存寄存器的相应单元中填入数据;画一条从(x1, y1)到(x2,y2)的直线,实质上是一个发现最佳逼近直线的像素序列、并填入色彩数据的过程,这个过程也称为直线光栅化。

基本图形的生成与计算

(1)、直线的生成算法:直线DDA算法、直线Bresenham算法;

(2)、圆的生成算法:圆的Bresenham算法;

(3)、区域填充算法:区域填充即给出一个区域的边界,要求对边界范围内的所有像素单元赋予指定的颜色代码。区域填充中最常用的是多边形填色。填色算法分为两大类:A、扫描线填色(Scan-Line Filling)算法,这类算法建立在多边形边界的矢量形式数据之上,可用于程序填色,也可用于交互填色;B、种子填色(Seed Filling)算法,这类算法建立在多边形边界的图像形式数据之上,并还需提供多边形边界内一点的坐标。所以,它一般只能用于人机交互填色,而难以用于程序填色;

(4)、字符的生成:在计算机图形学中,字符可以用不同的方式表达和生成。常用的描述方法有点阵式、矢量式和编码式。A、点阵式字符将字符形状表示为一个矩形点阵,由点阵中点的不同值表达字符的形状。常用的点阵大小有5×7、7×9、8×8、16×16 等;B、矢量式字符将字符表达为点坐标的序列,相邻两点表示一条矢量,字符的形状便由矢量序列刻画;C、方向编码式字符用有限的若干种方向编码来表达一个字符,常用的如8 方向编码;D、轮廓字形技术:当对输出字符的字形要求较高时(如排版印刷),需要使用高质量的点阵字符,轮廓字形法采用直线或者二次Bezier 曲线、三次Bezier 曲线的集合来描述一个字符的轮廓线。轮廓线构成一个或若干个封闭的平面区域。轮廓线定义和一些指示横宽、竖宽、基点、基线等的控制信息,就构成了字符的压缩数据。这种控制信息用于保证字符变倍而引起的字符笔画原来的横宽、竖宽变大变小时,其宽度在任何点阵情况下永远一致。采用适当的区域填充算法,可以从字符的轮廓线定义产生字符位图点阵;

(5)、图形求交:在计算机图形学中常常会遇到求交计算。例如,在进行扫描线区域填充时要求出线段的交点,许多消隐算法需要进行直线和平面多边形的求交,等等。求交运算是比较复杂的,为了减少计算量,在进行真正的求交计算之前,往往先用凸包等辅助结构进行粗略的比较,排除那些显然不相交的情形。求交计算是计算机辅助设计系统的重要组成部分,它的准确性与效率直接影响计算机辅助设计系统的可靠性与实用性。A、直线段与直线段的交点;B、直线段与二次曲线的交点;C、圆锥曲线与圆锥曲线的交点;D、直线段与平面的交点;圆锥曲线与平面的交点;E、圆锥曲线与二次曲面的交点;F、包含判定算法:在进行图形求交时,常常需要判定两个图形间是否有包含关系。如点是否包含在线段、平面区域或三维形体中,线段是否包含在平面区域或三维形体中,等等。许多包含判定问题可转化为点的包含判定问题,如判断线段是否在平面上的问题可以转化为判断线段两端点是否在平面上;G、重叠判定算法:进行求交计算时,常涉及判断两个几何形体是否重叠。判断空间一点与另一点是否重叠,只要判断两点之间的距离是否等于0 即可。判断两条线段是否重叠,可先判断它们是否共线,即判断一条线段上的任意两点是否在另一条线段所在的直线上,或是比较两条线段的方向矢量并判断一条线段上的任意一点是否在另一条线段所在的直线上。若两条线段不共线,则它们不可能重叠;否则,可通过端点坐标的比较来判断两线段的重叠部分。判断两个平面的重叠关系,一种方法是判断一个平面上不共线的3 个点是否在另一个平面上;另一种方法是先比较两个平面的法矢量,再判断一个平面上的某点是否在另一个平面上;H、凸包计算:一个图形的凸包,就是包含这个图形的一个凸的区域。例如,一个平面图形的凸包可以是一个凸多边形,一个三维物体的凸包可以是一个凸多面体。一个图形的凸包不是惟一的。在进行图形求交计算时,为了减小计算量,经常要在求交之前先进行凸包计算。如果两个图形的凸包不相交,显然它们不可能相交,就不必再对它们进行求交计算了。否则这两个图形有可能相交,需要进一步计算;

(6)、图形裁剪:一个二维矩形区域的裁剪,这个矩形区域称为窗口。当窗口被确定之后,只有窗口内的物体才能被显示出来,窗口外的物体都是不可见的。因此,窗口外物体可以不参加标准化转换及随后的显示操作,从而节约处理时间。裁剪(Clipping)是裁去窗口之外物体或物体部分的一种操作。A、直线的裁剪:Cohen-Sutherland直线裁剪算法以区域编码为基础,将窗口及其周围的8 个方向以4 bit 的二进制数进行编码。各编码为分别代表窗外上、下、右、左空间的编码值;B、多边形的裁剪:多边形剪裁算法的关键在于,通过剪裁,不仅要保持窗口内多边形的边界部分,而且要将窗框的有关部分按一定次序插入多边形的保留边界之间,从而使剪裁后的多边形的边仍然保持封闭状态,以便填色算法得以正确实现;C、字符串的裁剪。

基本光栅图形生成技术:计算机能够生成非常复杂的图形, 但图形无论多么复杂, 它都是由基本图形组合而成的。因此, 学习基本图形的生成算法是掌握计算机图形学的基础。阴极射线管光栅显示器是由可发光的像素组成的矩阵, 它是离散的, 因此, 在绘制具有连续性质的直线、曲线或区域等基本图形时, 需要确定最佳逼近它们的像素, 这个过程称为光栅化。当光栅化按照扫描线的顺序进行时, 它被称为扫描转换。对于一维图形, 在不考虑线宽时, 用一个像素宽的直、曲线来显示图形。二维图形的光栅化必须确定区域对应的像素集, 并用指定的属性或图案显示之, 即区域填充。光栅化和扫描转换是光栅图形学的基本问题, 其算法的好坏对系统的效率有直接的关系。

图形变换:图形变换可以分为3 类:几何变换、坐标变换和显示变换。这3种图形变换具有不同的概念和作用,同时又有密切的联系。

几何变换:几何变换提供了构造和修改图形的一种方法,图形在位置、方向、尺寸和形状方面的改变都可以通过几何变换来实现。几何变换的基本方法是把变换矩阵作为一个算子,作用到图形一系列顶点的位置矢量,从而得到这些顶点在几何变换后的新的顶点序列,连接新的顶点序列即可得到变换后的图形。几何变换是在同一坐标系下进行的,因此,这时坐标系是静止的,而图形是变动的。基本几何变换都是相对于原点和坐标轴进行的几何变换,有平移、缩放和旋转等。

组合几何变换与齐次坐标:(1)、齐次坐标:在实际绘图时,常常要对图形连续做多次变换,例如先平移,再旋转、放大等。这样需要对该图形上的点集按变换顺序依次进行计算,计算量较大。如果只对图形进行旋转和缩放两类变换,如先旋转,再缩放,则可以首先将两变换合成一个复合变换,将两次运算转换成一次性的矩阵与向量乘法。这样对图形做上述一系列变换时,只要用点集与这个复合矩阵相乘就可以了。但是如果在变换中再加入平移变换,变换就不容易合并了。这主要是因为平移变换和旋转、缩放变换的表示形式不一样;平移变换为矢量的加法,而旋转和缩放变换为矩阵的乘法。为了使各种变换的表示形式一致,从而使变换合成更容易,有必要引入齐次坐标的概念。所谓齐次坐标表示就是用n +1 维向量表示n 维向量。例如,在二维平面中,点P(x,y)的齐次坐标表示为(wx,wy,w)。这里,w 是任一不为0 的比例系数。类似地,三维空间中坐标点的齐次坐标表示为(wx,wy,wz,w)。推而广之,n 维空间中的一个点(P1 ,P2 ,…,Pn )的齐次坐标为(wP1 ,wP2 ,…,wPn ,w)。这里需要注意的是,用笛卡儿直角坐标表示n 维空间中一个点向量是惟一的。而用齐次坐标表示则是不惟一的。齐次坐标表示法一方面可以表示无穷远点,另一方面用齐次坐标表示,使得所有几何变换都可以用矩阵相乘来表示,获得了平移、旋转和缩放变换的一致性表示,无论哪种变换形式,变换矩阵均可以用一个统一的4 ×4 矩阵来表示。

组合变换:实际应用中对图形作几何变换时往往是多种基本的几何变换组合,因此我们把由若干个基本的几何变换组合而成的一个几何变换的过程称为组合变换。由于引入了齐次坐标,基本几何变换均可以表示成P′=T· P 的形式,因此组合变换的结果是每次的变换矩阵相乘,组合变换同样具有P′=T· P 的形式。

坐标变换:坐标变换是根据图形在一个坐标系下的坐标求出该图形在另一个坐标系下的坐标。当然,在进行坐标变换时必须给出两个坐标系之间的关系。坐标变换是在两个坐标系之间进行的,这时图形是静止的,而坐标系是变动的。

显示变换:图形在计算机内是以数量的形式进行加工和处理的,而坐标则建立了图形和数量之间的联系。三维空间中的物体要在二维的屏幕上显示出来,必须通过投影的方式把三维物体转换成二维的平面图形。投影的方式有平行投影和透视投影两种。往往在图形显示时只需要显示图形的某一部分,这时可以在投影面上定义一个窗口。只有在窗口内的图形才显示,而窗口外的部分则不显示。在屏幕上也可以定义一个矩形,称为视区。经过窗口到视区变换,窗口内的图形才能变换到视区中显示。

图形变换:一般是指将图形的几何信息经过几何变换后产生新的图形。图形变换既可以看做是图形不动而坐标系变动,变动后该图形在新的坐标系下具有新的坐标值;也可以看做是坐标系不动而图形变动,变动后的图形在坐标系中的坐标值发生变化。对于线框图形的变换,通常是以点变换为基础,把图形的一系列顶点做几何变换后,连接新的顶点序列,即可产生新的变换后的图形。对于用参数方程描述的图形,可以通过参数方程几何变换,实现对图形的变换。在图形学中,实现图形变换时通常采用齐次坐标来表示坐标值,这样可方便地用变换矩阵实现对图形的变换。

(1)、图形的几何变换:基本的几何变换研究物体坐标在直角坐标系内的平移、旋转和缩放的规律。按照坐标的维数不同,基本变换可分为二维几何变换和三维几何变换两大类。但对于可用参数表示的曲线、曲面等图形的变换,基于效率的考虑,一般通过对其参数方程做变换来实现对整个图形的变换,而不是逐点进行变换。A、二维图形的几何变换:平移、旋转、缩放。变换矩阵,这三种基本变换公式都可以表示为 3×3 的变换矩阵和齐次坐标相乘的形式。级联变换,一个比较复杂的变换需要连续进行若干个基本变换才能完成,这些由基本变换构成的连续变换序列称为级联变换。B、三维图形的几何变换:平移、旋转、缩放。C、参数图形几何变换:二维、三维图形的几何变换均是基于点的几何变换。对于可用参数表示的曲线、曲面图形,若其几何变换仍然基于点,则计算工作量和存储空间都很大:圆锥曲线的几何变换、参数曲线、曲面的几何变换。

(2)、坐标系统及其变换:

A、坐标系统:几何物体具有很多重要的性质,如大小、形状、位置、方向以及相互之间的空间关系等。为了描述、分析、度量这些特性,就需要一个称为坐标系统的参考框架。从本质上来说,坐标系统自身也是一个几何物体。在图形学中,采用了很多各具特色的坐标系统。以其维度上看,可分为一维坐标系统、二维坐标系统、三维坐标系统;以其坐标轴之间的空间关系来看,可分为直角坐标系统、圆柱坐标系统、球坐标系统等,其中,直角坐标系统尤为常用。另外,在计算机图形学中,为了通过显示设备来考察几何物体的特性,引入了一系列用于显示、输出的坐标系统。a、世界坐标系:该坐标系统主要用于计算机图形场景中的所有图形对象的空间定位和定义,包括观察者的位置、视线等。计算机图形系统中涉及的其他坐标系统都是参照它进行定义的;b、局部坐标系:主要为考察物体方便,独立于世界坐标系来定义物体几何特性。通常是在不需要指定物体在世界坐标系中的方位的情况下,使用局部坐标系。一旦定义了“局部”物体,通过指定局部坐标系的原点在世界坐标系中的方位,经过几何变换,就可以容易地将“局部”物体放入世界坐标系内,使它的参照系统由局部上升为全局;c、观察坐标系:观察坐标系通常以视点的位置为原点,通过用户指定的一个向上的观察矢量(View-UpVector)来定义整个坐标系统,缺省状态为左手坐标系。观察坐标系主要用于从观察者的角度对整个世界坐标系内的对象进行重新定位和描述,从而简化几何物体在投影面的成像的数学推导和计算;d、成像面坐标系统:它是一个二维坐标系统,主要用于指定物体在成像面上的所有点。一般通过指定成像面与视点之间的距离来定义成像面,成像面有时也称投影面,可进一步在投影面上定义名为窗口(Windows)的方形区域来实现部分成像;e、屏幕坐标系统:也称设备坐标系统,它主要用于某种特殊的计算机图形显示设备(如光栅显示器)的表面的点的定义。在多数情况下,对于每一个具体的显示设备,都有一个单独的坐标系统。在定义了成像窗口的情况下,可进一步在屏幕坐标系统中定义名为视图区(View Port)的有界区域,视图区中的成像即为实际所能观察到的。总之,为了在三维空间创建并显示一个(或多个)几何物体,必须首先建立世界坐标系;然后,需要指定视点的方位、视线和成像面的方位。为了观察到物体的成像,还必须在各坐标系之间实现变换之后进行投影变换,才能得到物体的成像。

B、规格化变换与设备坐标变换:在计算机图形学中,世界坐标系和规格化设备坐标系(Normalized Device Coordinate,NDC)是两个同时使用的坐标系统。世界坐标系是设计者描述实际世界中的设计对象所用的坐标系统,其坐标的范围可以是任意大小的。规格化设备坐标系是计算机图形软件描绘设计对象所用的介质。图形硬件不同,设备的坐标系统也不同。例如,有的图形显示器的分辨率只有640×480,而有的则高达1 280×1 024,绘图机的输出分辨率还可以更大。为了使图形软件易于在不同设备之间移植,图形软件并不采用实际的设备坐标,而采用规格化设备坐标。规格化设备坐标定义x方向和y 方向的变化范围均为0~1,从规格化设备坐标到各种图形硬件实际坐标之间的映射由图形软件自动实现。因此,使用图形软件的用户均以规格化设备坐标在各种图形输出与显示设备上作图。世界坐标的范围是无限大的。为了使规格化设备坐标上所显示的世界坐标系中的物体有一个合适的范围与大小,必须首先对世界坐标指定显示范围,它通常是个矩形。在世界坐标系中的这个矩形被称为窗口。其次,在规格化设备坐标系上也要指定一个矩形区域与窗口对应,显示窗口里的内容。在规格化设备坐标系中的这个矩形被称为视区(View Port)。图形软件根据窗口与视区的一一对应关系,自动实现从世界坐标到规格化设备坐标的变换。这种从窗口到视区的变换,称为规格化变换(Normalization Transformation)。

C、投影变换:在计算机图形软件中所采用的笛卡儿(Cartesian)直角三维坐标系统,按照z 轴方向的不同有两种形式。a、右手系统:当用右手握住z 轴时,大拇指指向z 轴的正方向,其余4 个手指从x 轴到y 轴形成一个弧。b、左手系统:当用左手握住z 轴时,大拇指指向z 轴的正方向,其余4 个手指从x 轴到y 轴形成一个弧。在三维坐标系统中,物体上各点都以3 个分量(x,y, z)描述,此物体称为三维物体。若将三维物体描绘在二维平面(如纸面、荧光屏面)上,必须对三维物体投影。投影(project)是一种使三维对象映射为二维对象的变换。投影的要素除投影对象、投影面外,还有投影线。按照投影线角度的不同,有两种基本投影方法:平行投影(Parallel Projection):它使用一组平行投影线将三维对象投影到投影平面上去;透视投影(Perspective Projection):它使用一组由投影中心产生的放射投影线,将三维对象投影到投影平面上去。按照标准线与投影面的交角不同,平行投影分为正交平行投影和斜交平行投影两类。

(3)、图元输出与输出属性:A、二维图元输出:用户使用图形软件时,首先要让计算机知道需要画什么。图元是图形软件用于组织和操作画面的最基本素材。一幅画面由图元组成,图元是一组最简单的、最通用的几何图形或字符。图形软件常用的图元有Line(直线段)、Polyline(折线)、Text(字符串)、Fill area(色块)、Polymarker(符号的轨迹)、Move(现行位置的定位)、Cell Array(像素矩阵)、Circle(圆)。每种图元都有一系列系数描述其性质。在图形软件包中这些参数由两类命令定义。一类是输出图元命令,它描述了图元的种类及其最重要、也是变化最频繁的参数,如直线的端点坐标。另一类是图元性质定义命令,它描述了图元的其余性质,如直线的宽度、线型等。B、输出属性及其控制:a、图元的输出属性:图形软件应提供一组命令分别定义直线、多边形、字符、符号和pattern,即cell-array 的性质。b、属性的组合控制:用上述命令定义图元的性质虽然十分灵活,有时却显得比较麻烦,需要n 条命令才能定义一个图元的n 个性质。采用组合定义,一条命令可以定义基元的一组性质,大大简化了程序的设计工作。c、属性的查询:程序在运行中,有时需要使用图元的性质。因此,设立基本性质查询指令是必要的。性质查询指令的功能,是将基元的某个性质赋给变量返回。C、三维图元的输出:从命令形式上看,在很多图形软件中,三维图元的输出只是在原来二维图元输出命令的基础上增加一个后缀3。

图形输入及交互技术

(1)、逻辑输入设备:图形软件所需的信息从各种各样的图形设备中输入。为了使图形软件包独立于具体的硬件设施,图形输入命令不涉及具体的输入设备,而只涉及该命令所需的数据。根据图形输入信息的不同性质,计算机图形核心系统(Graphics Kernel System,GKS)和程序员层次型交互式图形系统(Programmer’s HierarchicalInteractive Graphics System,PHIGS)把输入设备在逻辑上分成以下几类:A、定位设备(Locator):定位设备指定用户空间的一个位置,如指定一个圆的圆心,指定组装零件的装配位置,指定图上加注文字的起始点,等等。其输入方式包括直接或间接在屏幕上输入,通过方向命令,设置数值坐标,等等。所对应的物理设备包括光笔、触摸屏、数字化仪、鼠标、操纵杆、跟踪球、键盘的数字键等。B、描画设备(stroke):描画设备指定用户空间的一组有序点的位置,如指定一条折线的顶点组、指定一条自由曲线的控制点等。其输入方式与对应的物理设备同定位设备的关系相一致。C、定值设备(Valuator):定值设备为应用程序输入一个值(实数),如在旋转某一对象时输入一个旋转角度、缩放对象时输入一个比例因子以及输入文字高度、字体大小比例因子等。其输入方式包括直接输入数值、通过字符串取值、通过比例尺输入、执行上下计数控制命令等。对应的物理设备包括旋钮、键盘、数字化仪、鼠标、方向键、编程功能键等。D、选择设备(Choice):选择设备为应用程序在多个选项中选定一项,如选择菜单以确定目标。其输入方式包括直接或间接在屏幕上进行、字符串选择、时间扫描、手写输入、声音输入等。其对应的物理设备包括光笔、触摸屏、数字化仪、鼠标、操纵杆、跟踪球、字符串输入设备、编程功能键、声音识别仪。E、拾取设备(Pick):拾取设备在处理的模型中选取一个对象,从而为应用型操作处理确定目标。其输入方式包括直接在屏幕上选取、时间扫描、字符串选取。其对应的物理设备包括各种定位设备、编程功能键、字符串输入设备。F、字符串设备(String):字符串设备向应用程序输入字符串,如为某对象确定名字、为某图纸输入加注文字等。其输入方式包括键盘输入、手写输入、声音输入、菜单输入。所对应的物理设备有字母键盘、数字化仪、光笔、声音识别仪、触压板等。

(2)、图形输入控制:在交互输入过程中,常用的控制方式是请求、采样、事件及其组合形式等四种。在用六种逻辑输入设备设计交互系统时,应用程序必须指定用于输入数据的物理设备及其逻辑类型,其他参数取决于输入数据。在应用程序和输入设备之间,输入控制的方式是多样的,这些方式又取决于程序和输入设备之间是如何相互作用的。例如,可用程序来初始化输入设备,或者程序与输入设备同时工作,或者由设备初始化输入数据。这三种工作方式即与请求、采样、事件方式相对应。

(3)、交互技术:指使用输入设备进行输入的技术。为了帮助操作员完成某种输入操作,计算机应在输入的过程中显示某些反映操作的信息(称为反馈)。例如,在执行定位操作时,屏幕上的游标随着操作员施加在定位设备上的动作移动,以便让操作员了解光标目前的位置。A、定位技术:定位是图形输入和图形操作时常用的输入操作之一。例如,为了画一个圆要确定圆心和圆上一点的位置,拼装部件时要确定拼装位置,等等。定位有直接定位和间接定位两种方式。直接定位指使用定位设备直接在屏幕上指定一个点的位置。例如,使用触摸屏幕时,可直接用手在屏幕上指定一个点的位置,或用光笔在屏幕上指定一个点。间接定位指通过定位设备的运动控制屏幕上的映射光标进行定位。例如,使用数字化仪时,定位触头在数字化仪上的位置坐标映射到屏幕上的光标坐标。B、橡皮条技术;C、拖拽技术;D、菜单技术;E、定值技术;F、拾取技术;G、网格与吸附技术;

(4)、三维图形输入。

图形数据结构

(1)、图段:现实世界中对象的形状往往是复杂的,需要若干个基本元素的组合才能予以表达。而对于一个对象中的各个基元,又需要施加同一操作,如移动、旋转、缩放等,才能构成画面,准确地表达对象与对象之间的空间关系。为此,图形学软件在输出基元和画面之间设置一个中间数据结构,称为图段(Segment)。图段由若干个基元组成,是比基元更高一层的输出对象,也是几何变换等操作的对象。图段是由一组输出基元和一组性质(Attribute of Segment)所构成的集合。A、图段的操作:图段的操作可以分为三类,即图段的建立、图段的删改和图段性质的定义。

(2)、结构:结构是由图形数据和应用数据组织在一起的一个整体,它是程序员层次型交互式图形系统(Programmer’s HierarchicalInteractive Graphics System,PHIGS)国际图形标准模型所操作处理的基本单位。构成结构的基本的数据实体称为“结构元素”(Structure Element),所以,结构是由一系列结构元素组成的。结构元素用来表示应用问题所需要的各种几何与非几何数据,如图形输出原语、属性选择、观察选择、建模变换、建模裁剪、名字组等,也可以用来表示各种应用数据(如材料、单价等)。

(3)、建模操作:所谓模型(Model),指的是被研究的对象(实际或抽象)的一种表示或描述。它不仅仅是为了产生该对象的图形,而且还研究它们的结构、特性和行为。模型构造也简称为“建模”(Modelling),它指的是建立并对模型进行各种处理操作的过程。具有模型的建立、修改、存储、检索以及其他各种操作处理功能的软件往往称为“建模系统”。

真实感图形的生成技术:计算机图形学能够绘制高度真实感的物体,还能绘制真实世界里看不到的事物(例如火山内部的景象,想象中的木星表面,或者住院病人的头颅内部)。程序员通过程序中的某些算法描绘感兴趣的物体,然后程序通过该模型生成图片。计算机图形学的主要任务就是制作图片和图像,并基于计算机的某种描述或模型合成它们。

真实感图形绘制就是借助数学、物理、计算机等学科的知识在计算机二维显示屏上产生三维场景的真实逼真图像、图形的过程。在计算机图形设备上生成真实逼真的图像、图形需要经过以下4 个步骤:(1)、构造各个物体的数学描述。物体可以由基本的几何要素构成,如点、线、多边形等;(2)、将各个物体安放在给定参考坐标系的三维空间中适当位置处,由此构成场景,并且选择所期望的观察场景的视点、视方向、视域;(3)、给出各个物体的颜色信息。物体的颜色可以显式地指定,也可以由特定的光照条件决定,还可以通过向物体粘贴纹理来获得;(4)、将各个物体的数学描述和它们相关的颜色信息转化为屏幕上的像素信息。这个过程称为光栅化。为了使光栅化后生成的图形具有真实感,在这个过程中应该将被其他物体遮挡的不可见面(线)消隐,并且可见面的颜色应该由光照条件决定,即根据基于光学物理的光照模型计算可见面投射到观察者眼中的光亮度大小。为了使绘制的图形更接近自然景物,可以在应用光照模型时将特定的花纹图案映射到物体的表面。在应用光照模型时还可以根据物体的表面是否位于阴影区内来改变相应光源的光照效果,从而使得最终生成的图形具有阴影的效果。

图形反走样技术:在光栅显示器上显示直线段或曲线段时,显示出来的直线段、曲线段总是或多或少地呈现锯齿状。究其原因在于直线段、曲线段本身是连续的,而光栅设备是离散的,即它只有有限个像素,为了用这有限个像素表示连续的直线段、曲线段就必须对直线段、曲线段进行采样,最终在光栅显示器上表示直线段或曲线段的只是一个个离散的有一定面积的像素。这种用离散量表示连续量引起的失真现象称之为走样(aliasing)。用于减少或消除这种失真现象的技术称为反走样(antialiasing)。光栅图形的走样现象除了锯齿状的边界外,还有图形细节失真(图形中的那些比像素更窄的细节变宽),狭小图形遗失等现象。一般地,只要在生成图形时采用点采样技术,都会导致图形走样现象发生。因此从根本上说,反走样的方法有两种,一种是提高采样率,也即提高屏幕分辨率。由于屏幕分辨率的提高受光栅显示器硬件条件的诸多限制,因此通常的办法是以高于显示分辨率的精度对画面进行计算,然后以某种方式取平均获得低分辨率的显示图像。另一种方法是把像素看成一个区域,而不是一个点,进行区域采样。

OpenGL介绍:OpenGL 是图形硬件的一个软件接口, 是国际上通用的开放式三维图形标准。它提供了一个标准的计算机图形学所使用的数学模型到显示的接口, 应用非常广泛。OpenGL( open graphics library, 开放性图形库) 是以SGI 的GL 三维图形库为基础制定的一个开放式三维图形标准。SGI 在1992 年7 月发布了1. 0 版。OpenGL 规范由ARB( OpenGL architecture review board, OpenGL 结构评审委员会) 负责管理, 目前加入OpenGL ARB 的成员有SGI、Microsoft、Intel、IBM、Sun、Compaq 和HP 等公司, 它们均采用了OpenGL 图形标准, 许多软件厂商以OpenGL 为基础开发自己的产品, 硬件厂商提供对OpenGL 的支持。由于OpenGL 的广泛应用, 它已经成为一个工业标准。OpenGL独立于硬件设备、窗口系统和操作系统, 使得以OpenGL 为基础开发的应用程序可以在各种平台间移植。OpenGL 可以运行在当前各种流行操作系统之上, 如Windows 95 /98、Windows NT/2000、Linux、Mac OS、UNIX 和OS /2 等。需要特别指出的是,由于Microsoft 公司在其Windows 95 或更高版本的操作系统和Visual 系列高级语言开发环境中捆绑了OpenGL 标准, 使得OpenGL 在微机中得到了更为普遍的应用。OpenGL 可以用各种编程语言调用。各种流行的编程语言如C、C ++ 、FORTRAN、Ada和Java 等都可以调用OpenGL 中的库函数。

OpenGL的主要功能:OpenGL 可以绘制各种简单的三维物体, 也可以高效地生成交互的复杂动态场景, 它有如下主要功能:

(1)、绘制模型:OpenGL 图形库提供了绘制点、线及多边形的函数, 应用这些基本几何图形可以绘制出用户需要的三维模型。另外, OpenGL 图形库还提供了球、锥、多面体和茶壶等复杂的三维物体以及贝塞尔和NURBS 等复杂曲线曲面的绘制函数;

(2)、各种变换: 在现实世界中, 所有的物体都是三维的, 因此, OpenGL 通过一系列的变换来实现将三维的物体显示在二维的显示设备上。OpenGL 图形库提供了基本变换和投影变换。基本变换有平移、旋转、变比(缩放)和镜像4种变换, 投影变换包括平行投影和透视投影两种。在算法上, 它们是通过矩阵操作来实现的;

(3)、着色模式: OpenGL 提供了两种颜色的显示方式, 一种是RGBA模式, 另一种是颜色索引方式。在RGBA 模式下, 每一像素的颜色值由红、绿、蓝色值和可能存在的A值来描述。在颜色索引模式下, 每个像素的颜色值由颜色索引表中的颜色索引值来指定, 颜色索引表是一个定义了R、G和B值的特定集合;

(4)、光照处理:在自然界我们所见到的物体都是由其材质和光照相互作用的结果,OpenGL 提供了辐射光( emitted light)、环境光( ambient light)、漫反射光( diffuse light)和镜面光( specular light) 。材质是指物体表面对光的反射特性,在OpenGL 中用光的反射率来表示材质;

(5)、纹理映射( texture mapping):纹理是数据的简单矩阵排列, 数据有颜色数据、亮度数据和alpha 数据。OpenGL 应用纹理映射将真实感的纹理粘贴在物体表面, 使物体逼真生动;

(6)、位图和图像:OpenGL提供了一系列函数来实现位图和图像的操作。位图和图像数据均采用像素的矩阵形式表示。位图主要应用于各字体中的字符,只保存像素的信息, 可以用于遮盖其他图像, 类似于掩码。图像可通过扫描和计算得到,图像数据包含每一像素的多个信息。位图和图像数据可以在屏幕和内存间进行传递;

(7)、制作动画:OpenGL 提供了双缓存( double buffering)技术来实现动画绘制。双缓存即前台缓存和后台缓存, 后台缓存用来计算场景和生成画面, 前台缓存用来显示后台缓存已经画好的画面。当画完一帧时, 交互两个缓存, 这样循环交替以产生平滑动画;

(8)、选择和反馈:OpenGL为支持交互式应用程序设计了选择操作模式和反馈模式。在选择模式下, 则可以确定用户鼠标指定或拾取的是哪一个物体, 可以决定将把哪些图元绘入窗口的某个区域。而反馈模式, OpenGL把即将光栅化的图元信息反馈给应用程序, 而不是用于绘图。此外, OpenGL 还提供了点、线及多边形的反走样技术, 能够实现深度暗示(depthcue)、运动模糊(motion blur)和雾化(fog)等特殊效果。

OpenGL的绘制流程和原理:OpenGL 的绘制主要是将二维或三维的物体模型描绘至帧缓存, 这些物体由一系列的描述物体几何性质的顶点( vertex) 或描述图像的像素( pixel)组成。OpenGL 执行一系列的操作把这些数据最终转化为像素数据并在帧缓存中形成最后的结果。OpenGL 指令从左侧进入OpenGL, 有两类数据, 分别是由顶点描述的几何模型和由像素描述的位图、影像等模型, 其中后者经过像素操作后直接进入光栅化。评价器(evaluator) 用于处理输入的模型数据, 例如对顶点进行转换、光照, 并把图元剪切到视景体中, 为下一步光栅化做好准备。显示列表(display list)用于存储一部分指令,留待合适时间以便于快速处理。光栅化将图元转化成二维操作, 并计算结果图像中每个点的颜色和深度等信息, 产生一系列图像的帧缓存描述值, 其生成结果称为基片( fragment)。基片操作主要的有帧缓存的更新、测试、融合和屏蔽操作, 以及基片之间的逻辑操作和抖动(dithering) 。

在OpenGL 中, 除了描述顶点的属性信息外, 还有许多其他的状态变量,OpenGL 将根据具体的参数值来决定如何绘制图形、如何显示图形和如何处理错误。它们的使用规则一致,当设置了其状态值后, 如果不重新设置与之相对应的状态值,那么所设置的状态值将一直有效。

OpenGL的缓冲区:OpenGL需要用到4个缓冲区进行图形显示,它们分别是:颜色缓存、深度缓存、模板缓存和累积缓存:

(1)、颜色缓存:颜色缓存是由红、绿、蓝、alpha 位等位平面(bitplane)组成的,有前缓存(front buffer)、后缓存(back buffer)、左前( front_ left) 和右前(front _right)缓存、左后(back _left)和右后(back_right)缓存。左前缓存是必需的颜色缓存。前缓存是可见缓存,后缓存是不可见缓存。前后缓存技术可以实现动画操作。与颜色缓存相关的主要函数有:A、清除颜色缓存:glClear(GL_COLOR_BUFFER_BIT),用于清除当前显示缓冲区内容, 为开始新的绘制做好准备;B、设置清除颜色:glClearColor(red, green, blue, alpha),用当前颜色(red, green,blue, alpha) 清除当前显示缓冲区内容,为开始新的绘制做好准备;C、屏蔽颜色缓存:glColorMask(),分别设置红、绿、蓝和alpha 的可写属性;D、选择颜色缓存:glDrawBuffer(),用于对双缓存中一个进行选择;E、交换颜色缓存:swapBuffer( ),交换前后缓存中的颜色,以实现动画。

(2)、深度缓存:深度缓存也叫Z-buffer,它记录每个像素点所对应的物体点到视点的距离, 由此决定表面的可见性。在进行消隐的时候,OpenGL必须知道各物体间的相对位置关系, 从而模拟出物体相互遮挡的效果,因此,需要进行深度测试。而深度测试的结果就生成了深度缓存。与深度缓存相关的OpenGL操作主要有:A、清除深度缓存:glClear(GL_DEPTH_BUFFER_BIT) ,用于清除当前显示缓冲区内容, 为开始新的绘制做好准备;B、设置清除值:glClearDepth(1.0);C、屏蔽深度缓存:glDepthMask(GL_TRUE),表示可以写深度缓存;glDepthMask(GL_FALSE),表示禁止写深度缓存;D、启动和关闭深度测试:glEnable(GL_ DEPTH _ TEST),表示开启深度测试;glDisable(GL_DEPTH_TEST),表示禁止深度测试;E、确定测试条件:glDepthFunc() , 根据函数参数确定测试方式, 具体的参数说明请参考OpenGL 手册;F、确定深度范围:glDepthRange(GlclampdzNear, Glclampd zFar),参数zNear 和zFar 分别说明视景体的前景面和后景面向窗口坐标映射的规格化坐标, 便于后续使用。

(3)、模板缓存:模板缓存和累积缓存主要用于图形的特殊效果绘制。模板缓存存放像素的模板值。可用于控制像素是否被改写, 因而其可以禁止在屏幕的某些区域绘图。模板缓存可以用于多种复杂图形的绘制, 例如, 屏蔽屏幕区域(凸区域或凹区域, 因而也可以绘制凹多边形等);遮盖物体; 制作物体的交集等。

(4)、累积缓存:顾名思义, 累积缓存是一系列绘制结果的累积,可以用来实现场景的反走样、景深模拟和运动模糊等。例如为了实现全局反走样, 可多次绘制场景, 每次绘制时轻微移动场景(相当于在空间上抖动场景),把多次绘制的结果进行累积并最后一次输出, 结果场景的边界会变得模糊, 从而实现全局反走样。

用OpenGL生成基本图形:OpenGL提供了描述点、线、多边形的绘制机制。它们通过glBegin()和glEnd()函数配对来完成。

(1)、glVertex2f()函数用于定义二维点,其后的参数是点的坐标;

(2)、可以使用glPointSize()函数来定义点在屏幕上的显示大小(甚至还可以对点进行反走样处理);

(3)、可以使用glLineWidth()来设置直线的宽度;

(4)、使用glLineStipple()函数来绘制点划线;

(5)、可以使用glPolygonStipple()函数来填充区域。多边形面的绘制:如果多边形是三维的,则在OpenGL中,每个多边形被认为是由两个面组成的:正面和反面。在绘制时,需要控制反转多边形面和剔除不绘制的面。此外,有时多边形还需控制边界线的绘制;

(6)、可以使用glPolygonMode()函数来选择多边形的正反面;

(7)、默认时,在屏幕上以逆时针方向出现定点的多边形称为正面,反之为背面,也可以使用glFrontFace()函数自行设置多边形的正面方向;

(8)、由一致方向的多边形构成完全闭合的曲面, 其背面多边形总是被正面多边形所遮挡。因此, 通过OpenGL 确定为背面时剔除这些多边形, 可以极大地提高几何体的绘制速度。同样, 如果处在几何对象内部, 只是背面多边形是可见时, 则剔除正面多边形。利用函数glCullFace( ),选择剔除(cull)正面或背面多边形, 在这之前需利用glEnable( )激活剔除处理;

(9)、多边形面的法向量:法向量是垂直于面的方向上点的向量。在平展的面上,各个点有同一个方向; 在弯曲的面上, 各个点具有不同的法向量。几何对象的法向量定义了它在空间中的方向。在进行光照处理时, 法向量是一项重要的参数, 因为法向量决定了该对象可以接收多少光照。与法向量有关的操作有两类, 分别是: 指定法向量和计算法向量。A、利用函数glNormal*( )设置当前法向量,用glNormal*( )指定的法向量不一定为单位长度。如果利用命令glEnable(GL_NORMALIZE)激活自动规格化法向量, 则经过变换后,就会自动规格化glNormal*( )所指定的法向量。利用glNormal*( )设置当前法向量后,相继调用glVertex*( ),使指定的顶点被赋予当前的法向量。当每个顶点具有不同的法向量时, 需要有一系列的交替调用。B、OpenGL并不能自动地计算几何对象的法向量,而只能是由用户显示地指定。法向量的计算是一个纯碎的几何和数学问题;

(10)、用OpenGL生成字符:A、生成英文字体:在OpenGL中有3种渲染字体的方法:位图、画轮廓(多边形)及纹理映射。每个方法有自己的优点与缺点。a、位图字体:对于处理场景中独立旋转及缩放的标题而言, 位图字体是比较理想的选择。从本质上说, 它是预先光栅化, 所以渲染速度比较快, 使用它们对提高程序执行速度是显而易见的。位图字体的定位由glRasterPos( )决定。b、轮廓字体:轮廓字体主要用于描述带控制点及曲线集合的字符特征。可以用下列渲染方法对多边形(或轮廓)进行填充。具体操作与OpenGL 里处理多边形是一致的。它们包括:旋转、平移、缩放( rotate、translate、scale);颜色、材质、光照( color、material、lighting);反走样( antialiasing);纹理映射( texture mapping)。轮廓字体对创建拉伸效果很有帮助。c、纹理映射字体(texture mappedtext):它是用纹素来表现正文字符, 例如对字符串的处理使用与OpenGL 纹理映射相同的操作。此项技术主要实现街道、水塔墙面上的标记等。使用wglUseFontBitmaps()将ASCII字符装入显示列表,然后使用glCallLists()函数利用显示列表序列显示文本。B、生成中文字体:在OpenGL 中使用中文字体的基本思想是:a、用wglUseFontOutlines 或wglUseFontBitmaps 为每个字生成一个List;b、为每个字调用glCallList( )或为一个字串调用glCallLists( )。具体来说, OpenGL 设计时考虑了非ASCII 字符集文字的需求,在OpenGL 中使用汉字是没有问题的。

OpenGL的颜色缓冲区:OpenGL 提供两种颜色模式: RGB( RGBA)模式和颜色索引模式。在RGBA 模式下所有颜色的定义用R、G、B 3个值来表示,有时也加上Alpha值(表示透明度)。RGB 3个分量值的范围都在0 1 之间,它们在最终颜色中所占的比例与它们的值成正比。如:( 1 , 1, 0)表示黄色,( 0, 0, 1 ) 表示蓝色。颜色索引模式下每个像素的颜色是用颜色索引表中的某个颜色索引值表示(类似于从调色板中选取颜色)。由于三维图形处理中要求颜色灵活, 而且在阴影、光照、雾化和融合等效果处理中RGBA的效果要比颜色索引模式好, 所以, 在编程时大多采用RGBA 模式。实际使用时, OpenGL 在显示缓冲区中存储了其他图形的绘图信息, 所以必须清除当前的这些内容, 以免影响绘图的效果, 可以用函数glClearColor,设置当前屏幕的背景颜色,也可以使用函数glClear(mask)清除标志的缓冲区。注意, 这个函数还可以清除其他缓冲区,由参数mask来控制也可以使用glClearColor( )、glClearDepth( )、glClearIndex( )、glClearStencil( )和glClearAcc( )为各自对应的缓冲区赋值。若要同时清除多个缓冲区, 使用mask位的“ 或”(OR)组合,在速度上要比使用多次调用glClear 函数要快得多。在绘制图形前,通常要先设定颜色或颜色方式,这样有利于达到较高的绘图性能。设置颜色的常用命令是: glColor* ( )。相邻顶点之间的部分也会有颜色, 实际上OpenGL 会在顶点之间进行插值分割,最终计算出对应光栅每一点的颜色,这个计算结果就是最终显示在屏幕上的图像。

OpenGL坐标变换机制:OpenGL中的多数变换均对应于相应的变换矩阵,可以说OpenGL就是实现将物体的各个顶点通过各种变换矩阵的作用映射到屏幕上的过程。因此,在OpenGL中提供了一些必不可少的矩阵及矩阵操作命令。其中与变换有关的矩阵有ModeView矩阵、Projection矩阵。Projection矩阵描述了怎样从三维空间变换到屏幕坐标,而ModeView矩阵则描述了物体旋转、平移、缩放等变换。在调用变换命令之前,需要声明其后矩阵操作的对象,可以用命令glMatrixMode(GLenummode)定义。

OpenGL对图形交互的支持:(1)、用OpenGL的反向坐标变换实现三维坐标输入;(2)、用OpenGL缓冲区技术实现橡皮筋功能。

用OpenGL生成真实感图形:利用OpenGL提供的函数可以方便地实现图形绘制过程中的隐藏面消除,以及物体表面亮度的光照计算,还可以实现纹理映射,从而生成具有真实感的图形。

4种主要的OpenGL库:(1)、基本GL库:OpenGL库的基础,它提供OpenGL的基本函数,每个OpenGL函数都以字符GL开头;(2)、GLUT库:GL实用工具包(the GLUtility Toolkit),它主要用来打开窗口、开发和管理菜单,以及管理事件等;(3)、GLU库:GL实用库(the GLUtility Library),它提供高级例程,处理矩阵操作和绘制二次曲面如球和圆柱体。GLU库也提供将非凸和非简单多边形分解成简单形状(如三角形)的实用函数(基本的OpenGL处理不好这些操作)。它还在别的方面为简化程序员的工作提供帮助;(4)、GLUI库:用户接口库(theUser Interface Library),只要使用GLUT,GLUI就将适当地运行。GLUI为OpenGL程序提供了良好的控制工具和菜单。

OpenGL的基本图形元素:(1)、OpenGL数据类型:GLbyte、GLshort、GLint、GLsizei、GLfloat、GLclampf、GLdouble、GLclampd、GLubyte、GLboolean、GLushort、GLuint、GLenum、GLbitfield;(2)、OpenGL状态:OpenGL是由许多状态变量组成的状态机,这些状态包括点的大小、绘图的颜色和屏幕窗口大小等。在给定新值之前,状态变量的值一直保持不变;(3)、OpenGL中的其他图形元素:除了点、线和多边形,OpenGL还支持绘制五种其他元素,为了绘制其中某个元素,需要在使用glBegin()时指定下列参数:A、GL_TRIANGLES:一次使用3个顶点,每次绘制一个独立的三角形;B、GL_QUADS:一次使用4个顶点,每次绘制一个独立的四边形;C、GL_TRIANGLE_STRIP:基于3个一组的顶点v0,v1,v2;然后是v1,v2,v3;接着是v2,v3,v4,依次递推,绘制一系列三角形(按同样的顺序,即逆时针方向,遍历所有的三角形);D、GL_TRIANGLE_FAN:基于3个一组的顶点v0,v1,v2;然后是v0,v2,v3;接着是v0,v3,v4;依次递推,绘制一系列与v0相连的三角形;E、GL_QUAD_STRIP:基于4个一组的顶点v0,v1,v3,v2;然后是v2,v3,v5,v4;接着是v4,v5,v7,v6.依次递推,绘制一系列四边形(按同样的顺序,遍历所有的四边形,如逆时针方向)。

OpenGL被设计成与硬件无关

两种最令人感兴趣的高级着色语言是OpenGL着色语言和Cg,这两种语言非常相似,但具有不同的目标用户。

OpenGL着色语言(OpenGL Shading Language, GLSL),是OpenGL的一个标准部分,可以用来开发各种各样的用于计算顶点位置和颜色等属性的顶点着色器。还设计了片元着色器,可以用它来编写程序对每个片元进行计算,并最终计算出每个像素的颜色。OpenGL着色语言是一个类似于C语言语法的高级语言,程序员可以用它编写顶点着色器和片段着色器。

顶点程序(vertex program)或顶点着色器(vertex shader)将使用其自定义的运算操作代替由顶点处理器执行的固定功能的运算操作。如果应用程序没有提供顶点程序,那么可编程的顶点处理器就会执行OpenGL固定功能顶点处理器中的标准运算操作。

使用GLSL语言编写的片元程序与顶点程序具有相同的语法。然而,片元程序在光栅器之后执行,因此它们处理的对象是每个片元而不是每个顶点。

使用GLSL语言编写的着色器是独立于任何OpenGL应用程序的。虽然目前有各种各样的开发环境可供用户编写和测试着色器,但在某些时候,必须把着色器与OpenGL应用程序连接起来才能运行。有一组OpenGL函数专门用来处理这样的连续工作,包括如何创建顶点对象和着色器对象,如何将这些对象与OpenGL应用程序进行连接,以及利用变量在OpenGL应用程序与着色器直接传送数据。通常使用以下8个步骤来对应用程序中的一个或多个着色器进行初始化:(1)、将着色器读入内存;(2)、创建一个程序对象;(3)、创建着色器对象;(4)、把着色器对象绑定到程序对象;(5)、编译着色器;(6)、将所有的程序连接起来;(7)、选择当前的程序对象;(8)、把应用程序和着色器直接的uniform变量及atrribute变量关联起来。

OpenGL的一个主要特性就是它的API非常稳定,每个版本都兼容其前面的版本

个别的硬件供应商通过提供新的OpenGL函数供用户访问硬件特性,但这些函数可能只在某些特定制造商提供的图形硬件产品中才能正常工作,供应商是通过OpenGL的扩展函数名来识别的。例如,一个具有类似glCommandNV的扩展名表示该函数是由NVIDIA公司提供的。其它硬件制造商在他们的硬件上也能实现同样的扩展。那些被广泛使用的扩展在得到OpenGL结构评审委员会(Architectural Review Board,ARB)认可后被命名为ARB扩展。

以上内容摘自:

1、《计算机图形学:原理、方法及应用》,高等教育出版社,2003

2、《计算机图形学》,清华大学出版社,2005

3、《计算机图形学(OpenGL版)第3版》,清华大学出版社,2009

4、《计算机图形学(第三版)》,电子工业出版社,2010

5、《交互式计算机图形学—基于OpenGL的自顶向下方法(第五版)》,电子工业出版社,2009

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值