基于OpenGL ES技术的Windows Mobile设备文字图形开发【开题报告+文献综述+毕业论文】

基于OpenGL ES技术的Windows Mobile设备文字图形开发【开题报告+文献综述+毕业论文】

ID:463645

大小:288.49 KB

页数:41页

时间:2017-08-05

上传者:U-944
基于OpenGL ES技术的Windows Mobile设备文字图形开发【开题报告+文献综述+毕业论文】_第1页
基于OpenGL ES技术的Windows Mobile设备文字图形开发【开题报告+文献综述+毕业论文】_第2页
基于OpenGL ES技术的Windows Mobile设备文字图形开发【开题报告+文献综述+毕业论文】_第3页
基于OpenGL ES技术的Windows Mobile设备文字图形开发【开题报告+文献综述+毕业论文】_第4页
基于OpenGL ES技术的Windows Mobile设备文字图形开发【开题报告+文献综述+毕业论文】_第5页
资源描述:

《基于OpenGL ES技术的Windows Mobile设备文字图形开发【开题报告+文献综述+毕业论文】》由会员上传分享,免费在线阅读,更多相关内容在学术论文-天天文库

本科毕业论文系列开题报告电子信息工程基于OpenGLES技术的WindowsMobile设备文字图形开发一、课题研究意义及现状由于近几年来,手机等移动设备性能的快速提高,人们已经不满足于将移动通信设备的应用限制于通讯应用、记事等传统平面应用,而越来越注重移动通信设备功能的多样化、娱乐化,手机3D游戏、GPS导航系统等代表了未来移动设备发展的方向。基于这种情况,Khronos组织于2003年7月发布了专门针对于嵌入式设备图形开发的标准OpenGLES(OpenGLforEmbeddedSystems)。目前的OpenGLES和OpenGL图形加速主流是采用硬件来加速,无论是在桌面计算机还是在嵌入式环境下,硬件加速也是未来3D加速的趋势。但是,目前市面上能提供硬件加速的嵌入式系统还不多,大部分手机、PDA等只有中央处理器,没有显示芯片,仍然不能支持硬件加速,主要依靠软件来实现OpenGLES程序显示加速。软件加速虽然性能上不及硬件加速,但是其丰富的操作系统环境支持,强大的适用性和实用性,低廉的成本等对比硬件加速优势也相当明显。同时,当前嵌入式环境下的3D应用并不多,大部分都是比较简单的3D应用,软件加速也完全可以满足所需要的功能。因此,软件加速到目前为止仍然很有市场。当前的WindowsMobile设备是一个通用的移动开发平台,具备了实时宽带连接的能力。对WindowsMobile设备进行基于OpenGLES的文字图形开发,具有重要的实践意义和广泛的应用前景。二、课题研究的主要内容和预期目标主要内容:OpenGLES(OpenGLforEmbeddedSystems)是OpenGL的子集,主要针对手机、PDA等嵌入式设备而开发。本课题研究WindowsMobile设备上OpenGLES工作的基本原理并用VisualStudio2008进行文字和图形的显示开发。预期目标:理解OpenGLES编程的基本原理,通过VisualStudio2008进行软件开发,编程实现OpenGLES在WindowsMobile设备上的一些基本的功能,包括文字的旋转和尺度变化和3D图形的绘制。三、课题研究的方法及措施 研究方法:本课题将嵌入式系统与OpenGLES相结合,在WindowsMobile设备上实现基于OpenGLES的文字和图形显示功能,并通过VisualStudio2008进行软件开发。措施:首先通过查找资料熟悉OpenGLES技术的基本原理,以及WindowsMobile设备上OpenGLES的使用方法。然后熟悉VisualStudio2008的开发环境,了解C#程序的写法,通过学习和理解纂写所需要的软件需求文档。最后根据软件需求分析,列出所需要实现的功能,并且利用VisualStudio2008来实现,同时在真实设备中进行调试。四、课题研究进度计划2010.10.18~2010.11.19:阅读相关文献并撰写文献综述,完成外文文献的翻译,完成开题报告。2010.11.19~2010.12.31:掌握毕业设计课题基本内容并用VisualStudio2008进行软件开发。2011.1.1~2011.1.21:撰写毕业设计论文,完成初稿。2011.2.22~2011.4.1:对毕业论文进行修改,完成最终稿。2011.4.2~2011.4.15::上交毕业设计相关文档,准备好答辩PPT。五、参考文献[1]刘琪,迟贤书.OpenGL与OpenGLES在开发过程中的异同[J].辽宁工程技术大学学报(自然科学版),2008,27(3):261-262.[2]OpenGLES[EB/OL].http://baike.baidu.com/view/2013442.htm.2010.[3]莫军,陈雷霆.基于OpenGLES的3D图形绘制管线优化问题[J].计算机应用研究,2007,24(1):215-216.[4]DirectX[EB/OL].http://baike.baidu.com/view/15762.htm.2010.[5]DaveShreiver等著,徐波译.OpenGL编程指南[M].北京:机械工业出版社,第六版,2008.[6]刘彦博等著.WindowsMobile平台应用与开发[M].北京:人民邮电出版社,2006.[7]关洪涛.面向32位嵌入式微处理器体系结构的OpenGLES实现技术研究[D].北京:国防科学技术大学学位论文,2009.[8]史扬,吴金平.OpenGLES图形标准在嵌入式系统中的应用[J].工业控制计算机,2008,21(3):27-28.[9]XinbiaoGan,KuiDai,ZhiyingWang.Low-LevelComponentforOpenGLESOrientedHeterogeneousArchitecturewithOptimization[C].InProcessdingsofThe9thInternational ConferenceforYoungComputerScientists,2008.[10]GuRuei-Ting,HunagTse-Chen,HuangWei-Shengetal.Alowcosttile-based3Dgraphicsfullpipelinewithreal-timeperformancemonitoringsupportforOpenGLES[C].IEEEInternationalSymposiumonConsumerElectronics.2007,1-6.[11]Khronos.OpenGL[EB/OL].http://www.open91.org.[12]胡事民,刘利刚,刘永进等.计算机图形学(OpenGL版)[M].北京:清华大学出版社,第3版,2009.[13]李桂琼,张文祥.OpenGL程序设计指南[M].北京:清华大学出版社,2005.[14]徐波.OpenGL超级宝典[M].北京:人民邮电出版社,第三版,2005. 毕业论文文献综述电子信息工程OpenGLES技术综述摘要:目前,在手机等嵌入式设备上的3D游戏开发总是基于一定的图形API来进行。OpenGLES是为嵌入式系统而开发的3D图形绘制编程接口。在基于嵌入式的3D游戏开发过程中,由于硬件资源的相对不足,要得到绘制效果较理想的图形就需要优化3D图形绘制过程。本文对OpenGLES的发展现状作总结。关键字:OpenGL;OpenGLES;DirectX1.引言随着IT行业的飞速发展,WindowsMobile设备越来越受到人们的关注。WindowsMobile设备文字图形开发是目前的热点之一。如何进行WindowsMobile设备文字图形开发,我们需要使用OpenGLES和DirectX。OpenGLES(OpenGLforEmbeddedSystems)是OpenGL的子集,主要针对手机、PDA等嵌入式设备而开发。研究如何在WindowsMobile设备上实现基于OpenGLES技术的文字和图形显示,需要通过VisualStudio2008进行软件实现。2.概述2.1OpenGL的发展历史OpenGL由SGL公司于1992年7月发布,是一款基于桌面操作系统、功能强大、调用方便的底层3D图形库。OpenGL的英文全称是“OpenGraphicsLibrary”,顾名思义,OpenGL便是“开放的图形程序接口”。OpenGL是硬件无关的软件接口,可以在不同的平台,如Windows95、WindowsNT、Unix、Linux、MacOS、OS/2之间进行移植性,获得非常广泛的应用。由于OpenGL是3D图形的底层图形库,没有提供几何实体图元,不能直接用以描述场景。但是,通过一些转换程序,可以很方便地将AutoCAD、3DS等3D图形设计软件制作的DFX和3DS模型文件转换成OpenGL的顶点数组[1]。OpenGL包括了100多种图形处理函数,提供给用户一种直观的编程环境,可以大大简化三维图形程序的编程。它不要求开发者将三维物体模型的数据写成固定的数据格式,允许直接使用自己采集的数据,还可以利用其他不同的格式数据源。不仅极大节省了开发者的时间,也提高了软件开发的效率[2]。2.2OpenGLES的产生 由于近几年来,手机等移动设备性能的快速提高,人们已经不满足于将移动通信设备的应用限制于通讯应用、记事等传统平面应用,而越来越注重移动通信设备功能的多样化、娱乐化,手机3D游戏、GPS导航系统等代表了未来移动设备发展的方向[2]。基于这种情况,Khronos组织于2003年7月发布了专门针对于嵌入式设备图形开发的标准OpenGLES(OpenGLforEmbeddedSystems)。和桌面的Windows的3D应用一样,移动设备要实现3D处理也同样必须透过标准的API。在Windows的发展进程中,有两种互相竞争的API存在,那就是DirectX和OpenGL。而移动设备自从推出以来,就一直采用OpenGLAPI的衍生标准,也就是OpenGLES。OpenGLES继承了许多OpenGL的特色,具有易开发的优点,让开发者能够更轻松的在行动平台上开发内容,由于与OpenGL的很多开发规则相同,透过OpenGL开发的个人计算机游戏也能相对简易的转移到移动设备上[3]。2.3OpenGLES技术的概述OpenGLES(OpenGLforEmbeddedSystems)是OpenGL三维图形API的子集,针对手机、PDA和游戏主机等嵌入式设备而设计。该API由Khronos集团定义推广,Khronos是一个图形软硬件行业协会,该协会主要关注图形和多媒体方面的开放标准。OpenGLES-嵌入式3D图形算法标准,OpenGLES是免授权费的,跨平台的,功能完善的2D和3D图形应用程序接口API,它针对多种嵌入式系统专门设计,包括控制台、移动电话、手持设备、家电设备和汽车[4]。它是桌面OpenGL的子集,创造了软件与图形加速器之间灵活强大的底层交互接口。OpenGLES包含浮点运算和定点运算系统描述以及EGL针对便携设备的本地视窗系统规范。OpenGLES1.X面向功能固定的硬件所设计并提供加速支持、图形质量及性能标准。OpenGLES2.X则提供包括遮盖器技术在内的全可编程3D图形算法。OpenGLES-SC专为有高安全性需求的特殊市场精心打造[5]。OpenGLES是从OpenGL裁剪定制而来的,去除了glBegin/glEnd,四边形(GL_QUADS)、多边形(GL_POLYGONS)等复杂图元等许多非绝对必要的特性。经过多年发展,现在主要有两个版本:OpenGLES1.x针对固定管线硬件,OpenGLES2.x针对可编程管线硬件。OpenGLES1.0以OpenGL1.3规范为基础,OpenGLES1.1以OpenGL1.5规范为基础,它们分别又支持common和commonlite两种profile。liteprofile只支持定点实数,而commonprofile既支持定点数又支持浮点数[6]。OpenGLES2.0则是参照OpenGL2.0规范定义的,commonprofile发布于2005年8月,引入了对可编程管线的支持。 2.4基于OpenGLES技术3D图形的绘制过程上图是OpenGLES3D图形的绘制过程。图中顶点部分是几何学所处理的顶点世界,像素部分是存储在缓冲区里。CPU部分负责图形绘制过程中几何数据进出的转换。几何存储部分是连接设备驱动内存和图形内存的桥梁,它负责在处理过程中临时保存顶点的几何数据,准备后面的处理。OpenGLES3D的几何存储支持的数据类型有Byte,Short,Fixed和Float。几何处理器部分负责顶点和纹理坐标的对应转换。几何处理器与光栅器之间存在着一种称之为浮点型数据处理的结构,通过它把各种数据类型的坐标值转换成内部浮点数形式。光栅器要将每一个三角形的边及内部区域光栅化,同时要负责图形的像素插值。片段处理器就是分析像素片段的阴影、着色,然后把这些结果放入帧缓冲。纹理存储就是采用某种格式保存纹理数据。OpenGLES3D支持的格式有每像素8位,16位和32位。帧缓冲所处理的图形数据直接提供给LCD显示设备所用。外置存储芯片用于帧缓冲、VBO(VertexBufferObject)和纹理数据。OpenGLES3D的驱动程序为这三者在外置存储芯片上分配空间[7]。2.5DirectX的概述DirectX(DirecteXtension,简称DX)是由微软公司创建的多媒体编程接口。由C++编程语言实现,遵循COM。被广泛使用于MicrosoftWindows、MicrosoftXbox和MicrosoftXbox360电子游戏开发,并且只能支持这些平台。DirectX是一种应用程序接口(API),是计算机计算图形的一种规则,相当于一个通用编译器,就像街道中的十字路口,可以通往四面八方。同样,它也可以让各种适用于DirectX的游戏或者多媒体文件在各种型号的硬件上运行或播放[8]。它可以让Windows为平台的游戏或多媒体程序获得更高的执行效率,在这个规则中大量包含着现实实例的抽象集合,意味着它具有强大的灵活性和多态性。然而其抽象性主要表现在参数的自定义和运算结构的随意组合,但其运算结构的坚固(独特/固定的运算规则)也使其具有很强的稳定性[9]。  DirectX加强3D图形和声音效果,并提供设计人员一个共同的硬件驱动标准,让游戏开发者不必为每一品牌的硬件来写不同的驱动程序,也降低了用户安装和设置硬件的复杂度。从字面意义上说,Direct就是直接的意思,而后边的X 则代表了很多的意思,从这一点上我们就可以看出DirectX的出现就是为了为众多软件提供直接服务的[10]。3.三种技术的比较3.1OpenGL和OpenGLES的区别在传统的PC机上,通常采用OpenGL来构造三维图形引擎,但嵌入式设备并不支持OpenGL,所以这里采用OpenGL在嵌入式设备上的子集OpenGLES来构建图形引擎。OpenGLES是特别针对3D手持周边应用而开发的绘图API,由Khronos集团所制定。它在嵌入式设备中所扮演的角色和OpenGL在PC上扮演的一样,提供底层的显示函数以供调用[11]。但是,OpenGLES也必须考虑到移动平台新层面的一些问题,其中最重要的可算是内存应用和功耗问题。这使得该API需要尽可能小地占用磁盘和内存空间;同时,数据总量的交换也必须保持最小化,以此来保证功耗越低越好[12]。OpenGL标准是不依赖于窗口系统的,这提供了很强的平台无关性,但也使得我们在Windows下要用wgl初始化,在X-Window下就得学会用xgl,而MacOSX上则是agl。手持及嵌入式市场的平台种类不计其数,单是学习各家手机操作系统的接口就是很大的负担了,更不用说总有一些有志于支持各种尺寸平台的软件开发者[13]。所以,OpenGLES提供了WindowSurface的抽象,使得移植工作可以基本局限在重新实现建立窗口的过程。3.2OpenGLES与DirectX的区别OpenGL只是图形函数库。DirectX包含图形、声音、输入和网络等模块。OpenGL稳定,可跨平台使用。DirectX仅能用于Windows系列平台,包括WindowsMobile/CE系列以及XBOX/XBOX360[14]。4.总结OpenGLES不只是OpenGL的简化版,他是在OpenGL的基础上,按照嵌入式设备的所有条件设计的底层图形库。熟练掌握OpenGLES技术对于开发WindowsMobile设备文字图形起着至关重要的作用。同时该技术也将成为未来开发者必备的一门技能。参考文献[1]刘琪,迟贤书.OpenGL与OpenGLES在开发过程中的异同[J].辽宁工程技术大学学报(自然科学版),2008,27(3):261-262.[2]OpenGLES[EB/OL].http://baike.baidu.com/view/2013442.htm.2010. [3]莫军,陈雷霆.基于OpenGLES的3D图形绘制管线优化问题[J].计算机应用研究,2007,24(1):215-216.[4]DirectX[EB/OL].http://baike.baidu.com/view/15762.htm.2010.[5]DaveShreiver等著,徐波译.OpenGL编程指南[M].北京:机械工业出版社,第六版,2008.[6]刘彦博等著.WindowsMobile平台应用与开发[M].北京:人民邮电出版社,2006.[7]关洪涛.面向32位嵌入式微处理器体系结构的OpenGLES实现技术研究[D].北京:国防科学技术大学学位论文,2009.[8]史扬,吴金平.OpenGLES图形标准在嵌入式系统中的应用[J].工业控制计算机,2008,21(3):27-28.[9]XinbiaoGan,KuiDai,ZhiyingWang.Low-LevelComponentforOpenGLESOrientedHeterogeneousArchitecturewithOptimization[C].InProcessdingsofThe9thInternationalConferenceforYoungComputerScientists,2008.[10]GuRuei-Ting,HunagTse-Chen,HuangWei-Shengetal.Alowcosttile-based3Dgraphicsfullpipelinewithreal-timeperformancemonitoringsupportforOpenGLES[C].IEEEInternationalSymposiumonConsumerElectronics.2007,1-6.[11]Khronos.OpenGL[EB/OL].http://www.open91.org.[12]胡事民,刘利刚,刘永进等.计算机图形学(OpenGL版)[M].北京:清华大学出版社,第3版,2009.[13]李桂琼,张文祥.OpenGL程序设计指南[M].北京:清华大学出版社,2005.[14]徐波.OpenGL超级宝典[M].北京:人民邮电出版社,第三版,2005. 本科毕业设计(20届)基于OpenGLES技术的WindowsMobile设备文字图形开发摘要 随着移动设备的快速发展,人们对局限于电话和短信等传统平台应用已经不再满足,而是越来越注重使移动设备的功能更加娱乐化、多样化,手机3D游戏、导航系统等应用展现了未来的发展方向。3G时代正慢慢融入我们的日常生活,各种各样的手机操作系统,也成为开发商们相互竞争的资本。好的操作系统不仅可以为开发商牟取高利润,还能为用户提供最简单,最周到的服务。开发手机系统必须掌握各种技术,本文将介绍如何基于OpenGLES技术对移动设备上的文字图像进行开发。当前的WindowsMobile设备是一个通用的移动开发平台,具备了实时宽带连接的能力。对WindowsMobile设备进行基于OpenGLES的文字图形开发,具有重要的实践意义和广泛的应用前景。本课题首先介绍了OpenGLES技术,以及WindowsMobile设备上OpenGLES的使用方法。然后熟悉VisualStudio2008的开发环境,了解C#程序的写法,通过学习和理解纂写所需要的软件需求文档。最后根据软件需求分析,列出所需要实现的功能,并且利用VisualStudio2008来实现,同时在真实设备中进行调试。关键词:移动设备;OpenGLES;文字图形开发 AbstractWiththecontinuousdevelopmentofmobiledevices,peoplearenotonlysatisfiedwiththeapplicationofmobilecommunicationsequipmentinthetraditionalplatformsuchascommunication,note,butalsointhehefuturedevelopmentdirectionofmobiledevicessuchasdiversificationofmobilecommunicationsdevicecapabilities,entertainment,mobilegames,navigationsystemsetc.3Gcommunicationtechnologyisgraduallyintegratedintoourdailylives.Avarietyofmobileoperatingsystemsarebecomingcompetingcapitalofdevelopers.Agoodoperatingsystemcannotonlygethighprofitsforthedevelopers,butalsotoprovideuserswiththesimplest,mostattentiveservice.Developmentofmobilesystemsneedsvarioustechniques.ThispaperdescribesthathowtodeveloptextandpictureapplicationbasedonOpenGLEStechnologyonthemobiledevice.ThecurrentWindowsMobiledeviceisauniversalmobiledevelopmentplatformwithreal-timebroadbandconnectivitycapabilities.WindowsMobiledevicesbasedontheOpenGLESwithtextgraphicsdevelopmenthasimportantpracticalsignificanceandwideapplicationprospects.Firstofall,thesubjectofOpenGLEStechnologyandOpenGLESonWindowsMobiledevicesisintroduced.ThenwearefamiliarwithVisualStudio2008developmentenvironment,understandingofC#programwrittenbylearningandunderstandingsoftwarerequirementsdocumentation.Finally,accordingtosoftwarerequirementsanalysis,listingthefunctionsneededtoimplementandimplementtheminVisualStudio2008,anddebuginarealdevice.Keyword:mobiledevices;OpenGLES;textgraphicsdevelopment 目录1 引言11.1研究背景11.2研究内容11.3研究现状22OPENGLES技术的开发原理42.1OpenGLES的介绍42.2OpenGLES的优势52.3OpenGLES库的结构化设计62.3.1模块化结构设计62.3.2多级结构设计73WINDOWSMOBILE设备文字和图形开发93.1开发环境VisualStudio2008介绍93.2OpenGLES的开发概述93.2.1OpenGLES底层核心构件设计93.2.2OpenGLESAPI统计分析103.2.3OpenGLES底层构件的提取103.3基于OpenGLES技术的程序开发133.3.1图形程序开发133.3.2文字程序开发194总结22致谢23参考文献24附录应用程序源代码26 1 引言随着WindowsMobile设备的迅速发展,文字图形开发也自然成为目前的一个热点。开发此技术需要用到OpenGLES技术。OpenGL是由SGL公司于1992年7月发布,是一款基于桌面操作系统、功能强大、调用方便的底层3D图形库。由于目前,手机等移动设备的迅速提高,人们对局限于电话和短信等传统平台应用已经不再满足,而是越来越注重使移动设备的功能更加娱乐化、多样化,手机3D游戏、导航系统等应用展现了未来的发展方向。Khronos组织于二零零三年七月发布了针对于嵌入式设备图形开发的标准OpenGLES。OpenGLES是OpenGL的精简子集,针对PDA、手机和游戏主机等嵌入式设备而设计。1.1研究背景图像软件经过了一个从无序到有序,从专业化到标准化的过程。早期的图像编程开发并没有通用的图像标准实现,基本由各个组织本身开发的图形函数实现对某一专用图形硬件的编程。这种方式开发的图形应用程序依赖于图形硬件和某一操作系统下实现的专用图形库,开发效率低,可移植性差。一九九四年由SGI公司组织,在SGI的图形库标准之上制定了OpenGL标准,很多图形软件系统和标准均根据OpenGL开发,因此OpenGL被广为使用并且独立于图形硬件设备、窗口系统和操作系统,很多厂家已把OpenGL集成到各种操作系统和窗口系统等。目前被国际很多知名的公司认可并使用,OpenGL成为了一种工业图形标准。在OpenGL基础上建立的OpenGLES继承了成熟稳定的优点,图形的标准是一个动态发展过程,OpenGLES不排除对其进行扩展,事实上它鼓励对其进行创造性的扩展。随着应用的深入和认识的提高,OpenGLES图形标准必定在广度和深度上将进一步得到发展[1]。1.2研究内容OpenGLES简单化了模型的描述。例如:使用OpenGL绘制一个三角形。利用OpenGLES绘制时,在OpenGLES中取消了四边形、多边形等复杂图元非绝对必须的特性,这些复杂图元可以通过绘制多个三角形来间接绘制。另外OpenGL ES在纹理、灯光等多方面也进行了优化,对原有的OpenGL函数进行了删改,并添增了一些更有助于嵌入式环境开发的函数[2]。本文通过VisualStudio2008进行软件开发,利用C#托管代码编程实现OpenGLES在WindowsMobile设备上的一些基本的功能,包括文字的旋转和尺度变化和3D图形的绘制。1.3研究现状目前,在嵌入式设备上(如手机)的3D游戏开发总是基于一些的图形API来进行的,OpenGLES便是其中性能较为卓越的一种API,它被广泛地使用在很多手机游戏中。因为目前手机硬件性能相对低下,游戏总会因为一些软硬件的限制,影响游戏画面的效果和展现力。为了增强游戏的展现力,有必要对图形绘制过程的优化进行深入研究。基于WLAN和GPRS/CDMA等各种无线通信技术的多媒体服务在飞速的发展,人们对随身设备的多媒体功能要求越来越迫切,但目前移动设备的3D功能多项对较弱。现在的3D图形引擎不能满足多样化的移动平台和3D图形应用需求[3]。和桌面的操作系统的3D应用相似,移动设备需要实现3D处理也必须透过标准的API。在Windows的发展进程中,有两种的API存在,那便是DirectX和OpenGL。而移动设备自从推出以来,就一直使用OpenGLAPI的衍生标准,也就是OpenGLES。OpenGLES继承了很多OpenGL的特点,具备了易开发的优点,让使用者能够更加轻松的在开发平台上开发程序,由于与OpenGL的许多开发规则相似,透过OpenGL开发的个人计算机游戏也能相对简易的在移动设备上使用。在传统的个人计算机上,一般使用OpenGL来构建三维图形的引擎,但是由于在嵌入式设备中不支持OpenGL,所以这里采用了OpenGL在嵌入式设备上的子集OpenGLES来构建图形引擎。OpenGLES是专门针对3D手机周边应用而开发的绘图API,由Khronos公司所定制。它在嵌入式设备中所扮演的和OpenGL在个人计算机上扮演的一样角色,提供底层的显示函数以便调用。OpenGLES也必须考虑到移动平台的一些问题,其中最重要的应该是内存的应用和功耗的问题。为解决此问题必须使API尽量小地占用磁盘和内存的空间;从而使得数据总量的交换保持最小化,并保证功耗越小越好。 OpenGL标准不是依赖于窗口系统的,这提供了很好的平台无关性。手持及嵌入式市场的平台种类多种多样,仅仅是了解各家手机操作系统的接口就是十分大的工程了,更加不用说总有一些有志于支持各种尺寸平台的软件研发者。所以,OpenGLES提供了WindowSurface的抽象,从而使得移植工作可以基本限制在重新实现一下构建窗口的过程[4]。2OpenGLES技术的开发原理 2.1OpenGLES的介绍OpenGLES三维图形库是由OpenGL三维图形库简化而得的子集,在OpenGLARB和Khronos两个官方组织的共同合作下构建,它主要是针对三维图形的应用,有较为完整功能的低层函数库,在大多数主要的嵌入式平台上都是可行的。OpenGLES作为OpenGL的一个精简子集,其功能主要是专门针对嵌入式平台。它只需要使用大概50KB的内存,它的功能与OpenGL非常相近。它与OpenGL在功能上最为明显的区别是没有OpenGL构建模型技术中的分组指令。在OpenGLES的使用中,程序员仅仅需要对一个模型的颜色、纹理、顶点、法线坐标定义数组。另一项重要的区别是GLUT函数库和GLU函数库。GLU函数库具有很多便利的函数,例如生成基本模型、设立观景量、定位照相机和纹理的MIP映射。OpenGLES和OpenGL有许多不同处,为了能够更好地匹配在嵌入式平台上有限的计算机硬件,不仅支持浮点数,同时还支持定点数。其十六定点数的数据类型包括2个整型数据类型,第1个十六位整型为整数部分,第2个十六位整型为小数部分。采用定点数数据类型的顶点定义的模型和采用浮点数数据类型的顶点定义的模型相比,前者更加方便快捷。OpenGLES分为三种简表,通用简表不仅仅支持浮点数同时也支持定点数,它能够针对游戏机和移动电话等这些功能更加强大的设备。轻量级的通用简表仅仅支持定点数,它更加针对基本的设备。在那些以安全为关键点的嵌入式应用的情况下测试和认证是至关重要的[5]。OpenGLES使用点、线段或三角形这些图元来构建模型,OpenGLES没有四边形和多边形图元,这类图元需要用三角形来构造。OpenGLES是一个迁移的标准,它有三个角色。OpenGLES2.0是基于OpenGL2.0,OpenGLES1.1是基于OpenGL1.5,OpenGLES1.0是基于OpenGL1.3[6]。OpenGLES1.1支持mipmap生成、多重纹理和在点渲染上提供更多的控制。OpenGLES2.0是一个更全面的改变,它利用一个凭借渲染模型为基础的可编程着色器,只支持浮点运算。这种设计的动机是为移动设备将在短时间内具有与目前的台式电脑和笔记型电脑同样强大的渲染能力。 2.2OpenGLES的优势OpenGLES是一个从OpenGL精选出来的低阶、低容量的先进绘图用API。它在研发方面有很多优势。OpenGLES是产业标准和完全免费的。所有人都可以生产制作并贩售兼容于OpenGLES的各种产品。在大部分的产业里,OpenGLES是一种开放、中立与跟平台兼容的绘图标准协议。具体而言,OpenGLES使研发人员能够更加专注在产品的内容上,从而不需要花费太多的精力在如何适应各种平台上。OpenGLES可以从软件渲染到硬件渲染进行非常全面的过渡。所定义的绘图标准能够在任何平台下使用,其中包括了纯硬件的绘图芯片、运用处理器功能的纯软件或是CPU与硬件的混合平台。这说明软件研发者目前只要通过开发一个3D引擎后,就可以和新版本的标准达到全面兼容。OpenGLES可以在小容量与低耗电量的硬件设备上使用。嵌入式的硬件规格有非常多的不同,从50MHz、lMBRAM的手机到400Mhz、64MBRAM的PDA都有。对于这些不同的平台,OpenGLES只要非常小的储存容量、最低的频宽便可同时适应整数与浮点的运算。因而使用者可以轻易的将它放入系统里。OpenGLES有全面的文档支持。因此OpenGLES是基于OpenGL所构建的,所以它有许多的教学资料与很多的程序范例可供参照,这使得OpenGLES可以很容易地被使用。根据OpenGLES的优势,开发人员己经可以为手机甚至大型计算机制作程序范例[7]。OpenGLES支持延伸和将来的发展。OpenGLES充许通过各种延伸指令的使用。透过API中的延伸指令集,可以将硬件的特殊应用与OpenGLES整合,或者在特殊平台上使用厂商特制的功能。当这些功能广泛被使用后,将有可能成为新一代的标准。OpenGLES更加易于使用。凭借OpenGL,OpenGLES具有直觉性运用与逻辑性命令的架构。2.3OpenGLES库的结构化设计OpenGL ES编程接口是OpenGL图形结构面向嵌入式应用的精简子集,组成部分主要分为:与操作系统相关的部分,与window窗口管理相关的部分,与图形加速驱动器相关的部分,与LCD显示驱动器相关的部分以及OpenGLES核心部分。由此得出结论,OpenGLES库的构建必须使用结构化设计模式,其基本思路就是使OpenGLES系统的设计层次化,即把OpenGLES系统从上而下逐步分解为很多个彼此独立而又有一定关联的组成部分,这些组成部分称作层次模块,由抽象到具体,逐层将OpenGLES系统分解为一个多层面的、具有相对独立功能的模块组成的系统[8]。2.3.1模块化结构设计该结构的设计思路是利用面向对象的设计方法对OpenGLESAPI进行分类,重用现有的OpenGLES库,取代其中与目标类相关的API函数,如图2-1所示。其中,OpenGLESAPI大概可以分为与顶点、片元相关的API接口,与颜色、光照、纹理相关的API接口和与着色相关的API接口。因此可以得出结论,结构设计的主要思路就是先一步一步地实现与目标相关的类,然后再用定制的类接口取代OpenGLESAPI库中的对应类的编程接口[9]。OurImplementation CustomedAPICustomedAPICustomedAPIOringinalAPIShaderFramentVertexTextureLightingColor图2-1模块设计示意图2.3.2多级结构设计面向OpenGLES设计将采用图2-1所示的多级设计模式,图2-1为ESAPI层次结构图,OpenGLES被划分为如表2-1所示。这个结构设计的主要思路为低级API层对高级API层是透明的,一层层实现OpenGLESAPI,对OpenGLESAPI进行逐一分级,高一级的API层依赖于低一级的API层,其原理示意图如图2-2所示[10]。Add-onsExensionAPIsCoreAPIsBuilt-instructures图2-2ESAPI层次结构图表2-1OpenGLES函数的分类 Built-inStructures层次该级层次的函数虽然不是OpenGLES提供的标准API接口,但它们是OpenGLESAPI接口实现过程中经常调用的基本内置函数。如:三角函数,矩阵变换函数等。CoreAPIs层次该层次的函数都为OpenGLESAPI接口函数,可以认为是其它API函数实现的基础。如颜色类、光照类、纹理类处理函数。ExtensionAPIs层次该级层次的函数均为ESAPI接口函数,它们是基于核心级API接口的一部分扩展接口。Add-ons层次该级层次的函数都为OpenGLESAPI的标准接口或扩展接口,它们是基于核心级API接口和扩展级的API扩展接口。 3WindowsMobile设备文字和图形开发3.1开发环境VisualStudio2008介绍VisualStudio2008是一套十分完整的开发工具,该开发环境用于生成ASP.NETWeb应用程序、移动应用程序和桌面应用程序。利用此集成开发环境可以共享工具且有助于创建一个混合语言解决方案。此外,通过这个框架可使用简化ASPWeb应用程序和XMLWebServices开发的关键技术[11]。VisualStudio2008作为相当全面的开发工具提供了调试功能、调试功能、数据库功能以及创新功能,帮助开发者在各种平台上快速创建当前最先进的应用程序。VisualStudio2008包括各种增强功能,例如可视化设计器、对Web开发工具的大量改进,以及能够加速开发和处理所有类型数据的语言增强功能。VisualStudio2008为开发者提供了任何相关的工具和框架支持,帮助构建令人印象深刻并支持AJAX的Web应用程序。开发人员能够运用这些丰富的客户端和服务器端框架轻松地构建以客户为中心的Web应用程序,这些应用程序可以集成任何后端数据提供程序,在所有目前的浏览器内运行并完全访问ASP.NET应用程序服务和Microsoft平台[12]。3.2OpenGLES的开发概述3.2.1OpenGLES底层核心构件设计随着OpenGLES规范的渐渐发展和完善,OpenGLES推出了面对固定编程管线功能的OpenGLES1.x和面对可编程管线功能的OpenGLES2.X。OpenGLES底层核心构件的设计思路就是:通过对OpenGLES1.1和OpenGLES2.0中标准的API接口的实现源代码的分析,统计标准API接口实现过程中调用底层函数的频度,从而确定出OpenGLES实现的核心子集。精简的OpenGLES实现的核心子集不仅是OpenGL1.x的核心子集,同时也是OpenGL2.x的核心子集。OpenGLES可以基于OpenGLES底层核心构件定制不同要求的OpenGLES来实现版本[13]。 3.2.2OpenGLESAPI统计分析由图3-1可知,glMultiTexCoord4f的实现最终主要依赖于函数或结构实体,这些函数或结构实体可以归属为OpenGLES实现的一个子集。OpenGLES底层核心构件的提取就是基于对OpenGLESAPIs实现过程中调用的函数或结构实体的使用频度。OpenGLESAPI统计分析的第一步就是明确每一个OpenGLESAPI接口的实现原理,通过API调用类图可以显示其具体的实现过程,从而为进一步统计提供可信的依据。图3-2以OpenGLESAPI接口glMultiTexCoord4f为例分析其实现原理与过程。OpenGLES底层核心构件的提取是建立在对OpenGLESAPIs统计分析的工作上的[14]。3.2.3OpenGLES底层构件的提取根据函数和结构实体的依赖关系和依赖度的统计原理,分析OpenGLES库,依赖度大于等于10次的函数或结构实体的统计结果如表3-1所示。其中比例分布情况如图3-1所示。1.算术运算类:主要包括片元和定点相关处理的浮点和定点运算函数实体。2.矩阵运算类:主要包括OpenGLES的坐标变换、光照处理、纹理处理以及颜色变换等相关特殊图形图像效果处理的函数和结构实体。3.矢量结构类:主要包括OpenGLES内常用的一些数据结构。4.其它函数或结构实体:主要包括一些特殊效果处理的函数实体[15]。 OGLES*glmultiTexCoord4f()context*glmultiTexCoord4f()《utility》EGL-FixedFloatcontext*glmultiTexCoord4f()Vec4Dcontext*Normal3x()Vec3D图3-1glMultiTexCoord4f示例类图 表3-1依赖度≥10的函数或结构实体SelectedStructuresDegree(fs)FunctionEntityDataTypeEGL_CLAMP86Color84EGL_FixedFromFloat64EGL_Mul48Matrix4x4.inverse32Matrix4x429EGL_inverse27Mutlmatrix16RebuildMatrices15CurrentMatrix13VEC4D12EGL_FloatFromFixed12VEC3D11CopyFixed11LoadMatrix11GetCurrentTexture11GetTexture10EnableScissorTest10如图3-2所示,通过对OpenGLESAPIs的统计分析OpenGL底层核心构件主要包括以下几个主要的组成部分:1算术运算类:与顶点和片元处理有关。2矩阵运算类:与坐标变换、光照、颜色、纹理效果处理有关。3矢量的结构类:OpenGLES内置的数据结构[16]。 23%Matrix21%Vec48%Fixed8%Other图3-2函数或结构实体分布图3.3基于OpenGLES技术的程序开发3.3.1图形程序开发1.创建OpenGLSample工程,相关代码如下:namespaceOpenGLSample{publicpartialclassForm1:ApplicationForm{[DllImport("coredll")]externstaticIntPtrGetDC(IntPtrhwnd);EGLDisplaymyDisplay;EGLSurfacemySurface;EGLContextmyContext;publicForm1(){InitializeComponent();2.显示界面的设定与初始化,即获取Display(EGLDisplay),相关代码如下:myDisplay=egl.GetDisplay(newEGLNativeDisplayType(this));intmajor,minor; egl.Initialize(myDisplay,outmajor,outminor);3.设定EGLConfig(EGLConfig),相关代码如下:EGLConfig[]configs=newEGLConfig[10];int[]attribList=newint[]{egl.EGL_RED_SIZE,5,egl.EGL_GREEN_SIZE,6,egl.EGL_BLUE_SIZE,5,egl.EGL_DEPTH_SIZE,16,egl.EGL_SURFACE_TYPE,egl.EGL_WINDOW_BIT,egl.EGL_STENCIL_SIZE,egl.EGL_DONT_CARE,egl.EGL_NONE,egl.EGL_NONE};intnumConfig;if(!egl.ChooseConfig(myDisplay,attribList,configs,configs.Length,outnumConfig)||numConfig<1)thrownewInvalidOperationException("Unabletochooseconfig.");EGLConfigconfig=configs[0];4.构造Surface,相关代码如下:mySurface=egl.CreateWindowSurface(myDisplay,config,Handle,null);5.创建Context(EGLContext),相关代码如下:myContext=egl.CreateContext(myDisplay,config,EGLContext.None,null);6.设定绘制环境RenderContext,相关代码如下:egl.MakeCurrent(myDisplay,mySurface,mySurface,myContext);7.初始化OpenGLES,相关代码如下:gl.ClearColor(0,0,0,0);InitGL();8.设定绘影模式为平滑,相关代码如下:gl.ShadeModel(gl.GL_SMOOTH);gl.ClearColor(1.0f,1.0f,1.0f,0.5f); 其显示效果为白色背景,如图3-3所示。图3-3白色背景9.将gl.ClearColor(1.0f,1.0f,1.0f,0.5f)改为gl.ClearColor(0.0f,0.0f,0.0f,0.5f),则由白色背景改为黑色背景,显示效果如图3-4。图3-4黑色背景 10.设定混合函数,並设定源因子为GL_SRC_ALPHA,目的因子为GL_ONE_MINUS_SRC_ALPHA,相关代码如下:gl.BlendFunc(gl.GL_SRC_ALPHA,gl.GL_ONE_MINUS_SRC_ALPHA);11.所做的深度测试为GL_LEQUAL,深度小或相等的时候也渲染,相关代码如下:gl.DepthFunc(gl.GL_LEQUAL);系统对测试进行修正:gl.Hint(gl.GL_PERSPECTIVE_CORRECTION_HINT,gl.GL_NICEST);12.设定图形要显示的区域,相关代码如下:gl.Viewport(ClientRectangle.Left,ClientRectangle.Top,ClientRectangle.Width,ClientRectangle.Height);13.设定目前工作矩阵为Projection矩阵,相关代码如下:gl.MatrixMode(gl.GL_PROJECTION);14.将Projection矩阵初始化,相关代码如下:gl.LoadIdentity();15.设定图形gluPerspective透视投影,相关代码如下:gluPerspective(45,(float)ClientSize.Width/(float)ClientSize.Height,.1f,100);float[]triangle=newfloat[]{0.0f,1.0f,0.0f,-1.0f,-1.0f,0.0f,1.0f,-1.0f,0.0f};float[]colors=newfloat[]{1.0f,0.0f,0.0f,9,0.0f,1.0f,0.0f,0,0.0f,0.0f,1.0f,0};16.平移函式,表示x,y,z偏移量,相关代码如下:gl.Translatef(0.0f,0.0f,-6.0f);17.旋转函式,参数x,y,z代表一个向量,指旋转的轴参数;myRotation表示旋转逆时针的角度,相关代码如下:gl.Rotatef(myRotation,0.0f,1.0f,0.0f);fixed(float*trianglePointer=&triangle[0],colorPointer=&colors[0])18.启动Client阵列绘制模式为GL_VERTEX_ARRAY,相关代码如下:gl.EnableClientState(gl.GL_VERTEX_ARRAY);19.设定指标阵列trianglePointer,相关代码如下:gl.VertexPointer(3,gl.GL_FLOAT,0,(IntPtr)trianglePointer); 20.启动Client阵列绘制模式为GL_COLOR_ARRAY,相关代码如下:gl.EnableClientState(gl.GL_COLOR_ARRAY);21.设定指标阵列colorPointer,相关代码如下:gl.ColorPointer(4,gl.GL_FLOAT,0,(IntPtr)colorPointer);22.绘制无填充三角形,相关代码如下:gl.DrawArrays(gl.GL_TRIANGLES,0,3);其显示效果如图3-5所示。图3-5无填充三角形显示效果23.关闭Client阵列绘制模式GL_VERTEX_ARRAY,相关代码如下:gl.DisableClientState(gl.GL_VERTEX_ARRAY);24.关闭Client阵列绘制模式GL_COLOR_ARRAY,相关代码如下:gl.DisableClientState(gl.GL_COLOR_ARRAY);25.透视投影函式,其中的参数含义如下:lgluPerspective:透视投影;lfovy:可视角,范围从0到180度;laspect:设定投影平面宽与高的比例(double)w/h;lnear:投影近点,表示可视区域的最近距离;lfar:投影远点,表示可视区域的最远距离;相关代码如下:voidgluPerspective(floatfovy,floataspect,floatnear,floatfar) {floatxmin,xmax,ymin,ymax;ymax=near*(float)Math.Tan(fovy*3.1415962f/360.0);ymin=-ymax;xmin=ymin*aspect;xmax=ymax*aspect;gl.Frustumf(xmin,xmax,ymin,ymax,near,far);}26.OnPaintBackground重绘背景事件,相关代码如下:protectedoverridevoidOnPaintBackground(PaintEventArgse){}27.OnPaint重绘事件,相关代码如下:protectedoverridevoidOnPaint(PaintEventArgse){base.OnPaint(e);DrawGLScene();egl.SwapBuffers(myDisplay,mySurface);//清除顏色缓冲区与深度缓冲区gl.Clear(gl.GL_COLOR_BUFFER_BIT|gl.GL_DEPTH_BUFFER_BIT);Invalidate();//取得系統启动后经过的毫秒数inttickCount=Environment.TickCount;intnextFrame=(myLastFrame+1)%myFrameTracker.Length;floatelapsed=(tickCount-myFrameTracker[nextFrame])/1000f;floattimePerFrame=elapsed/30;myFps=1/timePerFrame;myLastFrame=nextFrame;myFrameTracker[nextFrame]=tickCount;} 28.系统释放资源事件,相关代码如下:protectedoverridevoidOnClosing(CancelEventArgse){if(!egl.DestroySurface(myDisplay,mySurface))thrownewException("Errorwhiledestroyingsurface.");if(!egl.DestroyContext(myDisplay,myContext))thrownewException("Errorwhiledestroyingcontext.");if(!egl.Terminate(myDisplay))thrownewException("Errorwhileterminatingdisplay.");base.OnClosing(e);}3.3.2文字程序开发1.应用程序窗口初始化函数设定,相关代码如下:InitializeComponent();2.OnPaintBackground重绘背景事件,相关代码如下:protectedoverridevoidOnPaintBackground(PaintEventArgse){}3.UpdateScene背景更新事件,相关代码如下:protectedoverridevoidUpdateScene(floatsecondsSinceLastUpdate){base.UpdateScene(secondsSinceLastUpdate);}4.SetupScene背景设置事件,相关代码如下:protectedoverridevoidSetupScene(){base.SetupScene();font=newOpenGLFont(newFont(FontFamily.GenericSerif,12, FontStyle.Regular));title=newGlyphRun(font,"HelloWorld!",newSize(int.MaxValue,int.MaxValue),OpenGLTextAlignment.Left,true);}5.DrawScene绘制背景事件,相关代码如下:protectedoverridevoidDrawScene(){base.DrawScene();gl.BlendFunc(gl.GL_SRC_ALPHA,gl.GL_ONE_MINUS_SRC_ALPHA);title.Draw();}其显示效果如图3-6所示。图3-6文字显示效果6.若更改DrawScene绘制背景事件,将字体进行平移和旋转,相关代码如下:protectedoverridevoidDrawScene(){base.DrawScene();gl.BlendFunc(gl.GL_SRC_ALPHA,gl.GL_ONE_MINUS_SRC_ALPHA);gl.Translatef(50.0f,50.0f,0); gl.Rotatef(40.0f,0,0,1.0f);title.Draw();}则显示效果如图3-7所示。图3-7平移和旋转的文字显示效果 4总结本文第一章介绍OpenGLES技术的发展历史、重要性以及发展前景。第二章介绍OpenGLES的内容和该技术的优越性,描述了OpenGLES库的结构化设计和模块化设计。第三章介绍开发环境VisualStudio2008、以及OpenGLES底层核心构件的设计。最后介绍如何开发程序和应用程序的测试。因此,文本主要对OpenGLES技术在WindowsMobile设备上的图形文字开发进行了研究论述。通过了解OpenGLES技术掌握如何开发图形文字程序。对各个模块进行分析,从而理解该技术的应用。最后运用VisualStudio2008开发环境对该程序实现仿真。使读者对程序的理解更有可观性。 参考文献[1]刘琪,迟贤书.OpenGL与OpenGLES在开发过程中的异同[J].2008,27(3):261-262[2]莫军,陈雷霆基于OpenGLES的3D图形绘制管线优化问题[J].2007,24(1):215-216[3]DaveShreiver等著,徐波译.OpenGL编程指南[M].北京:机械工业出版社,第六版,2008.[4]刘彦博等著.WindowsMobile平台应用与开发[M].北京:人民邮电出版社,2006.[5]关洪涛.面向32位嵌入式微处理器体系结构的OpenGLES实现技术研究[D].北京:国防科学技术大学学位论文,2009.[6]史扬,吴金平.OpenGLES图形标准在嵌入式系统中的应用[J].工业控制计算机,2008,21(3):27-28.[7]XinbiaoGan,KuiDai,ZhiyingWang.Low-LevelComponentforOpenGLESOrientedHeterogeneousArchitecturewithOptimization[C].InProcessdingsofThe9thInternationalConferenceforYoungComputerScientists,2008.[8]Gu,Ruei-Ting,Yeh,Tse-Chen,Hunag,Wei-Sheng,Huang,etal.ALowCostTile-based3DGraphicsFullPipelinewithReal-timePerformanceMonitoringSupportforOpenGLES[J].ConsumerElectronics,2007,56(2):15-19.[9]胡事民,刘利刚,刘永进,张松海.计算机图形学(OpenGL版)第3版[M].北京:清华大学出版社,2009.[10]李桂琼,张文祥.OpenGL程序设计指南[M].北京:清华大学出版社,2005.[11]徐波.OpenGL超级宝典:第三版[M].北京:人民邮电出版社,2005.[12]康利刚.基于OpenGL ES的地形三维显示技术研究[J].北京:海军技术研究所,2010.[13]武志强.基于OpenGLES的三维地形可视化技术研究与实现[D].郑州:解放军信息工程大学测绘学院,2010.[14]刘晶,董兴辉,张利柱.基于OpenGLES的移动3D图形引擎的研究与设计[D].北京:华北电力大学计算机学院,2009.[15]官酩杰.基于OpenGLES的移动平台图形渲染引擎研究与实现[D].北京:北京交通大学,2010.[16]顾伟.基于OpenGLES的J2ME三维图形函数库[D].南京:东南大学,2008. 附录应用程序源代码1.图形应用程序usingSystem.Linq;usingSystem.Collections.Generic;usingSystem.ComponentModel;usingSystem.Data;usingSystem.Drawing;usingSystem.Text;usingSystem.Windows.Forms;usingSystem.Runtime.InteropServices;usingOpenGLES;namespaceOpenGLSample{publicpartialclassForm1:ApplicationForm{[DllImport("coredll")]externstaticIntPtrGetDC(IntPtrhwnd);EGLDisplaymyDisplay;EGLSurfacemySurface;EGLContextmyContext;publicForm1(){InitializeComponent();myDisplay=egl.GetDisplay(newEGLNativeDisplayType(this));intmajor,minor;egl.Initialize(myDisplay,outmajor,outminor);EGLConfig[]configs=newEGLConfig[10];int[]attribList=newint[]{egl.EGL_RED_SIZE,5,egl.EGL_GREEN_SIZE,6,egl.EGL_BLUE_SIZE,5,egl.EGL_DEPTH_SIZE,16,egl.EGL_SURFACE_TYPE,egl.EGL_WINDOW_BIT,egl.EGL_STENCIL_SIZE,egl.EGL_DONT_CARE,egl.EGL_NONE,egl.EGL_NONE};intnumConfig; if(!egl.ChooseConfig(myDisplay,attribList,configs,configs.Length,outnumConfig)||numConfig<1)thrownewInvalidOperationException("Unabletochooseconfig.");EGLConfigconfig=configs[0];mySurface=egl.CreateWindowSurface(myDisplay,config,Handle,null);myContext=egl.CreateContext(myDisplay,config,EGLContext.None,null);egl.MakeCurrent(myDisplay,mySurface,mySurface,myContext);gl.ClearColor(0,0,0,0);InitGL();}int[]myFrameTracker=newint[30];intmyLastFrame=0;floatmyFps=0;voidInitGL(){gl.ShadeModel(gl.GL_SMOOTH);//gl.ClearColor(1.0f,1.0f,1.0f,0.5f);gl.ClearColor(0.0f,0.0f,0.0f,0.5f);gl.ClearDepthf(1.0f);gl.Enable(gl.GL_DEPTH_TEST);gl.BlendFunc(gl.GL_SRC_ALPHA,gl.GL_ONE_MINUS_SRC_ALPHA);gl.DepthFunc(gl.GL_LEQUAL);gl.Hint(gl.GL_PERSPECTIVE_CORRECTION_HINT,gl.GL_NICEST);}floatmyRotation=0;unsafevoidDrawGLScene(){gl.Viewport(ClientRectangle.Left,ClientRectangle.Top,ClientRectangle.Width,ClientRectangle.Height);gl.MatrixMode(gl.GL_PROJECTION);gl.LoadIdentity();gluPerspective(45,(float)ClientSize.Width/(float)ClientSize.Height,.1f,100);float[]triangle=newfloat[]{0.0f,1.0f,0.0f,-1.0f,-1.0f,0.0f,1.0f,-1.0f,0.0f};float[]colors=newfloat[]{1.0f,0.0f,0.0f,9,0.0f,1.0f,0.0f,0,0.0f,0.0f,1.0f,0};gl.Translatef(0.0f,0.0f,-6.0f); gl.Rotatef(myRotation,0.0f,1.0f,0.0f);fixed(float*trianglePointer=&triangle[0],colorPointer=&colors[0]){gl.EnableClientState(gl.GL_VERTEX_ARRAY);gl.VertexPointer(3,gl.GL_FLOAT,0,(IntPtr)trianglePointer);gl.EnableClientState(gl.GL_COLOR_ARRAY);gl.ColorPointer(4,gl.GL_FLOAT,0,(IntPtr)colorPointer);gl.DrawArrays(gl.GL_TRIANGLES,0,3);gl.DisableClientState(gl.GL_VERTEX_ARRAY);gl.DisableClientState(gl.GL_COLOR_ARRAY);gl.Flush();}myRotation+=2f;}voidgluPerspective(floatfovy,floataspect,floatnear,floatfar){floatxmin,xmax,ymin,ymax;ymax=near*(float)Math.Tan(fovy*3.1415962f/360.0);ymin=-ymax;xmin=ymin*aspect;xmax=ymax*aspect;gl.Frustumf(xmin,xmax,ymin,ymax,near,far);}protectedoverridevoidOnPaintBackground(PaintEventArgse){}protectedoverridevoidOnPaint(PaintEventArgse){base.OnPaint(e);DrawGLScene();egl.SwapBuffers(myDisplay,mySurface);gl.Clear(gl.GL_COLOR_BUFFER_BIT|gl.GL_DEPTH_BUFFER_BIT);Invalidate();inttickCount=Environment.TickCount;intnextFrame=(myLastFrame+1)%myFrameTracker.Length;floatelapsed=(tickCount-myFrameTracker[nextFrame])/1000f;floattimePerFrame=elapsed/30;myFps=1/timePerFrame;myLastFrame=nextFrame; myFrameTracker[nextFrame]=tickCount;}protectedoverridevoidOnClosing(CancelEventArgse){if(!egl.DestroySurface(myDisplay,mySurface))thrownewException("Errorwhiledestroyingsurface.");if(!egl.DestroyContext(myDisplay,myContext))thrownewException("Errorwhiledestroyingcontext.");if(!egl.Terminate(myDisplay))thrownewException("Errorwhileterminatingdisplay.");base.OnClosing(e);}}}文字应用程序usingSystem;usingSystem.Linq;usingSystem.Collections.Generic;usingSystem.ComponentModel;usingSystem.Data;usingSystem.Drawing;usingSystem.Text;usingSystem.Windows.Forms;usingSystem.Runtime.InteropServices;usingOpenGLES;namespaceOpenGLSample{publicpartialclassForm1:ApplicationForm{[DllImport("coredll")]externstaticIntPtrGetDC(IntPtrhwnd);publicForm1() {InitializeComponent();}protectedoverridevoidOnPaintBackground(PaintEventArgse){}protectedoverridevoidUpdateScene(floatsecondsSinceLastUpdate){base.UpdateScene(secondsSinceLastUpdate);}OpenGLFontfont;GlyphRuntitle;protectedoverridevoidSetupScene(){base.SetupScene();font=newOpenGLFont(newFont(FontFamily.GenericSerif,12,FontStyle.Regular));title=newGlyphRun(font,"HelloWorld!",newSize(int.MaxValue,int.MaxValue),OpenGLTextAlignment.Left,true);}protectedoverridevoidDrawScene(){base.DrawScene();//addingl.BlendFunc(gl.GL_SRC_ALPHA,gl.GL_ONE_MINUS_SRC_ALPHA);gl.Translatef(50.0f,50.0f,0);gl.Rotatef(40.0f,0,0,1.0f);title.Draw();}}}

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。
关闭