@cxm-2016
2016-11-21T13:10:58.000000Z
字数 1778
阅读 6267
OpenGL-ES
版本:2
作者:陈小默
声明:禁止商业,禁止转载
EGL 是 OpenGL ES 和底层 Native 平台视窗系统之间的接口。OpenGL ES 本质上是一个图形渲染管线的状态机,而 EGL 则是用于监控这些状态以及维护 Frame buffer 和其他渲染 Surface 的外部层。EGL提供如下机制:
为了让OpenGL ES能够绘制在当前设备上,我们需要EGL作为OpenGL ES与设备的桥梁。所以本章内容为讲述在Android使用EGL通信的基本过程。
在使用GLSurfaceView和JNI实现的OpenGL中,我们是不需要考虑OpenGL如何与窗口通信的。但是在NativeActivity中,我们必须自己实现通信过程。通过EGL,我们可以方便的对设备进行连接。
通常我们使用eglGetDisplay函数。在这里我们可以根据不同的平台传入不同的设备参数,但是出于移植性的考虑,我们应该使用EGL_DEFAULT_DISPLAY默认连接参数。
EGL中大部分函数在成功时都会返回EGL_TRUE,否则返回EGL_FALSE。但是,我们仅从这个返回值上并不能看出错误原因是什么。如果想要明确的知道EGL的错误代码,应该调用eglGetError函数。
一般在成功打开设备连接之后需要初始化EGL。初始化过程将会对EGL内部的数据结构进行设置,然后返回EGL的主次版本号。详见函数eglInitialize
在初始化EGL之后,我们需要给EGL选择一组配置。
函数声明见eglGetConfigs
通常情况下,我们有两种方式使用该函数。首先,我们指定configs参数为NULL,此时EGL会查询所有可用的EGLConfigs数量并赋值给num_config,但此时不会有任何其他信息返回。
另外,我们也可以创建一个未初始化的EGLConfig,并作为函数的参数传入。此时,EGL将会查询不超过config_size数量的配置信息存入到configs,并通过num_config返回保存数据的数量。
如果我们获取得了一个EGL配置对象,我们可以通过下列函数查询该对象中指定属性的值,查询EGLConfig属性的函数是eglGetConfigAttrib。
在初始化EGL时,我们可以列出并让EGL选择最合适的配置。eglChooseconfig
一旦我们有了符合渲染需求的EGLConfig,就为窗口创建做好了准备。调用如下函数可以创建一个窗口。eglCreateWindowSurface。这个函数以我们到原生显示管理器的连接和前一步获得的EGLConfig为参数。此外,它需要原生窗口系统事先创建一个窗口。因为EGL是许多不同窗口系统和OpenGL ES之间的软件接口层。最后这个函数需要一个属性列表;但是,这个列表中的属性与参数属性不完全相同,并且额外使用到了创建窗口的属性。该函数在多种情况下都有可能失败。
渲染上下文是OpenGL ES的内部数据结构,包含操作所需的所有状态信息。例如程序中使用的顶点着色器或者片元着色器的引用。OpenGL ES必须有一个可用的上下文才能绘图。使用下面的函数可以创建一个上下文:eglCreateContext
因为一个应用程序可能创建多个EGLContext用作不同的用途,所以我们需要指定关联特定的EGLContext和渲染表面——这一过程被称为“指定当前上下文”。eglMakeCurrent
[1]OpenGL ES 3.0 编程指南 第二版 机械工业出版社
[2]EGL函数API文档