OpenGL.docx

上传人:b****3 文档编号:5421488 上传时间:2022-12-16 格式:DOCX 页数:26 大小:58.34KB
下载 相关 举报
OpenGL.docx_第1页
第1页 / 共26页
OpenGL.docx_第2页
第2页 / 共26页
OpenGL.docx_第3页
第3页 / 共26页
OpenGL.docx_第4页
第4页 / 共26页
OpenGL.docx_第5页
第5页 / 共26页
点击查看更多>>
下载资源
资源描述

OpenGL.docx

《OpenGL.docx》由会员分享,可在线阅读,更多相关《OpenGL.docx(26页珍藏版)》请在冰豆网上搜索。

OpenGL.docx

OpenGL

概述

OpenGL(全写OpenGraphicsLibrary)是个定义了一个跨编程语言、跨平台的编程接口的规格,它用于三维图象(二维的亦可)。

OpenGL是个专业的图形程序接口,是一个功能强大,调用方便的底层图形库。

高性能图形算法行业标准

  OpenGL™是行业领域中最为广泛接纳的2D/3D图形API,其自诞生至今已催生了各种计算机平台及设备上的数千优秀应用程序。

OpenGL™是独立于视窗操作系统或其它操作系统的,亦是网络透明的。

在包含CAD、内容创作、能源、娱乐、游戏开发、制造业、制药业及虚拟现实等行业领域中,OpenGL™帮助程序员实现在PC、工作站、超级计算机等硬件设备上的高性能、极具冲击力的高视觉表现力图形处理软件的开发。

  

  DirectX,(DirecteXtension,简称DX)是由微软公司创建的多媒体编程接口。

由C++编程语言实现,遵循COM。

被广泛使用于MicrosoftWindows、MicrosoftXbox和MicrosoftXbox360电子游戏开发,并且只能支持这些平台。

最新版本为DirectX11,创建在最新的Windows7上。

DirectX是一种应用程序接口(API),它可以让windows为平台的游戏或多媒体程序获得更高的执行效率,加强3d图形和声音效果,并提供设计人员一个共同的硬件驱动标准,让游戏开发者不必为每一品牌的硬件来写不同的驱动程序,也降低用户安装及设置硬件的复杂度。

从字面意义上说,Direct就是直接的意思,而后边的X则代表了很多的意思,从这一点上我们就可以看出DirectX的出现就是为了为众多软件提供直接服务的。

注:

API(ApplicationProgrammingInterface,应用程序编程接口)是一些预先定义的函数,目的是提供应用程序与开发人员基于某软件或硬件的以访问一组例程的能力,而又无需访问源码,或理解内部工作机制的细节。

OpenGL只是图形函数库。

DirectX包含图形,声音,输入,网络等模块。

OpenGL稳定,可跨平台使用。

DirectX仅能用于Windows系列平台,包括WindowsMobile/CE系列以及XBOX/XBOX360。

OpenGL的前身是SGI公司为其图形工作站开发的IRISGL。

IRISGL是一个工业标准的3D图形软件接口,功能虽然强大但是移植性不好,于是SGI公司便在IRISGL的基础上开发了OpenGL。

OpenGL的英文全称是“OpenGraphicsLibrary”,顾名思义,OpenGL便是“开放的图形程序接口”。

虽然DirectX在家用市场全面领先,但在专业高端绘图领域,OpenGL是不能被取代的主角。

  OpenGL是个与硬件无关的软件接口,可以在不同的平台如Windows95、WindowsNT、Unix、Linux、MacOS、OS/2之间进行移植。

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

由于OpenGL是图形的底层图形库,没有提供几何实体图元,不能直接用以描述场景。

但是,通过一些转换程序,可以很方便地将AutoCAD、3DS/3DSMAX等3D图形设计软件制作的DXF和3DS模型文件转换成OpenGL的顶点数组。

  在OpenGL的基础上还有OpenInventor、Cosmo3D、Optimizer等多种高级图形库,适应不同应用。

其中,OpenInventor应用最为广泛。

该软件是基于OpenGL面向对象的工具包,提供创建交互式3D图形应用程序的对象和方法,提供了预定义的对象和用于交互的事件处理模块,创建和编辑3D场景的高级应用程序单元,有打印对象和用其它图形格式交换数据的能力。

  OpenGL的发展一直处于一种较为迟缓的态势,每次版本的提高新增的技术很少,大多只是对其中部分做出修改和完善。

