当前位置:文档之家› OpenGL讲座

OpenGL讲座

OpenGL讲座纲领:1,简介2,简单概念性教程3,实例1,OpenGL简介简介:OpenGL - 高性能图形算法行业标准OpenGL(全写Open Graphics Library)是个定义了一个跨编程语言、跨平台的编程接口的规格,它用于三维图象(二维的亦可)。

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

支持主流系统平台。

一般由硬件平台直接支持。

对比:对比DirectXOpenGL 只是图形函数库。

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

OpenGL稳定,可跨平台使用。

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

OpenGL与DirectX之争微软,推行Direct3D,冻结OpenGL!两大显示芯片厂商:Ati和nVIDIA(英伟达)。

2,OpenGL SE简介:OpenGL ES是专为内嵌和移动设备设计的一个2D/3D轻量图形库,它是基于OpenGL API设计的。

OpenGL ES 1.0版基于OpenGL 1.3,而OpenGL ES 1.1则是基于OpenGL 1.5的。

现在主要由Khronos Group来负责管理OpenGL ES的开发维护。

OpenGL ES目前主要有两个版本:OpenGL ES 1.X和OpenGL ES 2.X 。

OpenGL|ES的官方组织是:/ 该组织关注于手持和移动平台上的动态媒体编著、播放所需的API,并致力于为这些API建立无限权费用的开放标准。

OpenGL|ES是根据手持及移动平台的特点,对OpenGL 3D图形API标准进行裁剪定制而形成的,因此大多数OpenGL方面的知识都是可以借鉴的。

嵌入式硬件芯片支持,或软件模拟。

区别OpenGL:OpenGL ES相对OpenGL删减了一切低效能的操作方式,有高性能的决不留低效能的。

具体区别列表:数据类型:(数据类型简化)1: i GLint 整数型2: f GLfixed 定点小数3: x GLclampx 限定型定点小数删除的功能:(舍弃了部分类似功能及复杂功能函数)1.glBegin/glEnd2.glArrayElement3.显示列表4.求值器5.索引色模式6.自定义裁剪平面7.glRect8.图像处理(这个一般显卡也没有,FireGL/Quadro显卡有)9.反馈缓冲10.选择缓冲11.累积缓冲12.边界标志13.glPolygonMode14.GL_QUADS,GL_QUAD_STRIP,GL_POL YGON15.glPushAttrib,glPopAttrib,glPushClientAttrib,glPopClientAttrib15.TEXTURE_1D、TEXTURE_3D、TEXTURE_RECT、TEXTURE_CUBE_MAP16.GL_COMBINE17.自动纹理坐标生成18.纹理边界19.GL_CLAMP、GL_CLAMP_TO_BORDER20.消失纹理代表21.纹理LOD限定22.纹理偏好限定23.纹理自动压缩、解压缩24.glDrawPixels,glPixelTransfer,glPixelZoom25.glReadBuffer,glDrawBuffer,glCopyPixels3,EGL简介OpenGL ES是一个平台中立的图形库,在它能够工作之前,需要与一个实际的窗口系统关联起来,这与OpenGL是一样的。

但不一样的是,这部份工作有标准,这个标准就是EGL。

而OpenGL时代在不同平台上有不同的机制以关联窗口系统,在Windows上是wgl,在X-Window上是xgl,在Apple OS上是agl等。

EGL的工作方式和部份术语都接近于xgl。

EGL是介于OpenGL ES和底层Native系统平台之间的函数接口,目的是让OpenGL ES与本地系统交互且平台无关性。

用于管理图形context,surface与buffer绑定和对渲染配置的控制。

OpenGL ES的初始化过程如下图所示意:Display →Config →Surface↑Context↑Application →OpenGL CommandEGL初始化:1. 获取Display。

Display代表显示器,在有些系统上可以有多个显示器,也就会有多个Display。

获得Display要调用EGLboolean eglGetDisplay(NativeDisplay dpy),参数一般为EGL_DEFAULT_DISPLAY 。

该参数实际的意义是平台实现相关的,在X-Window下是XDisplay ID,在MS Windows下是Window DC。

2. 初始化egl。

