*
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; } };
 

 

 

 

 

 

 

 

 

 

 

 

友情链接
KaDraw流程图
API参考文档
OK工具箱
云服务器优惠
阿里云优惠券
腾讯云优惠券
华为云优惠券
站点信息
问题反馈
邮箱:[email protected]
QQ群:637538335
关注微信