1992年7月,SGI公司发布了OpenGL的1.0版本,随后又与微软公司共同开发了WindowsNT版本的OpenGL,从而使一些原来必须在高档图形工作站上运行的大型3D图形处理软件也可以在微机上运用。

1995年OpenGL的1.1版本面市,该版本比1.0的性能有许多提高,并加入了一些新的功能。

其中包括改进打印机支持,在增强元文件中包含OpenGL的调用,顶点数组的新特性,提高顶点位置、法线、颜色、色彩指数、纹理坐标、多边形边缘标识的传输速度,引入了新的纹理特性等等。

OpenGL1.5又新增了“OpenGLShadingLanguage”,该语言是“OpenGL2.0”的底核,用于着色对象、顶点着色以及片断着色技术的扩展功能。

  OpenGL2.0标准的主要制订者并非原来的SGI,而是逐渐在ARB中占据主动地位的3DLabs。

2.0版本首先要做的是与旧版本之间的完整兼容性,同时在顶点与像素及内存管理上与DirectX共同合作以维持均势。

OpenGL2.0将由OpenGL1.3的现有功能加上与之完全兼容的新功能所组成(如图一)。

借此可以对在ARB停滞不前时代各家推出的各种纠缠不清的扩展指令集做一次彻底的精简。

此外,硬件可编程能力的实现也提供了一个更好的方法以整合现有的扩展指令。

  目前,随着DirectX的不断发展和完善,OpenGL的优势逐渐丧失,至今虽然已有3Dlabs提倡开发的2.0版本面世,在其中加入了很多类似于DirectX中可编程单元的设计,但厂商的用户的认知程度并不高,未来的OpenGL发展前景迷茫。

发展历程

  1992年7月,SGI公司发布了OpenGL的1.0版本,随后又与微软公司共同开发了WindowsNT版本的OpenGL,从而使一些原来必须在高档图形工作站上运行的大型3D图形处理软件也可以在微机上运用。

  1995年OpenGL的1.1版本面市,该版本较1.0性能提高许多,并加入了一些新的功能。

包括提高顶点位置、法线、颜色、色彩指数、纹理坐标、多边形边缘标识的传输速度,引入了新的纹理特性等等。

  1997年,Windows95下3D游戏的大量涌现,游戏开发公司迫切需要一个功能强大、兼容性好的3D图形接口,而当时微软公司自己的3D图形接口DirectX3.0功能却是很糟糕。

因而以制作《雷神之锤》等经典3D射击游戏而著名的id公司同其它一些游戏开发公司一同强烈要求微软在Windows95中加入对OpenGL的支持。

微软公司最终在Windows95的OSR2版和后来的Windows版本中加入了对OpenGL的支持。

这样,不但许多支持OpenGL的电脑3D游戏得到广泛应用,而且许多在3D图形设计软件也可以运用支持OpenGL标准的3D加速卡,大大提高其3D图形的处理速度。

  2003年的7月28日,SGI和ARB公布了OpenGL1.5。

OpenGL1.5中包括OpenGLARB的正式扩展规格绘制语言“OpenGLShadingLanguage”。

OpenGL1.5的新功包括:

顶点BufferObject、Shadow功能、隐蔽查询、非乘方纹理等。

  2004年8月,OpenGL2.0版本发布~OpenGL2.0标准的主要制订者并非原来的SGI,而是逐渐在ARB中占据主动地位的3Dlabs。

opengl2.0支持OpenGLShadingLanguage、新的shader扩展特性以及其他多项增强特性。

  2008年8月初Khronos工作组在Siggraph2008大会上宣布了OpenGL3.0图形接口规范,GLSL1.30shader语言和其他新增功能将再次未来开放3D接口发展指明方向。

  OpenGL3.0API开发代号为LongsPeak,和以往一样,OpenGL3.0仍然作为一个开放性和跨平台的3D图形接口标准,在Shader语言盛行的今天,OGL3.0增加了新版本的shader语言:

GLSL1.30,可以充分发挥当前可编程图形硬件的潜能。

同时,OGL3.0还引入了一些新的功能,例如顶点矩阵对象,全帧缓存对象功能,32bit浮点纹理和渲染缓存,基于阻塞队列的条件渲染,紧凑行半浮点顶点和像素数据,四个新压缩机制等等。

  2009年3月又公布了升级版新规范OpenGL3.1,也是这套跨平台免费API有史以来的第九次更新。

