当前位置 > 信息中心 > 技术交流
三维图形标准OpenGL
1. 三维图形标准
进入二十世纪九十年代,人们开始告别二维平面绘图时代,三维立体绘图逐渐成为图形学应用的主流。与此同时,三维图形标准也应运而生,经过时间的磨练,在众多的三维绘图标准之中,只有OpenGL和DirectX脱颖而出,成为两大三维图形应用程序接口(Application Programming Interface,API)标准。
(1)OpenGL
OpenGL的前身是SGI公司为其图形工作站开发的IRISGL。IRISGL是一个工业标准的3D图形软件接口,英文全称是“Open Graphics Library”即“开放的图形程序接口”。OpenGL 1.0于1992年7月由SGI公司发布,从而使一些原来必须在高档图形工作站上运行的大型3D图形处理软件也可在微机上运行。由于OpenGL一开始就被设计成独立于硬件和操作系统的3D API,所以OpenGL不受制于操作系统的种类,可以运行在不同操作系统的各种计算机上,并能在网络环境下以客户/服务器模式工作。而且,OpenGL在三维图形变换方面有着得天独厚的优势,这样,它自然而然地成了专业图形处理、科学计算等高端应用领域的标准图形API,现今广为流行的三维工程绘图软件大都以它为支持,如AutoCAD,Pro/E,UG,SolidEdge,3DS MAX等。由于这些软件的成功,赋予了OpenGL更强的生命力。不仅如此,在3D游戏和多媒体的开发上,它也有不俗的表现。它的第一个版本主要是作为3DS MAX的API而开发,所以它与3DS MAX软件有着良好的融合性。
目前,包括Microsoft,SGI,IBM,DEC,SUN,HP等几家在计算机市场占主导地位的大公司都采用了OpenGL作为三维图形标准,许多软件厂商也纷纷以OpenGL为基础开发自己的产品,其中比较著名的制作软件Soft Image和3DStudioMAX、仿真软件Open Inventor,VR软件World ToolKit,CAM软件Pro Engineer,GIS软件ARC/INFO等等。因此,OpenGL目前己经成为了三维图形制作中事实上的工业标准。
(2)DirectX
DirectX出现的较晚,它是随着Windows操作系统的推广使用而产生的。起初,DirectX的魅力一直没有得到表现,但因为它是微软的产品,有雄厚的实力作支持,并且,它避开OpenGL优势,将目标锁定在3D游戏和多媒体的开发上,到2002年底DirectX 9.0问世时,DirectX在3D游戏和多媒体的开发上己是后来居上,超过了OpenGL。但在专业图形处理特别是高端应用方面目前还没有出现以DirectX技术为基础的例子。
用3DS MAX进行设备建模,再使用DirectX导入VC++开发环境。DirectX对3DS MAX生成的模型提供了很好的支持。将模型借助外挂程序输出成DirectX识别的3.x文件,在DirectX中载入并渲染。Direct3D功能控制库定义了Direct3D多边形网格类型ID3DXMESH,来表示复杂的三维物体模型,它是一个COM对象接口,提供的函数接口可实现复杂模型的渲染。函数D3DXCreateMesh()能够创建一个DirectX3D多边形网格对象。
2. OpenGL图形接口
由于Microsoft公司在Windows NT和Windows 95中提供了OpenGL图形标准,OpenGL己经在微机中广泛使用,尤其是OpenGL三维图形加速卡和微机图形工作站的推出,人们可以在微机上实现CAD设计、仿真模拟、三维游戏等,从而为广大用户提供了在微机上使用以前只能在高性能图形工作站上运行各种软件的机会。
1OpenGL的特点
OpenGL是一个工业标准的三维计算机图形软件接口。它主要有以下特点:
①     OpenGL可以在网络上工作,即客户机/服务器模式,显示图形的计算机(客户机)可以不是运行图形程序的计算机(服务器)。客户机和服务器可以是不同类型的计算机,只要两者服从相同的协议即可。
②     OpenGL是与硬件无关的软件接口,可以在多种硬件平台上运行,应用程序有良好的移植性。OpenGL支持多种图形文件格式,如3DS、Obj、WRL和ASE等。
③     用户可以方便地利用OpenGL图形库创建出接近光线跟踪的高质量静止或动画的三维彩色图像,并且由于采用了双缓存技术,其速度要比光线跟踪算法快一个数量级。
OpenGL提供了基本图元和较为复杂的图元的绘图方式,主要包括点、线、三角形以及简单的凸多边形。对于其他形状,例如凹多边形和圆弧,则需要程序员通过各种算法自己实现。对于任何一个图元都可以进行颜色和纹理的渲染,而对于面图元还可以指定每一面的颜色和纹理。OpenGL提供了很多着色技术,默认的是平滑着色技术,通过颜色插值算法,能够精确显示丰富的色彩。OpenGL还提供了多种纹理渲染方式,纹理可以通过程序员定义简单的纹理或者采用色彩丰富的图片作为纹理的方式提供给OpenGL。
动画并不是OpenGL技术本身能够实现的,它需要程序员负责提供具体的动画数据并负责显示出来。根据传统的动画产生方式,以一定的帧频连续显示一系列相关的画面就形成了视觉上连续的动画。OpenGL在技术上提供了动画显示的可能:利用回调方法,可以连续更新显示画面,只要能够提供需要的一幅幅“图画”就可以了。
④     OpenGL实际上是一种图形与硬件的接口,它包括了众多的图形操作函数,开发者可以利用这些函数建立三维模型并进行实时交互。与其他的图形程序设计不同,它提供了十分清晰明了的函数,是一个高性能的图形开发软件包,包括建模、变换、光线处理、色彩处理、动画处理映射和物体运动模糊效果等,在性能上表现十分优越。OpenGL强有力的图形函数不要求开发者将三维物体模型写成固定的数据格式,可以利用不同格式的数据源,具有很大的灵活性。
⑤     照相机模型。  事实上,计算机显示屏只能进行2D显示,所谓的3D图形技术主要是通过构建事物在3D空间中的位置和形状,并通过与用户交互,可以从多角度展示该空间,使用户感觉到这个真实的3D空间的存在。由此可见,3D技术确实构建了一个三维的世界,但只能通过显示屏看到其一个方向的视图,而为了实现3D到2D的转换,OpenGL使用了一个模型,通常称为照相机模型。在这个模型中,定义了一个矩形窗口,称为剪裁窗口,在这个窗口之内的事物是可见的。而在OpenGL中,视点默认为无穷远处。
⑥     坐标系。  在计算机图形处理中,任何图元都和坐标密切相关,这就需要一个坐标系作为统一的标准。一般使用的有到两种坐标系:一种为“对象坐标”或“世界坐标”,另一种为“窗口坐标”或“屏幕坐标”。前一种坐标系得表示形式灵活,可以有任意的数值、单位;后一种坐标系是以像素为单位,其数值必须是硬件设备可以显示的允许范围。
OpenGL采用的是对象坐标,但做出了一定的限制,具体如下:应用程序的窗口为整个坐标系的可见范围,其X、Y方向的可见范围是(-1,1),超过这一范围将不可见;Z方向的可见与否取决于远近裁剪平面和对象的相对位置;这个坐标系是没有单位的。对于当前不可见的部分,可以通过平移、缩放、旋转来进行显示,这样就可以多角度、多距离的全面显示真实的3D“世界”了。
图形坐标变换技术在OpenGL中也有两种实现方式,一种是利用OpenGL提供的函数,这种方法简单,不需要很多数学和图像理论知识;另一种是由程序员自己构建矩阵,用于图形的变换,这种方法就较为有难度,适于有一定经验的程序员。
2OpenGL函数库
OpenGL其实就是由几个图形函数库组成的,这些函数库被作成动态链接库的形式,嵌入在Windows操作系统中,各函数库如表1.11所示。
1.11  OpenGL函数库
名称
前缀
数量(个)
说明
核心函数库GL
gl
115
提供了基本的绘图命令,用来描述几何体形状、矩阵形状,进行光照、纹理、雾化和反走样处理等。
实用函数库GLU
glu
43
是比核心函数具有更高级功能的函数,如绘制复杂曲面、多边形分割、坐标变换和错误处理等。
辅助函数库GLAUX
glu
31
是一类特殊的OpenGL函数,其功能为窗口管理、事件处理和绘制复杂三维物体。
Windows函数库WGL
wgl
6
用来管理显示列表、字体位图、绘制描述表
Win32API函数库
专用
5
用来处理像素格式及缓冲。
工具函数库GLUT
glut
 
