*
EGL
Opengl与窗口系统对应的设配层
EGL是由Khronos Group提供的一组平台无关的API,它的主要功能如下:
1. 和本地窗口系统(native windowing system)通讯;
2. 查询可用的配置;
3. 创建OpenGL ES可用的“绘图表面”(drawing surface);
4. 同步不同类别的API之间的渲染,比如在OpenGL ES和OpenVG之间同步,或者在OpenGL和本地窗口的绘图命令之间;
5. 管理“渲染资源”,比如纹理映射(rendering map)
①EGLDisplay与原生窗口的链接:
EGL可运行于GNU/Linux的X Window System,Microsoft Windows和MacOS X的Quartz。
EGL把这些平台的显示系统抽象为一个独立的类型:EGLDisplay。
EGLDisplay eglGetDisplay(EGLNativeDisplayType id); EGLBoolean
eglInitialize(EGLDisplay display, EGLint* majorVersion, EGLint* minorVersion);
EGLint eglGetError();
②EGLConfig 初始化过后,要选择一个合适的“绘图表面”。
EGLBoolean eglChooseConfig(EGLDisplay display, const EGLint* attribs, //
你想要的属性事先定义到这个数组里 EGLConfig* configs, // 图形系统将返回若干满足条件的配置到该数组 EGLint maxConfigs,
// 上面数组的容量 EGLint* numConfigs); // 图形系统返回的可用的配置个数
③Surface创建和Surface配置(窗口和屏幕上的渲染区域)
EGLSurface eglCreateWindowSurface(EGLDisplay display, EGLConfig config,
EGLNativeWindowType window, // 在Windows上就是HWND类型 const EGLint* attribs); //
此属性表非彼属性表
④EGLContext 创建渲染环境
-渲染环境指OpenGL ES的所有项目运行需要的数据结构,如顶点、片元着色器,顶点数据矩阵
EGLContext eglCreateContext(EGLDisplay display, EGLConfig config, EGLContext
context, // EGL_NO_CONTEXT表示不向其它的context共享资源 const EGLint * attribs)//
我们暂时只用EGL_CONTEXT_CLIENT_VERSION eglMakeCurrent(display, window, window,
context) // 两个window表示读写都在一个窗口
代码演示:
virtual bool Init(void *win) { Close(); ANativeWindow *nativeWindow =
(ANativeWindow *) win; //初始化EGL //①获取EGLDisplay对象 显示设备 mux.lock();
this->eglDisplay = eglGetDisplay(EGL_DEFAULT_DISPLAY); if (eglDisplay ==
EGL_NO_DISPLAY) { XLOGE("eglGetDisplay failed!"); mux.unlock(); return false; }
//②初始化disPlay if (EGL_TRUE != eglInitialize(eglDisplay, 0, 0)) {
XLOGE("eglInitialize failed!"); mux.unlock(); return false; } //③获取配置并创建surface
EGLint configSpec[] = { EGL_RED_SIZE, 8, EGL_GREEN_SIZE, 8, EGL_BLUE_SIZE, 8,
EGL_SURFACE_TYPE, EGL_WINDOW_BIT, EGL_NONE }; EGLConfig config = 0; EGLint
numConfigs = 0; if (EGL_TRUE != eglChooseConfig(eglDisplay, configSpec,
&config, 1, &numConfigs)) { XLOGE("eglChooseConfig failed!"); mux.unlock();
return false; } //创建surface eglSurface = eglCreateWindowSurface(eglDisplay,
config, nativeWindow, NULL); if (eglSurface == EGL_NO_SURFACE) {
XLOGE("eglCreateWindowSurface failed!"); mux.unlock(); return false; }
//④创建并打开上下文 const EGLint ctxAttr[] = {EGL_CONTEXT_CLIENT_VERSION, 2, EGL_NONE};
eglContext = eglCreateContext(eglDisplay, config, EGL_NO_CONTEXT, ctxAttr); if
(eglContext == EGL_NO_CONTEXT) { XLOGE("eglCreateContext failed!");
mux.unlock(); return false; } //上下文切换 if (EGL_TRUE !=
eglMakeCurrent(eglDisplay, eglSurface, eglSurface, eglContext)) {
XLOGE("eglMakeCurrent faliled!"); mux.unlock(); return false; }
XLOGE("ANativeWindow init success!"); mux.unlock(); return true; } };
热门工具 换一换