浅 谈 OpenGL
姓名 梅 鹏 班级 地理科学一班 学号 20090507011 指导老师 蚩 志 锋 时间 2011年12月18
【摘要】OpenGL是发展便携式,交互式的二维和三维图形应用的首选环境。OpenGL的在1992年推出以来,已成为业界最广泛使用和支持2D和3D图形应用程序编程接口(API),使数千种应用到多种计算机平台.本文在广泛查阅资料和系统分析的基础上,将对OpenGL的发展历程、主要功能、绘制流程、基本语法、一个完整的OpenGL程序进行简要的概述。
【关键词】 发展 功能 流程 语法 程序
1 OpenGL的发展历程
OpenGL是一个开放的三维图形软件包,以它为基础开发的应用程序可以十分方便地在各种平台
间移植;它实现了各种二维和三维的高级图形处理技术,是实现逼真的三位效果与建立交互式三维景观的强大工具。由于OpenGL的广泛应用,它已成为事实上的工业标准。
1992年7月,SGI公司发布了OpenGL的1.0版本,随后又与微软公司共同开发了Windows NT版本的OpenGL,从而使一些原来必须在高档图形工作站上运行的大型3D图形处理软件也可以在微机上运用。1995年OpenGL的1.1版本面市,该版本较1.0性能提高许多,并加入了一些新的功能。包括提高顶点位置、法线、颜色、色彩指数、纹理坐标、多边形边缘标识的传输速度,引入了新的纹理特性等等。1997年,微软公司最终在Windows 95的OSR2版和后来的Windows 版本中加入了对OpenGL的支持。这样,不但许多支持OpenGL的电脑3D游戏得到广泛应用,而且许多在3D图形设计软件也可以运用支持OpenGL标准的3D加速卡,大大提高其3D图形的处理速度。 2003年的7月28日,SGI和ARB公布了OpenGL 1.5。OpenGL 1.5中包括OpenGL ARB的正式扩展规格绘制语言“OpenGL Shading Language”。OpenGL 1.5的新功包括:顶点Buffer Object、Shadow功能、隐蔽查询、非乘方纹理等。 2004年8月,OpenGL2.0版本发布~OpenGL 2.0标准的主要制订者并非原来的SGI,而是逐渐在ARB中占据主动地位的3Dlabs。opengl2.0支持OpenGL Shading Language、新的shader扩展特性以及其他多项增强特性。 OpenGL 3.0 API开发代号为Longs Peak,和以往一样,OpenGL 3.0仍然作为一个开放性和跨平台的3D图形接口标准,同时,OGL3.0还引入了一些新的功能,例如顶点矩阵对象,全帧缓存对象功能,32bit浮点纹理和渲染缓存,基于阻塞队列的条件渲染,紧凑行半浮点顶点和像素数据,四个新压缩机制等等。 2009年8月Khronos小组发布了OpenGL 3.2,OpenGL3.2版本提升了性能表现、改进了视觉质量、提高了几何图形处理速度,而且使Direct3D程序更容易移植为OpenGL。 2010年7月26日发布OpenGL 4.1和OpenGL OpenGL Shading Language 4.10。OpenGL4.1提高视觉密集型应用OpenCL™的互操性。2011年8月9日在温哥华举行的SIGGRAPH 2011大会上Khronos发布了新的OpenGL 4.2标准细节,对于支持现有硬件的API加入了部分新的支持特性。
OpenGL独立于硬件设备和窗口系统,在运行各种操作系统的计算机上都可使用,并能在网络环境下以客户---服务器模式工作,具有很高的移植性。并且,OpenGL中的图形函数定义为独立于任何程序设计语言的一组规范,在各种编程语言中,如C,C++,FORTRAN,Ada和Java等,都可调用OpenGL的库函数。
2 OpenGL的主要功能
OpenGL作为一个性能优越的图形应用程序设计接口(API),使用简便,效率高,它主要具有以下9中功能:
(1) 模型绘制。OpenGL能够绘制点,线和多边形。应用这些基本形体,可以构造出几乎所有的三维模型。此外,OpenGL库函数还提供球,多面体,茶壶等复杂物体以及贝塞尔等曲线曲面的绘制函数。
(2) 模型观察。在建立三维景观模型后,可利用OpenGL描述如何观察所建立的三维模型。这需要建立一系列的变换,包括坐标变换,投影变换和视窗变换。
(3) 颜色模式。OpenGL 颜色模式有两种,即RGBA模式和颜色索引(Color Index)。在RGBA模式中,颜色直接由RGB值来指定,在颜色索引中,颜色由颜色表中的一个颜色索引来指定。 (4) 光照应用。用OpenGL绘制的三维模型必须加上光照才能与客观事物更加相似。OpenGL光有辐射光(Emitted Light)、环境光(Ambient Light)、漫反射光(Diffuse Light)和镜面光(Specular Light)。材质是用光反射率来表示。场景(Scene)中物体最终反映到人眼的颜色是光的红绿蓝分量与材质红绿蓝分量的反射率相乘后形成的颜色。
(5) 图像效果增强。OpenGL提供了一系列的增强三维景观图像效果的函数,这些函数包括反走样, 混合和雾化。以上三条可使被仿真物更具真实感,增强图形显示的效果。
(6) 位图和图像处理。OpenGL提供了一系列专门对位图和图像进行操作的函数。位图和图像数据均采用像素矩阵来表示。
(7) 纹理映射。利用OpenGL纹理映射功能可以十分逼真地表达物体表面细节。它提供的一系列纹理映射函数可以十分方便地把真实图像贴到景物的多边形上,从而绘制逼真的三维景观。 (8) 实时动画。OpenGL采用双缓存技术,并为其提供了一系列的函数。
(9) 交互技术。OpenGL提供了方便的三维图形人机交互接口,用户通过输入设备可选者和修改三维景观中的物体。 3 OpenGL的绘制流程
OpenGL的绘制流程如下图所示,应用软件调用OpenGLAPI函数进行图形绘制,OpenGL函数将绘制命令(含命令,顶点数据和纹理数据等)传送到命令缓冲区,命令缓冲区中的几何顶点数据通常须进行几何变换和光照计算,以及通过指定的方法进行投影,然后与其他数据一起送到光栅化流程中,光栅化根据图形的几何形状,颜色和文理数据产生一系列图像的帧缓存地址和像素点值,光栅化的结果最后被放置在帧缓存存储器中,这样图像就显示在屏幕上了。注意,只有当命令缓冲区被清空时,缓冲区的命令和数据才会传递给下一个阶段,OpenGL命令才会被执行。
调用OpenGL API函数 OpenGL 命令缓冲区 变换,光照 光栅化 帧缓存
4 OpenGL 的基本语法 4.1 相关库
OpenGL 主要由以下函数库组成:
(1) OpenGL核心库。它包含115个最基本的命令函数,以“gl”为前缀,可在任何OpenGL工作
平台上应用。这些函数常用于常规的,核心的图形处理,如建立几何模型,产生光照效果等。
(2) OpenGL实用程序库。它包含43个函数,以“glu”为前缀,在任何OpenGL平台都可以应用。这些函数通过调用核心库函数,来实现一些较复杂的操作,如纹理映射,坐标变换,网格化曲线曲面的绘制。
(3) OpenGL编程辅助库。它包含31个函数,以“aux”为前缀,主要用于窗口管理,输入/输出
处理以及绘制一些简单的三锥形体。它们不能再所有的OpenGL平台上应用。
(4) OpenGL实用程序工具包。它包含30多个函数,前缀“glut”,主要用于提供基本窗口的工
具,如窗口系统的初始化,多窗口的管理,菜单管理,字体以及一些复杂物体的绘制。
(5) Window专用库。它包含6个函数,以“wgl”开头,用于链接OpenGL和WindowNT。 4.2 命名规则
OpenGL 函数都遵循一个命名约定,通过这个约定可以了解函数来源于哪个库,需要多少个参数以及参数的类型。命名规则如下:
<库前缀><根命令><可选参数个数><可选参数类型>
例如,函数glColor3f,gl表示这个函数来自核心库gl.h,Color是该函数的根命令,表示该函数用于颜色的设定,3f表示这个函数采用三个浮点数参数。这种把参数数目和参数类型加如入OpenGL函数尾部的约定使人们更容易记住参数列表而无须查找他。有些函数使用一个或多个符号常量,这些符号常量均使用GL 开头,常量名中的各个组成词用下划线(_)分开,且都采用大写形式,如GL_RGB,GL_PLOYGON,GL_CCW等。 5 一个完整的OpenGL程序
这里用“绘制一个红色矩形”的简单实例来说明利用OpenGL绘图的一般过程,它通常包含以下一些步骤。 (1) 头文件包含
利用OpenGL实现图形绘制,首先要引入OpenGL核心库以及其他需要使用的库的头文件。此外,由于OpenGL 没有包含窗口系统,因此需要通过头文件引入窗口系统。典型的OpenGL 程序的头几行如下:
#include 若使用GLUT库函数实现窗口管理,则不需要包含gl.和gl.h。因为GLUT保证了这两者被正确包含因此可以使用下面的方式代替GL和GLU的头文件。 #include (2) 使用GLUT库实现窗口管理 要使用GLUT库首先需要进行初始化,对命令行的参数进行处理,相应的语句是: glutInit(&argc,argv); 接着需要用glutCreateWindow函数创建一个窗口,该函数的参数是一个保存了窗口标题名称的字符串。在创建窗口之前,还要使用glutInitDispiayMode函数设定窗口的显示模式,包括缓存和颜色模型等,该函数的参数是一些符号常量的组合。下面的glutInitDispiayMode函数指定窗口使用单缓存以及RGB颜色模型。 glutInitDispiayMode(GLUT_SINGLE|GLUT_RGB); 在创建窗口时,系统可使用默认值设定显示窗口的大小和位置,或使用 glutInitWindowSize和glutInitWindowPosition函数指定显示窗口的大小和位置。其中位置以屏幕左上角为原点,用整数坐标表示。例如,下面的程序段定义了一个距屏幕左边界100像素,距屏幕上边界120像素。宽度为400像素,高度为300像素的窗口。 glutInitWindowSize(400,300); glutInitWindowPoistion(100,200); 此时还需要定义窗口显示的内容。通常,利用OpenGL绘制图形的过程将显示内容定义定义在一个不带任何参数的函数内,如过这个函数的名字是Display,则通过函数 glutDisplayFunc(Display); 将Display指定为当前窗口的显示内容函数; (3)利用OpenGL绘图 在实现了窗口管理之后,需要调用以OpenGL函数来实现图像的绘制。首先来指定窗口的背景颜色。下面的函数指定窗口的背景色为白色。 glutClearColor(1.0f,1.0f,1.0f,1.0f,); 函数的前三个变量指定颜色的红,绿,蓝三个颜色分量。最后一个参数是颜色的Alpha成分,用于指定颜色混合后的特殊效果,如半透明效果等。 在指定窗口的背景色之后,在每次绘制图形前需要用到函数 glutClear(GL_COLOR_BUFFER_BIT); 该函数用glutClearColor函数中指定的值开设定颜色缓存中的值,即将窗口中每个像素的颜色设为背景色。 在绘制图形之前,还有一个问题要解决。就是二维矩阵要在一个是三维坐标空中创建,而窗口显示的是二维图形,因此需要一个投影过程将三维图形(实际上是二维矩阵)投影到显示窗口中,使用下列语句: glMatrixMode(GL_PROJECTION); gluOrtho2D(0.0,200.0,0.0,150.0); 设定投影参数,其中gluOrtho2D指定使用正投影讲一个x 坐标在0.0—200.0,y 坐标在0.0—150.0的矩形坐标区域投影到窗口内,任何在这个矩形坐标区域内绘制的图形都可以显示在窗口。最后利用函数 glRectf(50.0f,100.0f,150.0f50.0f); 绘制一个左上角点在(50.0,100.0),右下角点在(150.0,50.0)的矩形。 将以上三个过程结合起来将所有的初始化过程以及只需要调用一次的函数放在函数Initial中,将绘制过程放在函数ReDdraw中,这样就得到了一个完整的OpenGL绘制程序。 6 结语 经过半年的学习和上机操作,对OpenGL有了初步的了解和认识,为以后的工作和学习奠定了坚实的基础。 参考文献 (1) 艾自兴 龙毅.计算机地图制图[M].武汉大学出版社. (2) 邬 伦 刘 瑜.地理信息系统---原理、方法和应用[M].科学出版社. (3) 陆枫 何云峰.计算机图形学基础[M].电子工业出版社. (4) 谈俊如 马永立.测量与地图学[M].南京大学出版社. (5) 孙以义. 计算机地图制图[M]. 科学出版社出版. 因篇幅问题不能全部显示,请点此查看更多更全内容