是OpenGL的实用工具箱,需要从网上下载并安装在自己的系统上才能使用。
3OpenGL的功能
OpenGL能生成真彩的三维场景,从绘制简单的3D物体到交互的动态场景,OpenGL都能高效率地完成这些工作,具体地说,OpenGL的功能如下:
①     几何建模:OpenGL不仅提供了绘制点、线、多边形等基本形状的函数,还提供了绘制复杂三维曲线、曲面(如球面等)和三维形体(如球、锥体和多面体等)的函数。应用这些函数可构造出几乎所有的三维模型。
②     坐标变换:顶点、法线和纹理坐标必须经过坐标变换才能生成图像。OpenGL的变换包括取景变换、模型变换、投影变换和视区变换。
③     颜色模式设置:OpenGL用专门的函数和结构来指定颜色模式。OpenGL有两种可选的颜色模式:RGBA模式和颜色索引模式。对于两种颜色模式,OpenGL还可以选择平面着色和平滑着色两种处理形式。
④     光照和材质设置:用OpenGL绘制的物体可以加上灯光,这使得绘制的物体和真实世界的物体十分相似。OpenGL可设置四种光,即辐射光、环境光、镜面光和漫反射光,可以指定光的颜色、光源位置等相关参数。物体被光照成类似现实物体,还与物体本身的材质有关。OpenGL可以对物体的材质进行定义,材质用模型表面的反射特性表示。
⑤     图像效果:OpenGL不仅提供了进行底层像素拷贝和读写操作的函数,而且还提供了走反样、融合和雾化等增强图像效果的功能。
⑥     管理位图和图像:OpenGL可以管理两种类型的位图图像,其一是单色的位图,主要用于生成字符等简单的图像;其二是真彩位图,主要用于真实感再现。
⑦     纹理映射:通过众多的彩色多边形创建的物体,往往因为其表现细节不够而显得不够真实。OpenGL的纹理映射(Texture mapping以点映射来包裹一个物体)功能可以十分逼真地再现物体表面的细节。
⑧     实时动画:利用双缓存(Double Buffer)技术可以获得平滑逼真的动画效果。
⑨     交互技术:OpenGL提供了方便的三维图形交互接口,可以进行人机交互操作。
4OpenGL开发工具软件
由于虚拟现实系统的复杂性,虚拟现实的研究和应用不可能都从最底层开始做起,这就催生了各种虚拟现实软件和开发工具。常见的虚拟现实开发软件包有:
1)VRML(Virtual Reality Modeling Language)
VRML是为了在网络上传播3维虚拟场景而定义的一套建模语言,它用纯文本的形式描述3维物体、声音、材质、贴图、交互动作等。使用VRML完全可以建立庞大复杂的场景和交互。由于VRML一开始就是为了在网上传播而设计的,同时又具有良好的开放性,因此非常适合分布式应用,国内外都有许多应用VRML进行虚拟现实开发的研究项目。但是VRML是表现模型的脚本,辅以部分的Java脚本实现简单的互动,对复杂的互动和动画,需要配合其他的方式实现,如通过EAI接口和外部Java程序连接,或直接把vRML只作为模型使用,而由c语言等来绘制场景实现互动。VRML由于定位于用于网络传播,一般的需要浏览器插件来解释绘画场景,对场景规模构成一定的限制,网络的流量和流速也是另外一个原因。
2)WTK(WorldToolKit)
WTK是Seenes公司出品的跨平台的实时虚拟现实开发工具包[20〕。wTK实质上是一套c语言函数库,提供了超过1000个函数给用户使用。wTK通过OPenGL实现图形函数,提供高层的虚拟现实接口,以树结构方式管理虚拟场景,同时它提供对多种图形数据格式的支持,如3DS、openFlight等图形格式。WTK还提供了一系列的虚拟现实设备接口,如空间球、数据手套、头盔、位置跟踪器、声音设备等,保证了程序的硬件独立性,为开发人员开发交互程序提供了很大的方便,缩短了开发周期。WTK进入中国市场的时间比较早,因此使用WTK开发的虚拟现实系统很多,国内的应用也以WTK最多。
3)Vega
Performer和vega:SGI公司作为老牌的图形计算机供应商,继开发了OpenGL图形接口函数库之后,开发了Performer软件包作为其高级封装开发包。Paradigm公司以Performer为基础又开发了Vega虚拟现实软件工具包。尽管vega也是C语言函数库,但它却以面向对象的编程思想实现丰富的功能。Vega由于它良好的大数据库管理和优良的分布式系统支持,特别适合于大规模的仿真,如军事仿真或大地域环境仿真。vega还提供丰富的功能模块,模拟海浪、天气、烟雾等环境效果,使得创造一个逼真的虚拟环境更容易;它同时提供了良好的开发接口让用户开发自己的模块,SimWeight公司就开发了控制传达模块(vehieleeontrol)辅助控制对象进行复杂运动。
以上列举的是众多虚拟现实软件中应用比较广的几种,此外还有EONstudio,其特点是支持出色的动态光影渲染,图形质量非常的高。Sun公司的Java3D是以Java为开发语言的工具包,继承了Java面向对象和一次编译,到处运行的优点。
4)OpenSeene、VTK(Visualization Tool Kit)
是开放源代码的软件工具,虽然支持的场景没有商业软件的规模大,但所有人可以随意修改和使用它们而不必付一分钱。随着虚拟现实应用的增加,虚拟现实软件种类正迅速丰富。
5OpenGL工作结构和流程
(1)OpenGL的工作结构
OpenGL指令的解释模式是客户/服务器模式,即客户(试图用OpenGL进行绘制工作的应用程序)向服务器(OpenGL内核)发布命令,这些OpenGL命令则是由服务器来解释的。基于客户/服务器模式,在网络中很容易使用OpenGL,且在不同计算机上的多个客户可以得到在其它计算机上服务器的服务。这样OpenGL就具有了网络透明性。
OpenGL的库函数被封装在opengl32.d11,glu32.d11等几个动态链接库中。从客户应用程序发布的对OpenGL函数的调用首先被opengl32.dll,glu32.dll等动态链接库处理,然后传递给DDI(Device Driver Interface),最后传递给视频显示驱动程序。图1.7显示了整       图1.7  OpenGL的工作模式
个传递过程。                      
2OpenGL工作流程
OpenGL工作流程如图1.8所示。在Windows中运用OpenGL进行主要的图形操作以及最终在计算机屏幕上绘制出三维场景的步骤是:
①     设置设备环境的格式(初始化操作)。  像素格式告诉OpenGL绘制风格、颜色模式、颜色位数、深度位数等重要信息。建立绘制描述表,选定设备环境的当前绘制描述表。
②     建立模型。  根据基本图元建立三维模型,并对模型进行数学描述。
③     舞台布置。  把景物放置在三维空间的适当位置,设置三维视觉体以观察场景。
④     效果处理。  设置物体的材质(颜色、光学性能及纹理映射方式等)。
⑤     光栅化。  把景物及颜色信息转化为可在计算机屏幕上显示的像素格式。
图1.8  OpenGL的工作流程
3. OpenGL实现动画
将组成动画的单幅画面称为“帧”,一般情况下,连续播放的动画速度不得低于24帧/秒。不同国家和地区由于采用的视频制式不同,在电视上每秒钟播放的画面帧数也不同。例如,美国和日本采用的是NTSC制式,每秒钟动画由30帧画面组成,而中国和欧洲大部分国家和地区采用的是PAL制式,一秒钟动画由25帧画面组成。
一般来说,在计算机上实现动画的方式可分为非实时动画和实时动画两种,非实时动画是指在开始播放动画之前,将动画序列的各帧绘制好存放在内存或文件中,然后按顺序播放各帧页面,从而产生动画效果。其动画控制规律是预先确定的,动画过程中无法用外部参数进行控制。实时动画是指在动画过程中,可以实时地根据外部参数或指令产生动画,其动画规律是可以实时控制的,在PCB板的贴装仿真中要求系统能够根据命令实时仿真贴装运动。
(1)三维坐标变换
OpenGL的三维空间的几何变换的实现函数如表1.12所示。
1.12  OpenGL的三维空间的几何变换的实现函数
函数
命令
说明
缩放
Void glScale{fd}(TYPE x,
TYPE y,TYPE z)
OpenGL自动计算该命令,生成相应缩放变换矩阵,用该矩阵乘当前图形的齐次坐标实现缩放变换。其中参数(x,y,z)依次指定按x,y,z轴各自的比例因子缩放物体。
平移变换
Void glTranslate{fd}(TYPE x,
TYPE y,TYPE z)
OpenGL自动计算该命令,生成相应平移变换矩阵,用该矩阵乘当前图形的齐次坐标实现平移变换。其中参数(x,y,z)依次指定沿x,y,z轴方向的平移量。
旋转变换
Void glRotate{fd}(TYPE angle,
TYPE x,TYPE y,TYPE z)
OpenGL自动计算该命令,生成相应旋转变换矩阵,用旋转矩阵乘当前图形的齐次坐标实现旋转变换。其中angle指定旋转的角度,参数x,y,z指定一个从原点到(x,y,z)点的向量,作为旋转轴,旋转的方向是逆时针方向。
 