调用EGLboolean eglInitialize(EGLDisplay dpy, EGLint *major, EGLint *minor),该函数会进行一些内部初始化工作,并传回EGL版本号(major.minor)。

3. 选择Config。

所为Config实际指的是FrameBuffer的参数,在MS Windows下对应于PixelFormat,在X-Window下对应Visual。

一般用EGLboolean eglChooseConfig(EGLDisplay dpy, const EGLint * attr_list, EGLConfig * config, EGLint config_size, EGLint *num_config),其中attr_list是以EGL_NONE结束的参数数组,通常以id,value依次存放,对于个别标识性的属性可以只有id,没有value。

另一个办法是用EGLboolean eglGetConfigs(EGLDisplay dpy, EGLConfig * config, EGLint config_size, EGLint *num_config)来获得所有config。

这两个函数都会返回不多于config_size个Config,结果保存在config[]中,系统的总Config个数保存在num_config中。

可以利用eglGetConfig()中间两个参数为0来查询系统支持的Config总个数。

Config有众多的Attribute,这些Attribute决定FrameBuffer的格式和能力,通过eglGetConfigAttrib ()来读取,但不能修改。

4. 构造Surface。

Surface实际上就是一个FrameBuffer,通过EGLSurface eglCreateWindowSurface(EGLDisplay dpy, EGLConfig confg,NativeWindow win, EGLint *cfg_attr) 来创建一个可实际显示的Surface。

系统通常还支持另外两种Surface:PixmapSurface 和PBufferSurface,这两种都不是可显示的Surface,PixmapSurface是保存在系统内存中的位图,PBuffer则是保存在显存中的帧。

Surface也有一些attribute,基本上都可以故名思意,EGL_HEIGHT EGL_WIDTH EGL_LARGEST_PBUFFER EGL_TEXTURE_FORMAT EGL_TEXTURE_TARGET EGL_MIPMAP_TEXTURE EGL_MIPMAP_LEVEL,通过eglSurfaceAttrib()设置、eglQuerySurface()读取。

5. 创建Context。

OpenGL的pipeline从程序的角度看就是一个状态机,有当前的颜色、纹理坐标、变换矩阵、绚染模式等一大堆状态,这些状态作用于程序提交的顶点坐标等图元从而形成帧缓冲内的像素。

在OpenGL的编程接口中,Context就代表这个状态机,程序的主要工作就是向Context提供图元、设置状态,偶尔也从Context里获取一些信息。

{ME:状态机绘图最终作用到BF上,而Context关联BF,所以设置状态机即设置Context!}用来创建一个Context。

EGLContext eglCreateContext(EGLDisplay dpy, EGLSurface write, EGLSurface read, EGLContext * share_list)6. 绘制。

应用程序通过OpenGL API进行绘制,一帧完成之后,调用eglSwapBuffers(EGLDisplay dpy, EGLContext ctx)来显示。

//其它:ST_EGLAPI EGLBoolean ST_EGLAPIENTRY eglMakeCurrent(EGLDisplay dpy,EGLSurface draw, EGLSurface read, EGLContext ctx);实例:RWindow iWindow;EGLDisplay iEglDisplay;EGLConfig iEglConfig;EGLContext iEglContext;EGLSurface iEglSurface;iEglDisplay = eglGetDisplay (EGL_DEFAULT_DISPLAY);if(iEglDisplay == EGL_NO_DISPLAY)User::Panic(_L("Unable to find a suitable EGLDisplay"), 0);这里EGL_DEFAULT_DISPLAY指向缺省的手机屏幕(一般来说只有一个),如果程序运行失败,那么该函数将会返回EGL_NO_DISPLAY.if(!eglInitialize (iEglDisplay, 0, 0))User::Panic(_L("Unable to initialize EGL"), 0);最后两个参数是EGL完成的版本。

如果你对此不需要,可以传递0进去。

EGLint numConfigs;if(!eglChooseConfig (iEglDisplay, attribList, &iEglConfig, 1, &numConfigs)) User::Panic(_L("Unable to choose EGL config"), 0);这里attribList参数指明了程序运行所需的属性列表,该函数将在iEglConfig参数中返回一个与属性列表配套的可用配置。

相关主题