利用OpenGL实现三维绘图的研究

  • 格式:pdf
  • 大小:224.25 KB
  • 文档页数:2

科技信息 0科教视 }0 SCIENCE INFO ̄ATION 2006年第lO期 

利用OpenGL实现三维绘图的研究 

杨光伟李鹏房志栋 

(陕西省广电网络渭南分公司 陕西渭南714000) 

摘要:本文主要介绍OpenGL编程的基奉概念、步骤,以厦如何利用OpenGL函数库实现三雏绘图。 

关键词:OpenGL:三雏绘图 

OpenGL是个专业的3D程序接口,是一个功能强大,调用方便的 

底层3D图形库。OpenGL的前身是SGI公司为其图形工作站开发的 

IRIS GL。IRIS GL是一个工业标准的3D图形软件接口,功能虽然强火 

但是移植性不好,于是SGI公司便在IRIS GL的基础上开发了 

OpenGL。OpenGL的英文全称是“Open Graphics Library”,顾名思义. 

OpenGL便是“开放的图形程序接口”。虽然DirectX在家用市场全面领 

先,但在专业高端绘图领域,OpenGL是不能被取代的主角。 

OpenGL是个与.硬件无关的软件接口,可以在不同的平台如 

Windows 95、Windows NT、Unix、Linux、MacOS、0S/2之间进行移植。因 

此,支持OpenGL的软件具有很好的移植性,可以获得非常广泛的应 

用 由于OpenGL是3D图形的底层图形库,没有提供几何实体图元. 

不能直接用以描述场景。但是,通过一些转换程序,可以很方便地将 

AutoCAD、3DS等3D图形设计软件制作的DFX和3DS模型文件转换 

成OpenGL的顶点数组 

在OpenGL的基础上还有Open Inventor、Cosmo3D、Optimizer等多 

种高级图形库,适应不同应用 其中.Open Inventor应用最为广泛。该 

软件是基于OpenGL面向对象的工具包,提供创建交互式3D图形应 

用程序的对象和方法。提供了预定义的对象和用于交互的事件处理模 

块,创建和编辑3D场景的高级应用程序单元,有打印对象和用其它图 

形格式交换数据的能力。 

OpenGL的发展…直处于-种较为迟缓的态势,每次版本的提高 

新增的技术很少.人多只是对其中部分做出修改和完善。1992年7 

月,SGI公司发布了OpenGL的1 0版本.随后叉与微软公司共间开发 

了Windows NT版本的OpenGL,从而使一些原来必颁在高档图形工 

作站l 运行的大型3D图形处理软件也可以在微机上运用。1995年 

OpenGL的1.1版本叫市,该版本比l 0的性能有许多提高,并加入了 

一些新的功能。其中包括改进打印机支持,在增强元文件中包含 

OpenGI 的调用。顶点数组的新特性,提高顶点位置、法线、颜色、色彩 

指数、纹理坐标、多边形边缘标识的传输速度,引入了新的纹理特性等 

等。OpenGL 1,5叉新增了“OpenGI Shading Lal1gu e”,该语言是 

“OpenGL 2 0 的底核,用于着色对象、顶点着色以及片断着色技术的 

扩展功能 

OpenGL 2.0标准的主要制订者并非原来的SGI。而是逐渐在ARB 

中占据主动地位的3Dlabs。2.0版本首先要做的是与旧版本之间的完 

整兼容性,同时在顶点与像素及内存管理上与DirectX共同合作以维 持均势。OpenGL 2.0将由OpenGL 1.3的现有功能加上与之完全兼容 

的新功能所组成。借此可以对在ARB停滞不前时代各家推出的各种 

纠缠不清的扩展指令集做…次彻底的精简。此外,硬件可编程能力的 

实现也提供了一个更好的方法以整合现有的扩展指令。 

目前,随着DirectX的不断发展和完善,OpenGL的优势逐渐艇失, 

至今虽然已有3DIabs提倡开发的2.0版本面世,在其中加入了很多类 

似于DirectX中可编程单元的设计,但厂商的用户的认知程度并不高, 

束来的OpenGl 发展前景迷茫在三维绘图蓬勃发展的过程中,计算机 

公司推出_=r大量的三维绘图软件包。其中SGI公司推出的OpenGL。作 

为一个性能优越的图形应用程序设计界面(API)异军突起.取得了很 

大的成就。它以高性能的交互式三维图形建模能力和易于编程开发. 

得到r Microsoft、IBM、DEC、Sun、HP等太公司的认同。因此, 

OpenGL已经成为一种三维图形开发标准,是从事三维图形开发工作 的必要工具。 

1.初始化OpenGL绘图环境 

1.1定义颜色格式和缓冲模式OpenGL提供两种颜色模式:RGB 

(RGBA)模式和颜色索引模式。在RGBA模式下所有颜色的定义用 

RGB三个值来表示,有时也加上Alpha值(表示透明度)。RGB三个分 

量值的范围都在0和1之间。它们在最终颜色中所占的比例与它们的 值成正比。如;(1。1,0)表示黄色。(0,0,I)表示蓝色。颜色索引模式下 

6 每个象索的颜色是用颜色索引表中的某个颜色索引值表示(类似于从 调色板中选取颜色)。由于三维图形处理中要求颜色灵活,而且在阴 

影,光照,雾化,融合等效果处理中RGBA的效果要比颜色索引模式 

好,所以,在编程时太多采用RGBA模式。 

OpenGL提供了双缓存来绘制图像。即在显示前台缓存中的图像 

