EGL能够管理绘图表面。
EGL提供了以下机制:
- 和本地窗口系统进行通信;
- 查询可用的绘图表面类型和配置;
- 创建绘图表面;
- 在OpenGL ES 2.0和其他图形渲染API之间同步渲染;
- 管理渲染资源,如纹理图。
和窗口系统进行通信
打开到EGL Display Server的连接:
EGLDisplay eglGetDisplay(EGLNativeDisplayType display_id);
检查错误
多数EGL中的函数会返回EGL_TRUE或者EGL_FALSE来表示是否成功执行。
但是,错误代码并不会被直接返回,需要使用以下函数查询:
EGLint eglGetError();
初始化EGL
当你打开一个连接后,EGL需要被初始化。
EGLBoolean eglInitialize(EGLDisplay display, EGLint *majorVersion, EGLint *minorVersion);
这会初始化EGL的内部数据结构,并返回EGL实现的版本号。
确定可用的表面配置
完成EGL初始化之后,就可以确定可用的渲染表面类型和配置。这有两种方法实现:
- 查询每个表面配置并选择一个最优的;
- 指定一系列要求并让EGL推荐最佳匹配。
两种情况EGL都会返回EGLConfig,这是一个EGL内部数据结构的识别符,该数据结构包含一个特定表面及其属性的相关信息,例如,每个颜色分量的位数,或者是否有深度缓冲。
要查询所有EGL表面的配置,可以使用以下函数:
EGLBoolean eglGetConfigs(EGLDisplay display, EGLConfig *configs, EGLint maxReturnConfigs, EGLint *numConfigs);
查询EGLConfig属性
用以下函数来查询EGLConfig的特定属性:
EGLBoolean eglGetConfigAttrib(EGLDisplay display, EGLConfig config, EGLint attribute, EGLint *value);
让EGL选择配置
由于EGLConfig包含的参数数量非常多,可以使用以下函数来让EGL选择配置:
EGLBoolean eglChooseConfig(EGLDisplay display; const EGLint *attribList, EGLConfig *config, EGLint maxReturnConfigs, EGLint *numconfigs);
创建屏上渲染区域: EGL窗口
EGLSurface eglCreateWindowSurface(EGLDisplay display, EGLConfig config, EGLNativeWindowType window, const EGLint *attribList);
这一函数将EGLConfig传递给本地显示管理器。
attribList中可以设置EGL_RENDER_BUFFER来指定使用的是双缓冲的哪一个。
创建离屏渲染区域:EGL Pbuffers
除了绘制到屏幕窗口,你也可以绘制到不可见的离屏表面,称作Pbuffer(Pixel Buffer)。这种情况一般是为了生成纹理图,但是如果你仅仅想渲染纹理,更推荐使用效率更高的帧缓存对象(Framebuffer Object)。而当你想渲染到离屏表面,然后在另一个API中将它作为纹理使用时,则可以使用Pbuffer。
要创建Pbuffer,需要在查询EGLConfig时指定EGL_SURFACE_TYPE为EGL_PBUFFER_BIT,然后使用以下函数:
EGLSurface eglCreatePbufferSurface(EGLDisplay display, EGLConfig config, const EGLint *attribList);
创建渲染上下文
渲染上下文是OpenGL ES 2.0的内部数据结构,包含着操作所需的所有状态。
EGLContext eglCreateContext(EGLDisplay display, EGLConfig config, EGLContext shareContext, const EGLint * attribList);
让渲染上下文成为当前激活的渲染上下文
要绑定EGLContext到EGLSurface,使用以下函数:
EGLBoolean eglMakeCurrent(EGLDisplay display, EGLSurface draw, EGLSurface read, EGLContext context);
同步渲染
- 如果应用全部使用OpenGL ES 2.0进行渲染,可以使用glFinish来保证所有的渲染完成
- 如果使用多个Khronos API来进行渲染,需要调用以下函数来保证所有API渲染完成
EGLBoolean eglWaitClient();
- 如果要保证本地窗口系统渲染完成,需要调用以下函数:
EGLBoolean eglWaitNative(EGLint engine);
标签:EGLint,EGLConfig,渲染,EGL,OpenGL,2.0,EGLDisplay,display
From: https://www.cnblogs.com/belatedluck/p/17043999.html