1、OpenGLOpenGL 4.3OpenGL(全写 Open Graphics Library)是个定义了一个跨编程语言、跨平台的编程接口的规格,它用于三维图象(二维的亦可) 。OpenGL 是个专业的图形程序接口,是一个功能强大,调用方便的底层图形库。目录基本介绍特点功能现状扩展绑定OpenGL 3.1规范高级功能展开基本介绍特点功能现状扩展绑定OpenGL 3.1规范高级功能展开基本介绍算法标准高性能图形算法行业标准OpenGL 是行业领域中最为广泛接纳的 2D/3D 图形 API, 其自诞生至今已催生了各种计算机平台及设备上的数千优秀应用程序。OpenGL 是独立于视窗操作系统或其它操作
2、系统的,亦是网络透明的。在包含 CAD、内容创作、能源、娱乐、游戏开发、制造业、制药业及虚拟现实等行业领域中,OpenGL 帮助程序员实现在 PC、工作站、超级计算机等硬件设备上的高性能、极具冲击力的高视觉表现力图形处理软件的开发。OpenGL 的前身是 SGI 公司为其图形工作站开发的 IRIS GL。IRIS GL 是一个工业标准的3D 图形软件接口,功能虽然强大但是移植性不好,于是 SGI 公司便在 IRIS GL 的基础上开发了 OpenGL。OpenGL 的英文全称是“Open Graphics Library”,顾名思义,OpenGL便是“开放的图形程序接口” 。虽然 Direct
3、X 在家用市场全面领先,但在专业高端绘图领域,OpenGL 是不能被取代的主角。OpenGL 是个与硬件无关的软件接口,可以在不同的平台如 Windows 95、 Windows NT、Unix、Linux、MacOS 、OS/2之间进行移植。因此,支持 OpenGL 的软件具有很好的移植性,可以获得非常广泛的应用。由于 OpenGL 是图形的底层图形库,没有提供几何实体图元,不能直接用以描述场景。但是,通过一些转换程序,可以很方便地将AutoCAD、3DS/3DSMAX 等3D 图形设计软件制作的 DXF 和3DS 模型文件转换成OpenGL 的顶点数组。在 OpenGL 的基础上还有 Op
4、en Inventor、Cosmo3D 、Optimizer 等多种高级图形库,适应不同应用。其中,Open Inventor 应用最为广泛。该软件是基于 OpenGL 面向对象的工具包,提供创建交互式3D 图形应用程序的对象和方法,提供了预定义的对象和用于交互的事件处理模块,创建和编辑3D 场景的高级应用程序单元,有打印对象和用其它图形格式交换数据的能力。OpenGL 的发展一直处于一种较为迟缓的态势,每次版本的提高新增的技术很少,大多只是对其中部分做出修改和完善。1992年7月,SGI 公司发布了 OpenGL 的1.0版本,随后又与微软公司共同开发了 Windows NT 版本的 Ope
5、nGL,从而使一些原来必须在高档图形工作站上运行的大型3D 图形处理软件也可以在微机上运用。1995年 OpenGL 的1.1版本面市,该版本比1.0的性能有许多提高,并加入了一些新的功能。其中包括改进打印机支持,在增强元文件中包含 OpenGL 的调用,顶点数组的新特性,提高顶点位置、法线、颜色、色彩指数、纹理坐标、多边形边缘标识的传输速度,引入了新的纹理特性等等。OpenGL 1.5又新增了“OpenGL Shading Language”,该语言是“OpenGL 2.0”的底核,用于着色对象、顶点着色以及片断着色技术的扩展功能。OpenGL 2.0标准的主要制订者并非原来的 SGI,而是
6、逐渐在 ARB 中占据主动地位的3DLabs。2.0 版本首先要做的是与旧版本之间的完整兼容性,同时在顶点与像素及内存管理上与 DirectX 共同合作以维持均势。OpenGL 2.0将由 OpenGL 1.3的现有功能加上与之完全兼容的新功能所组成(如图一 )。借此可以对在 ARB 停滞不前时代各家推出的各种纠缠不清的扩展指令集做一次彻底的精简。此外,硬件可编程能力的实现也提供了一个更好的方法以整合现有的扩展指令。目前,随着 DirectX 的不断发展和完善,OpenGL 的优势逐渐丧失,至今虽然已有3Dlabs 提倡开发的2.0版本面世,在其中加入了很多类似于 DirectX 中可编程单元
7、的设计,但厂商的用户的认知程度并不高,未来的 OpenGL 发展前景迷茫。发展历程1992年7月,SGI 公司发布了 OpenGL 的1.0版本,随后又与微软公司共同开发了Windows NT 版本的 OpenGL,从而使一些原来必须在高档图形工作站上运行的大型3D 图形处理软件也可以在微机上运用。1995年 OpenGL 的1.1版本面市,该版本较1.0性能提高许多,并加入了一些新的功能。包括提高顶点位置、法线、颜色、色彩指数、纹理坐标、多边形边缘标识的传输速度,引入了新的纹理特性等等。1997年,Windows 95下 3D 游戏的大量涌现,游戏开发公司迫切需要一个功能强大、兼容性好的3D
8、 图形接口,而当时微软公司自己的3D 图形接口 DirectX 3.0功能却是很糟糕。因而以制作雷神之锤等经典3D 射击游戏而著名的 id 公司同其它一些游戏开发公司一同强烈要求微软在 Windows 95中加入对 OpenGL 的支持。微软公司最终在 Windows 95的 OSR2版和后来的 Windows 版本中加入了对 OpenGL 的支持。这样,不但许多支持OpenGL 的电脑3D 游戏得到广泛应用,而且许多在 3D 图形设计软件也可以运用支持OpenGL 标准的 3D 加速卡,大大提高其 3D 图形的处理速度。2003年的7月28日,SGI 和 ARB 公布了 OpenGL 1.5
9、。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 扩展特性以及其他多项增强特性。2008年8月初 Khronos 工作组在 Siggraph 2008大会上宣布了 Open
10、GL 3.0图形接口规范,GLSL1.30 shader 语言和其他新增功能将再次未来开放 3D 接口发展指明方向。OpenGL 3.0 API 开发代号为 Longs Peak,和以往一样, OpenGL 3.0仍然作为一个开放性和跨平台的3D 图形接口标准,在 Shader 语言盛行的今天,OGL3.0增加了新版本的 shader 语言: GLSL 1.30,可以充分发挥当前可编程图形硬件的潜能。同时,OGL3.0还引入了一些新的功能,例如顶点矩阵对象,全帧缓存对象功能,32bit 浮点纹理和渲染缓存,基于阻塞队列的条件渲染,紧凑行半浮点顶点和像素数据,四个新压缩机制等等。2009年3月又
11、公布了升级版新规范 OpenGL 3.1,也是这套跨平台免费 API 有史以来的第九次更新。OpenGL 3.1将此前引入的 OpenGL 着色语言“GLSL”从1.30 版升级到了1.40版,通过改进程序增强了对最新可编程图形硬件的访问,还有更高效的顶点处理、扩展的纹理功能、更弹性的缓冲管理等等。宽泛地讲,OpenGL 3.1在3.0 版的基础上对整个API 模型体系进行了简化,可大幅提高软件开发效率。2009年8月 Khronos 小组发布了 OpenGL 3.2,这是一年以来 OpenGL 进行的第三次重要升级。该版本仍然延续了 OpenGL 发展的方向让图形程序开发者能在多种操作系统和
12、平台下更好的利用新的 GPU 功能。OpenGL3.2版本提升了性能表现、改进了视觉质量、提高了几何图形处理速度,而且使 Direct3D 程序更容易移植为 OpenGL。除 OpenGL 之外,Khronos 还将其开发的其它标准进行了协调改进,以求可以在更广泛的领域提供强大的图形功能和计算生态系统,这些标准包括用于并行计算的 OpenCL、用于移动3D 图形开发的 OpenGL ES 和用于网络3D 开发的 WebGL。2010年7月26日发布 OpenGL 4.1和 OpenGL OpenGL Shading Language 4.10。OpenGL4.1 提高视觉密集型应用 OpenC
13、L的互操作性,并继续加速计算剖面为核心的支持和兼容性第一次推出的 OpenGL 3.2,使开发人员能够使用一个简化的 API 或保留向后兼容现有的 OpenGL 代码,这取决于他们的市场需求。Khronos 旗下的 OpenGL ARB(Architecture Review Board)工作组推出了 GLSL 1.5OpenGLShading Language(OpenGL 着色语言)的升级版,以及在 OpenGL3.2框架下推出了两个新功能,可以让开发者在开发新程序时能够在使用流水线内核特性或兼容性特性之间做出选择,其中兼容性特性会提供与旧版 OpenGL 之间的兼容性。2011年8月9
14、日在温哥华举行的 SIGGRAPH 2011大会上 Khronos 发布了新的OpenGL 4.2标准细节,对于支持现有硬件的 API 加入了部分新的支持特性。和 OpenGL 4.1一样,OpenGL 4.2主要应用于 DX11级别硬件如 NVIDIA GeForce 400/500,Radeon HD 5000/6000系列显卡,不过 NVIDIA 的开发者社区之前曾经表示部分特性可通过扩展功能在最老支持 OpenGL2/DX9级别的硬件上实现。特点功能OpenGL 是一个开放的三维图形软件包,它独立于窗口系统和操作系统,以它为基础开发的应用程序可以十分方便地在各种平台间移植;OpenGL
15、 可以与 Visual C+紧密接口,便于实现机械手的有关计算和图形算法,可保证算法的正确性和可靠性;OpenGL 使用简便,效率高。它具有七大功能:1.建模:OpenGL 图形库除了提供基本的点、线、多边形的绘制函数外,还提供了复杂的三维物体(球、锥、多面体、茶壶等)以及复杂曲线和曲面绘制函数。2.变换:OpenGL 图形库的变换包括基本变换和投影变换。基本变换有平移、旋转、变比镜像四种变换,投影变换有平行投影(又称正射投影)和透视投 影两种变换。其变换方法有利于减少算法的运行时间,提高三维图形的显示速度。3.颜色模式设置:OpenGL 颜色模式有两种,即 RGBA 模式和颜色索引(Colo
16、r Index) 。4.光照和材质设置:OpenGL 光有辐射光(Emitted Light) 、环境光(Ambient Light) 、漫反射光(Diffuse Light)和镜面光(Specular Light) 。材质是用光反射率来表示。场景(Scene)中物体最终反映到人眼的颜色是光的红绿蓝分量与材质红绿蓝分量的反射率相乘后形成的颜色。5:纹理映射(Texture Mapping) 。利用 OpenGL 纹理映射功能可以十分逼真地表达物体表面细节。6:位图显示和图象增强图象功能除了基本的拷贝和像素读写外,还提供融合(Blending) 、反走样( Antialiasing)和雾(fog
17、)的特殊图象效果处理。以上三条可使被仿真物更具真实感,增强图形显示的效果。7:双缓存动画(Double Buffering)双缓存即前台缓存和后台缓存,简言之,后台缓存计算场景、生成画面,前台缓存显示后台缓存已画好的画面。此外,利用 OpenGL 还能实现深度暗示(Depth Cue) 、运动模糊(Motion Blur)等特殊效果。从而实现了消隐算法。OpenGL 设备运用,目前瑞芯微2918芯片和英伟达芯片Tegra2 就是采用 OpenGL 2.0技术进行图形处理,而基于瑞芯微 2918芯片方案代表是台电 T760和微蜂 X7平板电脑所采用到。现状Open GL 仍然是唯一能够取代微软对
18、 3D 图形技术的完全控制的 API。它仍然具有一定的生命力,但是 Silicon Graphics 已经不再以任何让微软不悦的方式推广 Open GL,因而它存在较高的风险。游戏开发人员是一个有着独立思想的群体,很多重要的开发人员目前仍然在使用 Open GL。因此,硬件开发商正在设法加强对它的支持。 Direct3D 目前还不能支持高端的图形设备和专业应用; Open GL 在这些领域占据着统治地位。最后,开放源码社区(尤其是 Mesa 项目)一直致力于为任何类型的计算机(无论它们是否使用微软的操作系统)提供 Open GL 支持。截止2012年5月已经公布了 OpenGL4.2。08年8
19、月正式公布 OpenGL3.0版本。并且得到了 nv 的支持,其官方网站上提供针对N 卡的 sdk 下载。目前,国内的三维游戏开发技术正处于赶超国外的关键时期,从创意、策划、研究开发与实现,到游戏的运营与维护,都有大量的知识值得学习和摸索。由于 Linux 操作系统平台的大力推广,基于 Linux 的各种应用软件也不断壮大,因此基于跨平台图形库的跨平台三维游戏开发也越来越受重视。OpenGL(open graphics library)是一种独立的平台无关的三维图形开发库,在各种语言下进行主框架开发并结合应用 OpenGL 函数都可以开发出三维游戏。但是由于框架开发的平台相关性使游戏无法跨平台
20、编译运行,因此glut+OpenGL 的方式成了一种很好的选择。但是在对复杂框架和各种媒体的支持方面,glut 并不理想。在 Linux 下可以采用 FLTK 等框架平台技术实现包括按钮在内的比较复杂的框架功能,但是需要专门的 Linux 开发环境,众多的 Window 环境下的 KDE 爱好者明显对此无法适从。相反,SDL(Simple DirectMedia Layer)作为免费的跨平台多媒体应用编程接口,已经被人们广泛用于开发二维游戏,其优秀的消息框架支持、文件支持和声音支持等都使得它成为能与微软 DirectX 匹敌的最为成熟的技术之一。扩展当独立厂商创建一种新技术时,OpenGL 标
21、准允许它们通过“扩展”的方法提供所扩展的功能。然后一个扩展就分成两部分发布:包含扩展函数原型的头文件和作为厂商的设备驱动。每个厂商有一个用于命名它们的新函数和常量的字母缩写。例如,NVIDIA 的缩写(“NV”)用于定义它们的专有函数“ glCombinerPara-meterfvNV()”和它们的常量“GL_NORMAL_MAP_NV”。如果多于一个厂商同意实现相同的扩展功能,那么就用缩写“EXT ”。进一步,架构评审委员会可能“祝福”这个扩展,那么这就被称为一个“标准扩展”,使用缩写“ ARB”。第一个 ARB 扩展是GL_ARB_multitexture。根据官方扩展提升路径,多纹理不再
22、是可选实现的 ARB 扩展,它已经是 OpenGL 1.4以后的核心 API 的一部分。几个库创建在 OpenGL 之上,提供了 OpenGL 本身没有的功能:1)GLU2)GLUT3)GLUI4)GLEW5)GLEE特别是,OpenGL Performer 库 由 SGI 开发并可以在 IRIX、Linux 和 Microsoft Windows 的一些版本上使用,构建于 OpenGL,可以创建实时可视化仿真程序。当开发者需要使用最新的 OpenGL 扩展时,他们往往需要使用 GLEW 或者是 GLEE库提供的功能,可以在程序的运行期判断当前硬件是否支持相关的扩展,防止程序崩溃甚至造成硬件损
23、坏。绑定为了加强它的多语言和多平台特性,已经用很多语言开发了 OpenGL 的各种绑定和移植。最值得注意的是,Java3D 库已经可以利用 OpenGL(另一个选择可能是 DirectX)作为它的硬件加速了。OpenGL 官方网页 1列出了用于Java、Fortran90 、Perl、Pike、Python 、Ada 和 Visual Basic 的多个绑定。OpenGL 3.1规范Khronos Group 在2009年3月又公布了升级版新规范 OpenGL 3.1,也是这套跨平台免费 API 有史以来的第九次更新。OpenGL 3.1将此前引入的 OpenGL 着色语言“GLSL”从1.3
24、0版升级到了1.40 版,通过改进程序增强了对最新可编程图形硬件的访问,还有更高效的顶点处理、扩展的纹理功能、更弹性的缓冲管理等等。宽泛地讲,OpenGL 3.1在3.0版的基础上对整个 API 模型体系进行了简化,可大幅提高软件开发效率。OpenGL 3.1主要新特性: Texture Buffer Objects(纹理缓冲对象)、Uniform Buffer Objects(统一缓冲对象) 、Signed Normalized Textures(符号正常化纹理)、Primitive Restart(基本元素重启)、Instancing(实例化)、CopyBuffer API(拷贝缓冲接口)
25、与 OpenGL 3.1规范同步,OpenGL 架构评审委员会 (ARB)也发布了一个兼容性扩展,能让开发人员在访问 OpenGL 3.1里已经删除的 OpenGL 1.x/2.x 功能,确保应用程序的全面向下兼容性。OpenGL 3.1公布后,业界图形厂商很快予以了大力支持。AMD OpenGL 主管 Suki Samra 表示: “AMD 全面用户 OpenGL API,会在今后的 Radeon 和 FirePro 产品驱动程序中支持 OpenGL 3.1。 ”NVIDIA 市场营销副总裁 Dan Vivoli 表示:“NVIDIA 承诺尽快部署OpenGL 3.1,我们也很自豪地在规范公
26、布同一天放出了自己的测试版驱动程序。 ”市场调研机构 Jon Peddie Research 预测,OpenGL 3.1规范图形硬件的安装规模将超过1亿。AMD、 NVIDIA、S3 Graphics 的显卡驱动目前都已经支持 OpenGL 3.0。高级功能OpenGL 被设计为只有输出的,所以它只提供渲染功能。核心 API 没有窗口系统、音频、打印、键盘/鼠标或其它输入设备的概念。虽然这一开始看起来像是一种限制,但它允许进行渲染的代码完全独立于他运行的操作系统,允许跨平台开发。然而,有些整合于原生窗口系统的东西需要允许和宿主系统交互。这通过下列附加 API 实现:* GLX - X11(包括
27、透明的网络)* WGL - Microsoft Windows* AGL - Apple MacOS另外,GLUT 库能够以可移植的方式提供基本的窗口功能。编程入门OpenGL 作图非常方便,故日益流行,但对许多人来说,是在微机上进行的,首先碰到的问题是,如何适应微机环境。这往往是最关键的一步,虽然也是最初级的。一般的,我不建议使用 glut 包.那样难以充分发挥 windows 的界面上的功能.OpenGL 在 VC 环境下的编程步骤:建立基于 OpenGL 的应用程序框架创建项目:在 file - New 中建立项目,基于单文档,View 类基于 Cview添加库:在 project-Se
28、tting 中指定库初始化:选择 View-Class Wizard,打开 MFC 对话框,添加相应的定义添加类成员说明基于 OpenGL 的程序框架已经构造好,以后用户只需要在对应的函数中添加程序代码即可。下面介绍如何在 VC+ 上进行 OpenGL 编程。 OpenGL 绘图的一般过程可以看作这样的,先用 OpenGL 语句在 OpenGL 的绘图环境 RenderContext (RC)中画好图, 然后再通过一个 Swap buffer 的过程把图传给操作系统的绘图环境 DeviceContext (DC)中,实实在在地画出到屏幕上.下面以画一条 Bezier 曲线为例,详细介绍 VC+
29、 上 OpenGL 编程的方法。文中给出了详细注释,以便给初学者明确的指引。一步一步地按所述去做,你将顺利地画出第一个 OpenGL 平台上的图形来。一、产生程序框架 Test.dswNew Project | MFC Application Wizard (EXE) | “Test“ | OK*注* : 加“”者指要手工敲入的字串二、导入 Bezier 曲线类的文件用下面方法产生 BezierCurve.h BezierCurve.cpp 两个文件:WorkSpace | ClassView | Test Classes| New Class | Generic Class(不用MFC 类)
30、 | “CBezierCurve“ | OK三、编辑好 Bezier 曲线类的定义与实现写好下面两个文件:BezierCurve.h BezierCurve.cpp四、设置编译环境:1. 在 BezierCurve.h 和 TestView.h 内各加上:#include #include #include 2. 在集成环境中Project | Settings | Link | Object/library module | “opengl32.lib glu32.lib glaux.lib“ | OK五、设置 OpenGL 工作环境:( 下面各个操作,均针对 TestView.cpp )1
31、. 处理 PreCreateWindow(): 设置 OpenGL 绘图窗口的风格cs.style |= WS_CLIPSIBLINGS | WS_CLIPCHILDREN | CS_OWNDC;2. 处理 OnCreate():创建 OpenGL 的绘图设备。OpenGL 绘图的机制是: 先用 OpenGL 的绘图上下文 Rendering Context (简称为 RC )把图画好,再把所绘结果通过 SwapBuffer() 函数传给 Window 的 绘图上下文 Device Context (简记为 DC).要注意的是,程序运行过程中,可以有多个 DC,但只能有一个 RC。因此当一个
32、DC 画完图后,要立即释放 RC,以便其它的 DC 也使用。在后面的代码中,将有详细注释。3. m_hDC 是 DC 的句柄,句柄是一个常量,在程序中不会变化。而 m_pDC 是 DC 的指针,是一个不安全的存在,可能导致 OpenGL 绘制不出图像之类的问题。所以建议用句柄代替指针作参数。int CTestView:OnCreate(LPCREATESTRUCT lpCreateStruct)if (CView:OnCreate(lpCreateStruct) = -1)return -1;myInitOpenGL();return 0;void CTestView:myInitOpenGL
33、()m_pDC = new CClientDC(this); /创建 DCASSERT(m_pDC != NULL);m_hDC = m_pDC-GetSafeHdc();if (!mySetupPixelFormat() /设定绘图的位图格式,函数下面列出return;m_hRC = wglCreateContext(m_hDC);/创建 RCwglMakeCurrent(m_hDC, m_hRC); /RC 与当前 DC 相关联 /CClient * m_pDC;HDC m_hDC; HGLRC m_hRC; 是 CTestView 的成员变量BOOL CTestView:mySetupP
34、ixelFormat()/我们暂时不管格式的具体内容是什么, 以后熟悉了再改变格式static PIXELFORMATDESCRIPTOR pfd =sizeof(PIXELFORMATDESCRIPTOR), / size of this pfd1, / version numberPFD_DRAW_TO_WINDOW | / support windowPFD_SUPPORT_OPENGL | / support OpenGLPFD_DOUBLEBUFFER, / double bufferedPFD_TYPE_RGBA, / RGBA type24, / 24-bit color dep
35、th0, 0, 0, 0, 0, 0, / color bits ignored0, / no alpha buffer0, / shift bit ignored0, / no accumulation buffer0, 0, 0, 0, / accum bits ignored32, / 32-bit z-buffer0, / no stencil buffer0, / no auxiliary bufferPFD_MAIN_PLANE, / main layer0, / reserved0, 0, 0 / layer masks ignored;int pixelformat;if (
36、(pixelformat = ChoosePixelFormat(m_hDC, return FALSE;if (SetPixelFormat(m_hDC, pixelformat, return FALSE;return TRUE;3. 处理 OnDestroy()void CTestView:OnDestroy()wglMakeCurrent(m_hDC,NULL); /释放与 m_hDC 对应的 RCwglDeleteContext(m_hRC); /删除 RCif (m_pDC)delete m_pDC; /删除当前 View 拥有的 DCCView:OnDestroy();4. 处理 OnEraseBkgnd()BOOL CTestView:OnEraseBkgnd(CDC* pDC)