同时,后台缓存绘制第二幅图像。当后台绘制完成后,后台缓存中的图 

像就显示出来,此时原来的前台缓存开始绘制第三幅图像。如此循环 

往复,以增加图像的输出速度。 

设置窗u显示模式函数: 

void auxInitDispl yMode( 

AUX—D0UBLE//双缓存方式 

IAUX—RGBA);//RGBA颜色模式 

1.2设置光源 OpenGL的光源大体分为三种:环境光(Ambient 

light).即来自十周围环境没有固定方向的光。漫射 ̄(Difuse ligh0来 自同一个方向.照射到物体表面时在物体的各个方向上均匀发散。镜 面光(Specular light1则是来自于同一方向,也沿同一个方向反射。全局 

环境光是一种特殊的环境光。它不来自特于某种定光源。通常做为场 

景的自然光源。 

指定光源函数: 

Void bghtry(G1enum light,//光源号 Glenum pname.//指明光源种类 

//GL_DIFFUSE光源为漫射光光源 

//GI AMBIENT光源为环境光光源 

//GI PECUIAR光源为镜面光光源 

const Glfloat*params)"d/指向颜色向量的指针 

设蔑全局环境光函数: 

void glI ightModelfvf GL_LIGHT ̄MODEL 

AMBIENT,const Glfloat param); //param指向颜色向量的指针 

起用光源函数: 

void glEnable(GLLIGHTING); void glEnable(GL_enum cap)://cap:指明光源号 

1.3设置材质在OpenGL中,用材料对光的三原色(红绿蓝)的反 

射率大小来定义材料的颜色。与光源相对应,材料的颜色。也分为环境 

色,漫反射色和镜面反射色。由此决定该材料对应不同的光呈现出不 

同的反射率。由于人所看到物体的颜色是光源发出的光经物体反射后 

进入眼睛的颜色。所以,物体的颜色是光源的环境光,漫反射光和镜面 

反射光与材料的环境色,漫反射色和镜面反射色的综合。例如: 

OpenG1 的光源色是(LR,LG,LB),材质色为(MR,MG,MB),那么,在 

忽略其他反射效果的情况下,最终进入眼睛的颜色是(LR*MR, 

LG MG.LB*MB)。 材质定义函数: v0id glMaterialfv(GLenu13'1 face。『/指明在设置材质的哪个表面的 

颜色。可以是GL FRONT,GI ̄BACK。或GL_FRON r-AND_BACK GLellum pname,//与光源的pname参数相似eol'tst float*param ̄);//指向 

材质的颜色向量。 

1.4定义投影方式也即选择观察物体的角度和范围。由于我们 

是三维绘图.所以采用不同的视点和观察范围。就会产生不同的观察 

效果 由于计算机只能显示二维图形,所以在表示真实世界中的三维 

图形时.需将三维视景转换成=维视景。这是产生三维立体效果的关 

键。OpenGL提供了两种将3D图形转换成2D图形的方式。正投影 

(Orthographic Projection)和透视投影(Perspective Projection)。其中。正 投影指投影后物体的大小与视点的远近无关,通常用于CAD设计;而 

透视投影则符合人的心理习惯。离视点近的物体大。离视点远的物体 

小。此外,在OpenGL中还要定义投影范围。只有在该范围中的物体才 维普资讯 http://www.cqvip.com 科技信息 0科毂视野0 SCIENCE INFORMATION 2006年第1O期 

会被投射到计算机屏幕上,投影范围外的物体将被裁减掉。 定义投影范围(不同的投影方式对应不同函数): 

void glOrthof GLdouble left,GLdouble right, 

GLdouble bottom,GIAouble top。 

GLdouble Near,GLdouble : //(1eft,bottom,near)和(fight,top'far)分别给出正射投影投影范围的左 

下角和右上角的坐标。 

2.定义与Windows接口的系统函数 

2.1定义绘图窗口的位置: 

void auxlnitPosition(GLint x,GLint y,Gk ̄izei width,GI size/heigh);// 

fx’v)给出窗口左上角坐标 

//width和heigh给出窗口的宽高 

2.2定义绘图窗口的标题:} 

void auxInitWindow(GLbyte*窗口标题字串); 

2.3定义绘图窗口改变时的窗口刷新函数: 

void auxReshapeFunc(回调函数名称); 

//当窗口改变形状时调指定的回调函数 

2-4定义空闲状态的空闲状态函数以实现动画: 

void auxldleFunc(1 ̄调函数名称); 

/,当系统空闲时调用指定的回调函数 

2.5定义场景绘制函数(当窗口更新或场景改变时调用): 

void auxMainLoop(1 ̄调函数名称); 

//当窗口需要更新或场景变化时调用 

3.VC下实现 

在VC编辑器下键人下述代码后,保存为后缀是cpp的C++文 

件。开始编译。在The build command requires an active pmiect 

WOrkspace。Would you like to create a defauh project workspace?的 

提示后,选择“是(Y)”。进入Proieet菜单,选择Setting项,弹出Project 

Setting对话框,选择Link项.在Libaray栏目中加入OpenGL提供的 

函数库:“opengl32.1ib glu32.1ib glaux.1ib”。(注:在执行时,Windows的 

system目录下要包含opengl32.dll和glu32.dll两个动态连接库)。 

4.结束语 

科学计算可视化,计算机动画和虚拟现实是现在计算机图形学的 

三个热点。而这三个热点的核心都是三维真实感图形的绘制..由于