OpenGL3.1将此前引入的OpenGL着色语言“GLSL”从1.30版升级到了1.40版,通过改进程序增强了对最新可编程图形硬件的访问,还有更高效的顶点处理、扩展的纹理功能、更弹性的缓冲管理等等。

宽泛地讲,OpenGL3.1在3.0版的基础上对整个API模型体系进行了简化,可大幅提高软件开发效率。

  2009年8月Khronos小组发布了OpenGL3.2,这是一年以来OpenGL进行的第三次重要升级。

该版本仍然延续了OpenGL发展的方向让图形程序开发者能在多种操作系统和平台下更好的利用新的GPU功能。

OpenGL3.2版本提升了性能表现、改进了视觉质量、提高了几何图形处理速度,而且使Direct3D程序更容易移植为OpenGL。

除OpenGL之外,Khronos还将其开发的其它标准进行了协调改进,以求可以在更广泛的领域提供强大的图形功能和计算生态系统,这些标准包括用于并行计算的OpenCL、用于移动3D图形开发的OpenGLES和用于网络3D开发的WebGL。

  2010年7月26日发布OpenGL4.1和OpenGLOpenGLShadingLanguage4.10。

OpenGL4.1提高视觉密集型应用OpenCL™的互操作性,并继续加速计算剖面为核心的支持和兼容性第一次推出的OpenGL3.2,使开发人员能够使用一个简化的API或保留向后兼容现有的OpenGL代码,这取决于他们的市场需求。

  Khronos旗下的OpenGLARB(ArchitectureReviewBoard)工作组推出了GLSL1.5OpenGLShadingLanguage(OpenGL着色语言)的升级版,以及在OpenGL3.2框架下推出了两个新功能,可以让开发者在开发新程序时能够在使用流水线内核特性或兼容性特性之间做出选择,其中兼容性特性会提供与旧版OpenGL之间的兼容性。

特点及功能

  OpenGL是一个开放的三维图形软件包,它独立于窗口系统和操作系统,以它为基础开发的应用程序可以十分方便地在各种平台间移植;OpenGL可以与VisualC++紧密接口,便于实现机械手的有关计算和图形算法,可保证算法的正确性和可靠性;OpenGL使用简便,效率高。

它具有七大功能:

  1.建模:

OpenGL图形库除了提供基本的点、线、多边形的绘制函数外,还提供了复杂的三维物体(球、锥、多面体、茶壶等)以及复杂曲线和曲面绘制函数。

  2.变换:

OpenGL图形库的变换包括基本变换和投影变换。

基本变换有平移、旋转、变比镜像四种变换,投影变换有平行投影(又称正射投影)和透视投影两种变换。

其变换方法有利于减少算法的运行时间,提高三维图形的显示速度。

  3.颜色模式设置:

OpenGL颜色模式有两种,即RGBA模式和颜色索引(ColorIndex)。

  4.光照和材质设置:

OpenGL光有辐射光(EmittedLight)、环境光(AmbientLight)、漫反射光(DiffuseLight)和镜面光(SpecularLight)。

材质是用光反射率来表示。

场景(Scene)中物体最终反映到人眼的颜色是光的红绿蓝分量与材质红绿蓝分量的反射率相乘后形成的颜色。

  5:

纹理映射(TextureMapping)。

利用OpenGL纹理映射功能可以十分逼真地表达物体表面细节。

  6:

位图显示和图象增强图象功能除了基本的拷贝和像素读写外,还提供融合(Blending)、反走样(Antialiasing)和雾(fog)的特殊图象效果处理。

以上三条可使被仿真物更具真实感,增强图形显示的效果。

  7:

双缓存动画(DoubleBuffering)双缓存即前台缓存和后台缓存,简言之,后台缓存计算场景、生成画面,前台缓存显示后台缓存已画好的画面。

  此外,利用OpenGL还能实现深度暗示(DepthCue)、运动模糊(MotionBlur)等特殊效果。

从而实现了消隐算法。

现状

  OpenGL仍然是唯一能够取代微软对3D图形技术的完全控制的API。

它仍然具有一定的生命力,但是SiliconGraphics已经不再以任何让微软不悦的方式推广OpenGL,因而它存在较高的风险。

游戏开发人员是一个有着独立思想的群体,很多重要的开发人员目前仍然在使用OpenGL。

因此,硬件开发商正在设法加强对它的支持。