采用了齐次坐标技术,图形的变换才可以转化为表示图形的点集矩阵与某一变换矩阵的相乘问题,从而可以借助计算机的高速计算功能,很快得到变换后的图形,使高度动态的计算机图形显示成为可能。
(2)双缓存技术
一般来说,在计算机上实现动画的方式可分为非实时动画和实时动画两种,非实时动画是指在开始播放动画之前,将动画序列的各帧绘制好存放在内存或文件中,然后按顺序播放各帧页面,从而产生动画效果。其动画控制规律是预先确定的,动画过程中无法用外部参数进行控制。实时动画是指在动画过程中,可以实时地根据外部参数或指令产生动画,其动画规律是可以实时控制的,在PCB板的贴装仿真中要求系统能够根据命令实时仿真贴装运动。OpenGL支持一种称为双缓存的技术,该技术提供了生成实时动画效果图形所需要的机制,使得所生成的图形能够像电影一样平滑运动。
1)双缓存模式。  在OpenGL中可以将帧缓存设定为如下两种模式之一:单缓存模式,程序把帧缓存看成是单一的视频存储器,其上的像素一直可见;双缓存模式,程序把帧缓存看成是两个视频存储器,在任意时刻,只显示其中一个帧缓存中的内容。当前可见视频存储器称为前缓存,不可见的正在画的视频存储器称为后缓存。显示硬件不断的读可见视频存储器的内容,并把结果显示在屏幕上。
考虑双缓存模式的原因是为了产生平滑的动画,最好把一副完全画好的图像显示一定时间,然后,提供下一幅画面,该画面也是完全画好的,也显示同样长的时间。图像以此方式交替出现,从一副图像变化到下一副图像,我们的眼睛是感觉不到这种变化的。如果画面交替速度不够快,那么我们的眼睛就能察觉到这种变化,感觉画面在闪烁。
2)双缓存实现。  双缓存既可以在RGB模式下工作,也可以在颜色索引模式下工作。在双缓存模式下只有前缓存被显示。
①设置双缓存。  双缓存既可以在RGB模式下工作,也可以在颜色索引模式下工作。用指令duobl beueffer()可以设置双缓存。
在画任何物体之前,必须把帧缓存设置为正确组态。当完整的画面在后缓存中画出以后,调用swapbueffer(),交换前后缓存,使后缓存成为可见。swapbueffer()要等到下一次屏幕更新之才交换前后缓存。
②刷新子程序。  在双缓存模式下只有前缓存被显示,刷新子程序通常只更新后缓存,用frontbueffer()和backbueffer()可以重写这种默认。
在双缓存模式下,有时立即把两个同样的内容写到两个视频缓存器中特别有用。一个连续的运动画面中既包括固定部分也包括变化部分,固定部分实际上只需要画一次。OpenGL可以使用前缓存写和画图像,后缓存保存固定部分,将两个部分合成起来就形成了动画过程,这就是通常的双缓存技术动画图像方法。如此,可以大大提高动画性能。
上一条: 三维(3D)建模技术
下一条: 西南交通大学多学科创新团队牵引中国动力火车
Copyright◎2011 常州奥施特信息科技有限公司 版权所有 技术支持:常州山水网络-优秀的常州网络公司