OpenGL ES EGL eglGetConfigs

OpenGL ES EGL eglGetConfigs

零基础 OpenGL ES 学习路线推荐 : OpenGL ES 学习目录 >> OpenGL ES 基础

零基础 OpenGL ES 学习路线推荐 : OpenGL ES 学习目录  >> OpenGL ES 特效

零基础 OpenGL ES 学习路线推荐 : OpenGL ES 学习目录  >> OpenGL ES 转场

零基础 OpenGL ES 学习路线推荐 :  OpenGL ES 学习目录 >> OpenGL ES 函数

零基础 OpenGL ES 学习路线推荐 :  OpenGL ES 学习目录 >> OpenGL ES GPUImage 使用

零基础 OpenGL ES 学习路线推荐 :  OpenGL ES 学习目录 >> OpenGL ES GLSL 编程


一. EGL 前言

EGLNativeDisplayType – 系统显示类型,标识你所开发设备的物理屏幕,DX/OPenGL ES/Metal/Vulkan….

EGLNativeWindowType – 系统窗口,渲染显示的窗口句柄

EGLDisplay – 关联 EGLNativeDisplayType 系统物理屏幕的通用数据类型,是平台上 WGL / GLX / AGL 的等价物

EGLSurface – 渲染区域,系统窗口或 frame buffer 句柄 ,可以理解为一个后端的渲染目标窗口

EGLConfig – 对 EGLSurface的 EGL 配置,可以理解为绘制目标 framebuffer 的配置属性

EGLContextOpenGL ES 图形上下文


二. EGL 绘制流程简介

  1. 获取 EGL Display 对象:eglGetDisplay
  2. 初始化与 EGLDisplay 之间的连接:eglInitialize
  3. 获取 EGLConfig 对象:eglChooseConfig / eglGetConfigs
  4. 创建 EGLContext 实例:eglCreateContext
  5. 创建 EGLSurface 实例:eglCreateWindowSurface
  6. 连接 EGLContext 和 EGLSurface:eglMakeCurrent
  7. 使用 OpenGL ES API 绘制图形:gl_*
  8. 切换 front buffer 和 back buffer 显示:eglSwapBuffer
  9. 断开并释放与 EGLSurface 关联的 EGLContext 对象:eglRelease
  10. 删除 EGLSurface 对象
  11. 删除 EGLContext 对象
  12. 终止与 EGLDisplay 之间的连接

三.eglGetConfigs 函数简介  

EGLConfigs 是一个用来描述 EGLSurface 配置信息的数据类型。一般来说,选择配置的方法有两种: 

方法一:系统支持的配置 eglGetConfigs(跨平台时会自动获取系统支持的配置) 

方法二:自定义配置 eglChooseChofig(跨平台时,不同平台需要设置不同的配置)

平台的不同,EGLSurface 配置可能会有也不一样,比如某个设备只支持 16 位色深显示,或是不支持 stencil buffer ,还有其他的功能限制或精度的差异。  


所以在跨平台时,EGLConfigs 配置会有差别,我们可以直接通过 eglGetConfigs 来获取系统支持的配置,系统支持的配置通常是利用系统硬件提供最好的性能,同时也可以解决跨平台配置问题。

下面是获取系统可用的 EGL 配置信息的函数原型:

/* 描述:
 * 参数:
 *      dpy:系统显示类型,EGLDisplay 对象
 *      configs:输出参数,包含当前系统上所有有效的 EGLConfig 配置列表
 *      config_size:当前系统上所有有效的 EGLConfig 配置列表个数
 *      num_config:实际返回的 GLConfig 个数
 *
 * 返回值:返回值:成功返回 TRUE,失败返回 FALSE
 */

 EGLBoolean eglGetConfigs (EGLDisplay dpy, 
                      EGLConfig *configs,
                      EGLint config_size, 
                      EGLint *num_config);

四.eglGetConfigs 函数使用

eglGetConfigs 参数 configs 将包含在你的平台上有效的所有 EGLConfig 配置列表。实际返回的 EGLConfig 的配置个数依赖于程序传入的 config_size 。如果 config_size < num_config ,则不是所有的配置信息都将被返回。 

如果想获取系统支持的所有配置信息,最好的办法就是先给 eglGetConfig 传一个 NULL 的 configs 参数, num_config 将得到系统所支持的配置总数,然后用它来给configs 分配合适的内存大小,再用得到的 configs 来调用 eglGetConfig 。

/******************************************************************************************/
//@Author:猿说编程
//@Blog(个人博客地址): www.codersrc.com
//@File:OpenGL ES EGL eglGetConfigs
//@Time:2022/08/04 07:30
//@Motto:不积跬步无以至千里,不积小流无以成江海,程序人生的精彩需要坚持不懈地积累!
/******************************************************************************************/


EGLConfig *configs_list;
EGLint num_configs;

// Main Display
m_eglDisplay = eglGetDisplay(EGL_DEFAULT_DISPLAY);
if( m_eglDisplay == EGL_NO_DISPLAY || eglGetError() != EGL_SUCCESS )
    return FALSE;

if( eglInitialize( m_eglDisplay, NULL, NULL ) == EGL_FALSE || eglGetError() != EGL_SUCCESS )
    return FALSE;

// find out how many configurations are supported
if ( eglGetConfigs( m_eglDisplay, NULL, 0, &num_configs) == EGL_FALSE || eglGetError() != EGL_SUCCESS )
    return FALSE;

configs_list = malloc(num_configs * sizeof(EGLConfig));
if (configs_list == (EGLConfig *)0)
    return FALSE;

// Get Configurations
if( eglGetConfigs( m_eglDisplay, configs_list, num_configs, &num_configs) == EGL_FALSE || eglGetError() != EGL_SUCCESS )
    return FALSE;

所以在跨平台时,不同平台,EGLConfigs 配置会有差别,我们可以直接通过 eglGetConfigs 来获取系统支持的配置解决跨平台配置问题。

当然,如果需要自定义 EGLConfigs 配置,可以直接使用 eglChooseConfig 完成;


五.猜你喜欢

  1. OpenGL ES 简介
  2. OpenGL ES 版本介绍
  3. OpenGL ES 2.0 和 3.0区别
  4. OpenGL ES 名词解释(一)
  5. OpenGL ES 名词解释(二)
  6. OpenGL ES GLSL 着色器使用过程
  7. OpenGL ES EGL 简介
  8. OpenGL ES EGL 名词解释
  9. OpenGL ES EGL eglGetDisplay
  10. OpenGL ES EGL eglInitialize
  11. OpenGL ES EGL eglGetConfigs
  12. OpenGL ES EGL eglChooseConfig

推荐文章

1条评论

发表评论