首页 > 编程语言 >OpenGL ES 2.0编程指导阅读笔记(三)EGL介绍

OpenGL ES 2.0编程指导阅读笔记(三)EGL介绍

时间:2023-01-12 10:45:07浏览次数:49  
标签:EGLint EGLConfig 渲染 EGL OpenGL 2.0 EGLDisplay display

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初始化之后,就可以确定可用的渲染表面类型和配置。这有两种方法实现:

  1. 查询每个表面配置并选择一个最优的;
  2. 指定一系列要求并让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

相关文章