OpenGLES基础入门本文摘自网络,本人只是进行了一下规整,只作为学习参考使用,内容覆盖面并不全,但对于新手入门来说,有一定的帮助作用。OpenGLES基础入门......................................................................................................................1了解OpenGLES社区.............................................................................................................1初始化EGL..............................................................................................................................2初始化GLES...........................................................................................................................3Hello,EGL...............................................................................................................................14加载模型................................................................................................................................20材质纹理................................................................................................................................24光照........................................................................................................................................30压缩纹理................................................................................................................................32全屏抗锯齿FSAA................................................................................................................40了解OpenGLES社区学习任何一种新技术,要先对它有一个全局性的了解,这样才知道用功的方向。而这全局性的了解中,非常重要的一块就是要了解该技术的社区情况。OpenGL|ES的官方组织是:该组织关注于手持和移动平台上的动态媒体编著、播放所需的API,并致力于为这些API建立无限权费用的开放标准。(focusedonthecreationofopenstandard,royalty-freeAPIstoenabletheauthoringandacceleratedplaybackofdynamicmediaonawidevarietyofplatformsanddevices.)在Khronos的网站上,有大量开发者资源,其中最重要的部份就是规范文档和头文件(EGL,GLES1.x,GLES2.x),同时还列出了很多的例子和教程。OpenGL|ES是根据手持及移动平台的特点,对OpenGL3D图形API标准进行裁剪定制而形成的,因此大多数OpenGL方面的知识都是可以借鉴的,因此保持对OpenGL官方组织的关注是非常有益的,OpenGLARB网站在。Khronos对两个API的关系有非常清楚的定义:目前,各路厂商对OpenGLES的支持才刚刚起步,在很多平台上都还没有官方的OpenGLES实现,在这种情况,利用一些开源的产品也可以开始相关的研究和开发。其中发展得比较好的是VicentMobile3DRenderingLibrary(1.x://sf.net/projects/ogles2),基于OpenGLES的3D引擎,在OpenGL世界里广受欢迎的GLUT也出了ES版本(),不过个人感觉,有了EGL标准,开发者不必再面对glx/wgl/agl等一堆平台相关的初始化方法,glut的作用已经小多了,不过对于从OpenGL平台转过来的用户还是非常友好的。对于象笔者这样的DellAximX50v/X51v用户来说,intel2700G芯片的支持仍可以intel官方网站()搜索找到,2700G是基于PowerVRNMXIPCore研制的,也可以直接去PowerVR的网站下载SDK及演示程序。对于Java世界的开发者来说,JSR239跟OpenGLES几乎是一样的。已经出版的OpenGL|ES方面的书还不多,已知的有OpenGLESGameDevelopment,一些传统经典OpenGL书籍的最新版中也会有所提及。初始化EGLOpenGLES是一个平台中立的图形库,在它能够工作之前,需要与一个实际的窗口系统关联起来,这与OpenGL是一样的。但不一样的是,这部份工作有标准,这个标准就是EGL。而OpenGL时代在不同平台上有不同的机制以关联窗口系统,在Windows上是wgl,在X-Window上是xgl,在AppleOS上是agl等。EGL的工作方式和部份术语都接近于xgl。OpenGLES的初始化过程如下图所示意:Display→Config→Surface↑Context↑Application→OpenGLCommand1.获取Display。Display代表显示器,在有些系统上可以有多个显示器,也就会有多个Display。获得Display要调用EGLbooleaneglGetDisplay(NativeDisplaydpy),参数一般为EGL_DEFAULT_DISPLAY。该参数实际的意义是平台实现相关的,在X-Window下是XDisplayID,在MSWindows下是WindowDC。2.初始化egl。调用EGLbooleaneglInitialize(EGLDisplaydpy,EGLint*major,EGLint*minor),该函数会进行一些内部初始化工作,并传回EGL版本号(major.minor)。3.选择Config。所为Config实际指的是FrameBuffer的参数,在MSWindows下对应于PixelFormat,在X-Window下对应Visual。一般用EGLbooleaneglChooseConfig(EGLDisplaydpy,constEGLint*attr_list,EGLConfig*config,EGLintconfig_size,EGLint*num_config),其中attr_list是以EGL_NONE结束的参数数组,通常以id,value依次存放,对于个别标识性的属性可以只有id,没有value。另一个办法是用EGLbooleaneglGetConfigs(EGLDisplaydpy,EGLConfig*config,EGLintconfig_size,EGLint*num_config)来获得所有config。这两个函数都会返回不多于config_size个Config,结果保存在config[]中,系统的总Config个数保存在num_config中。可以利用eglGetConfig()中间两个参数为0来查询系统支持的Config总个数。Config有众多的Attribute,这些Attribute决定FrameBuffer的格式和能力,通过eglGetConfigAttrib()来读取,但不能修改。4.构造Surface。Surface实际上就是一个FrameBuffer,通过EGLSurfaceeglCreateWindowSurface(EGLDisplaydpy,EGLConfigconfg,NativeWindowwin,EGLint*cfg_attr)来创建一个可实际显示的Surface。系统通常还支持另外两种Surface:PixmapSurface和PBufferSurface,这两种都不是可显示的Surface,PixmapSurface是保存在系统内存中的位图,PBuffer则是保存在显存中的帧。Surface也有一些attribute,基本上都可以故名思意,EGL_HEIGHTEGL_WIDTHEGL_LARGEST_PBUFFEREGL_TEXTURE_FORMATEGL_TEXTURE_TARGETEGL_MIPMAP_TEXTUREEGL_MIPMAP_LEVEL,通过eglSurfaceAttrib()设置、eglQuerySurface()读取。5.创建Context。OpenGL的pipeline从程序的角度看就是一个状态机,有当前的颜色、纹理坐标、变换矩阵、绚染模式等一大堆状态,这些状态作用于程序提交的顶点坐标等图元从而形成帧缓冲内的像素。在OpenGL的编程接口中,Context就代表这个状态机,程序的主要工作就是向Context提供图元、设置状态,偶尔也从Context里获取一些信息。用EGLContexteglCreateContext(EGLDisplaydpy,EGLSurfacewrite,EGLSurfaceread,EGLContext*share_list)来创建一个Context。6.绘制。应用程序通过OpenGLAPI进行绘制,一帧完成之后,调用eglSwapBuffers(EGLDisplaydpy,EGLContextctx)来显示。初始化GLES初始化OpenGLES分四步:调用eglInitialize()初始化egl库,用eglChooseConfig()选择合适的framebuffer,调用eglCreateWindowSurface创建EGLSurface,用eglCreateContext创建RenderContext(RC)。其实跟标准OpenGL的初始化过程很接近(选择PixelFormat或者Visual,再创建Rc),只是多了一个WindowSurface的概念。OpenGL标准是不依赖于窗口系统的,这提供了很强的平台无关性,但也使得我们在Windows下要用wgl初始化,而X-Window下就得学会用xgl,MacOSX上则是agl。而手持及嵌入式市场的平台种类不计其数,单是学习各家手机操作系统的接口就是很大的负担了,更不用说总有一些有志于支持各种尺寸平台的软件开发者,所以OpenGLES提供了WindowSurface的抽象,使得移植工作可以基本局限在重新实现一下建立