利用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.结束语
科学计算可视化,计算机动画和虚拟现实是现在计算机图形学的
三个热点。而这三个热点的核心都是三维真实感图形的绘制..由于