Direct3D目前还不能支持高端的图形设备和专业应用;OpenGL在这些领域占据着统治地位。

最后,开放源码社区(尤其是Mesa项目)一直致力于为任何类型的计算机(无论它们是否使用微软的操作系统)提供OpenGL支持。

  08年8月正式公布OpenGL3.0版本。

并且得到了nv的支持,其官方网站上提供针对N卡的sdk下载。

  目前,国内的三维游戏开发技术正处于赶超国外的关键时期,从创意、策划、研究开发与实现,到游戏的运营与维护,都有大量的知识值得学习和摸索。

由于Linux操作系统平台的大力推广,基于Linux的各种应用软件也不断壮大,因此基于跨平台图形库的跨平台三维游戏开发也越来越受重视。

OpenGL(opengraphicslibrary)是一种独立的平台无关的三维图形开发库,在各种语言下进行主框架开发并结合应用OpenGL函数都可以开发出三维游戏。

但是由于框架开发的平台相关性使游戏无法跨平台编译运行,因此glut+OpenGL的方式成了一种很好的选择。

但是在对复杂框架和各种媒体的支持方面,glut并不理想。

在Linux下可以采用FLTK等框架平台技术实现包括按钮在内的比较复杂的框架功能,但是需要专门的Linux开发环境,众多的Window环境下的KDE爱好者明显对此无法适从。

相反,SDL(SimpleDirectMediaLayer)作为免费的跨平台多媒体应用编程接口,已经被人们广泛用于开发二维游戏,其优秀的消息框架支持、文件支持和声音支持等都使得它成为能与微软DirectX匹敌的最为成熟的技术之一。

OpenGL3.1规范

  KhronosGroup在2009年3月又公布了升级版新规范OpenGL3.1,也是这套跨平台免费API有史以来的第九次更新。

  OpenGL3.1将此前引入的OpenGL着色语言“GLSL”从1.30版升级到了1.40版,通过改进程序增强了对最新可编程图形硬件的访问,还有更高效的顶点处理、扩展的纹理功能、更弹性的缓冲管理等等。

宽泛地讲,OpenGL3.1在3.0版的基础上对整个API模型体系进行了简化,可大幅提高软件开发效率。

  OpenGL3.1主要新特性:

TextureBufferObjects(纹理缓冲对象)、UniformBufferObjects(统一缓冲对象)、SignedNormalizedTextures(符号正常化纹理)、PrimitiveRestart(基本元素重启)、Instancing(实例化)、CopyBufferAPI(拷贝缓冲接口)……

  与OpenGL3.1规范同步,OpenGL架构评审委员会(ARB)也发布了一个兼容性扩展,能让开发人员在访问OpenGL3.1里已经删除的OpenGL1.x/2.x功能,确保应用程序的全面向下兼容性。

  OpenGL3.1公布后,业界图形厂商很快予以了大力支持。

AMDOpenGL主管SukiSamra表示:

“AMD全面用户OpenGLAPI,会在今后的Radeon和FirePro产品驱动程序中支持OpenGL3.1。

”NVIDIA市场营销副总裁DanVivoli表示:

“NVIDIA承诺尽快部署OpenGL3.1,我们也很自豪地在规范公布同一天放出了自己的测试版驱动程序。

  市场调研机构JonPeddieResearch预测,OpenGL3.1规范图形硬件的安装规模将超过1亿。

AMD、NVIDIA、S3Graphics的显卡驱动目前都已经支持OpenGL3.0。

高级功能

  OpenGL被设计为只有输出的,所以它只提供渲染功能。

核心API没有窗口系统、音频、打印、键盘/鼠标或其它输入设备的概念。

虽然这一开始看起来像是一种限制,但它允许进行渲染的代码完全独立于他运行的操作系统,允许跨平台开发。

然而,有些整合于原生窗口系统的东西需要允许和宿主系统交互。

这通过下列附加API实现:

  *GLX-X11(包括透明的网络)

  *WGL-MicrosoftWindows

  *AGL-AppleMacOS

  另外,GLUT库能够以可移植的方式提供基本的窗口功能。

编程入门

  OpenGL作图非常方便,故日益流行,但对许多人来说,是在微机上进行的,首先碰到的问题是,如何适应微机环境。

这往往是最关键的一步,虽然也是最初级的。

一般的,我不建议使用glut包.那样难以充分发挥windows的界面上的功能.

  OpenGL在VC环境下的编程步骤:

  建立基于OpenGL的应用程序框架

  创建项目:

