OpenGL ES 2.0 编程三步曲

Android OpenGL库加载过程源码分析//http://mobile.51cto.com/aengine-437165.htm

本文简单介绍OpenGL库的加载过程。OpenGL以动态库的方式提供,因此在使用OpenGL的接口函数绘图前,需要加载OpenGL库,并得到接口函数指针。函数EGLBoolean egl_init_drivers()就是负责OpenGL库的加载。

很重要

///////////////////////////////////////////////////////////////

初始化EGL

OpenGLES 是一个平台中立的图形库,在它能够工作之前,需要与一个实际的窗 口系统关联起来,这与OpenGL是一样的。但不一样的是,这部份工作有标准, 这个标准就是 EGL 。而OpenGL时代在不同平台上有不同的机制以关联窗口系 统,在 Windows 上是 wgl,在 X-Window 上是 xgl,在 Apple OS 上是 agl 等。 EGL 的工作方式和部份术语都接近于 xgl。

OpenGLES的初始化过程如下图所示意:

Display → Config → Surface↑Context↑Application → OpenGL Command

1. 获取 Display。

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

EGLboolean eglGetDisplay(NativeDisplay dpy)

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

2. 初始化 egl。

初始化 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, 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,通过

EGLSurface eglCreateWindowSurface(EGLDisplay dpy, EGLConfig confg,NativeWindow win, 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()读取。

eglSurfaceAttrib()eglQuerySurface()

5. 创建Context。

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

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

EGLContext eglCreateContext(EGLDisplay dpy, EGLSurface write,EGLSurface read, EGLContext * share_list)

来创建一个 Context。

6. 绘制。

应用程序通过OpenGLAPI 进行绘制,一帧完成之后,调用

eglSwapBuffers(EGLDisplay dpy, EGLContext ctx)

来显示。

OpenGL ES 2.0 编程三步曲

OpenGL 与 OpenGL ES的关系OpenGL ES 是基于桌面版本OpenGL 的:

OpenGL ES 1.0基于OpenGL 1.3 , 在2003年发布

OpenGL ES 1.1 基于OpenGL 1.5 ,在2004年发布

OpenGL ES 2.0基于OpenGL2.0, 在2007年发布

OpenGL 2.0 向下兼容OpenGL 1.5 而 OpenGL ES 2.0 和OpenGL ES 1.x 不兼容,是两种完全不同的实现。

1. 保存全局变量的数据结构

以下例子程序均基于Linux平台。

[cpp]

[cpp]

2. 初始化EGL渲染环境和相关元素(第一步曲)

[cpp]

3.生成Program(第二步曲)

3.1 LoadShader

LoadShader主要实现以下功能:

1) 创建Shader对象

2) 装载Shader源码

3) 编译Shader

其实现参考代码如下:

[cpp]

1)glCreateShader

它创建一个空的shader对象,它用于维护用来定义shader的源码字符串。支持以下两种shader:

(1) GL_VERTEX_SHADER: 它运行在可编程的“顶点处理器”上,用于代替固定功能的顶点处理;

(2) GL_FRAGMENT_SHADER: 它运行在可编程的“片断处理器”上,用于代替固定功能的片段处理;

2)glShaderSource

shader对象中原来的源码全部被新的源码所代替。

3)glCompileShader

编译存储在shader对象中的源码字符串,编译结果被当作shader对象状态的一部分被保存起来,可通过glGetShaderiv函数获取编译状态。

4)glGetShaderiv

获取shader对象参数,参数包括:GL_SHADER_TYPE, GL_DELETE_STATUS, GL_COMPILE_STATUS, GL_INFO_LOG_LENGTH, GL_SHADER_SOURCE_LENGTH.

3.2 LoadProgram

其参考代码如下:

[cpp]

1)glCreateProgram

建立一个空的program对象,shader对象可以被连接到program对像

2)glAttachShader

program对象提供了把需要做的事连接在一起的机制。在一个program中,在shader对象被连接在一起之前,必须先把shader连接到program上。

3)glBindAttribLocation

把program的顶点属性索引与顶点shader中的变量名进行绑定。

4)glLinkProgram

呼唤你前往另一个地方,过上另一种生活。

OpenGL ES 2.0 编程三步曲

相关文章:

你感兴趣的文章:

标签云: