前面已经在android平台上使用OpenGL ES的API了解了如何创建3D图形已经使用FBO渲染到纹理进行一些其他的操作,起初我学习OpenGL ES的目的就是为了研究Android平台上录制屏幕的方案。到目前为止,基础知识已经具备了,还差一点需要了解的是Embedded Graphics Library (EGL),EGL是连接OpenGL ES和本地窗口系统的接口,由于OpenGL ES是跨平台的,引入EGL就是为了屏蔽不同平台上的区别。本地窗口相关的API提供了访问本地窗口系统的接口,EGL提供了创建渲染表面,接下来OpenGL ES就可以在这个渲染表面上绘制,同时提供了图形上下文,用来进行状态管理。更详细的信息可以参考Khronos EGL Registry
下面这几篇文章有助于对EGL的理解
Using EGL to connect a native window and OpenGL ES
EGL use for Android native OpenGL ES applications
USING OPENGL ES ON WINDOWS DESKTOPS VIA EG
使用EGL一般为下面的顺序
1.使用EGL首先必须创建,建立本地窗口系统和OpenGL ES的连接。
EGLDisplay eglDisplay(EGLNativeDisplayType displayId)
EGL提供了平台无关类型EGLDisplay表示窗口。定义EGLNativeDisplayType是为了匹配原生窗口系统的显示类型,对于Windows,EGLNativeDisplayType被定义为HDC,对于Linux系统,被定义为Display*类型,对于Android系统,定义为ANativeWindow *类型,为了方便的将代码转移到不同的操作系统上,应该传入EGL_DEFAULT_DISPLAY,返回与默认原生窗口的连接。如果连接不可用,则返回EGL_NO_DISPLAY。
2.初始化EGL
创建与本地原生窗口的连接后需要初始化EGL,使用函数eglInitialize进行初始化操作。如果 EGL 不能初始化,它将返回EGL_FALSE,并将EGL错误码设置为EGL_BAD_DISPLAY表示制定了不合法的EGLDisplay,或者EGL_NOT_INITIALIZED表示EGL不能初始化。使用函数eglGetError用来获取最近一次调用EGL函数出错的错误代码
EGLBoolean eglInitialize(EGLDisplay display, // 创建的EGL连接
EGLint *majorVersion, // 返回EGL主板版本号
EGLint *minorVersion); // 返回EGL次版本号
初始化EGL示例
EGLint majorVersion;
EGLint minorVersion;
EGLDisplay display;
display = eglGetDisplay(EGL_DEFAULT_DISPLAY);
if(display == EGL_NO_DISPLAY)
{
// Unable to open c