在file->New中建立项目,基于单文档,View类基于Cview

  添加库:

在project->Setting中指定库

  初始化:

选择View->ClassWizard,打开MFC对话框,添加相应的定义

  添加类成员说明

  基于OpenGL的程序框架已经构造好,以后用户只需要在对应的函数中添加程序代码即可。

  下面介绍如何在VC++上进行OpenGL编程。

OpenGL绘图的一般过程可以看作这样的,先用OpenGL语句在OpenGL的绘图环境RenderContext(RC)中画好图,然后再通过一个Swapbuffer的过程把图传给操作系统的绘图环境DeviceContext(DC)中,实实在在地画出到屏幕上.

  下面以画一条Bezier曲线为例,详细介绍VC++上OpenGL编程的方法。

文中给出了详细注释,以便给初学者明确的指引。

一步一步地按所述去做,你将顺利地画出第一个OpenGL平台上的图形来。

  一、产生程序框架Test.dsw

  NewProject|MFCApplicationWizard(EXE)|"Test"|OK

  *注*:

加“”者指要手工敲入的字串

  二、导入Bezier曲线类的文件

  用下面方法产生BezierCurve.hBezierCurve.cpp两个文件:

  WorkSpace|ClassView|TestClasses|<右击弹出>NewClass|GenericClass(不用MFC类)|"CBezierCurve"|OK

  三、编辑好Bezier曲线类的定义与实现

  写好下面两个文件:

  BezierCurve.hBezierCurve.cpp

  四、设置编译环境:

  1.在BezierCurve.h和TestView.h内各加上:

  #include

  #include

  #include

  2.在集成环境中

  Project|Settings|Link|Object/librarymodule|"opengl32.libglu32.libglaux.lib"|OK

  五、设置OpenGL工作环境:

(下面各个操作,均针对TestView.cpp)

  1.处理PreCreateWindow():

设置OpenGL绘图窗口的风格

  cs.style|=WS_CLIPSIBLINGS|WS_CLIPCHILDREN|CS_OWNDC;

  2.处理OnCreate():

创建OpenGL的绘图设备。

  OpenGL绘图的机制是:

先用OpenGL的绘图上下文RenderingContext(简称为RC)把图画好,再把所绘结果通过SwapBuffer()函数传给Window的绘图上下文DeviceContext(简记为DC).要注意的是,程序运行过程中,可以有多个DC,但只能有一个RC。

因此当一个DC画完图后,要立即释放RC,以便其它的DC也使用。

在后面的代码中,将有详细注释。

  3.m_hDC是DC的句柄,句柄是一个常量,在程序中不会变化。

而m_pDC是DC的指针,是一个不安全的存在,可能导致OpenGL绘制不出图像之类的问题。

所以建议用句柄代替指针作参数。

  intCTestView:

:

OnCreate(LPCREATESTRUCTlpCreateStruct)

  {

  if(CView:

:

OnCreate(lpCreateStruct)==-1)

  return-1;

  myInitOpenGL();

  return0;

  }

  voidCTestView:

:

myInitOpenGL()

  {

  m_pDC=newCClientDC(this);//创建DC

  ASSERT(m_pDC!

=NULL);

  m_hDC=m_pDC->GetSafeHdc();

  if(!

mySetupPixelFormat())//设定绘图的位图格式,函数下面列出

  return;

  m_hRC=wglCreateContext(m_hDC);//创建RC

  wglMakeCurrent(m_hDC,m_hRC);//RC与当前DC相关联

  }//CClient*m_pDC;HDCm_hDC;HGLRCm_hRC;是CTestView的成员变量

  BOOLCTestView:

:

mySetupPixelFormat()

  {//我们暂时不管格式的具体内容是什么,以后熟悉了再改变格式

  staticPIXELFORMATDESCRIPTORpfd=

  {

  sizeof(PIXELFORMATDESCRIPTOR),//sizeofthispfd

  1,//versionnumber

  PFD_DRAW_TO_WINDOW|//supportwindow

  PFD_SUPPORT_OPENGL|//supportOpenGL

  PFD_DOUBLEBUFFER,//doublebuffered

  PFD_TYPE_RGBA,//RGBAtype

  24,//24-bitcolordepth

  0,0,0,0,0,0,//colorbitsignored

  0,//noalphabuffer

  0,//shiftbitignored

  0,//

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 医药卫生 > 基础医学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1