OpenGL ES EGL eglGetDisplay

OpenGL ES EGL eglGetDisplay

零基础 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
  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 之间的连接

三. eglGetDisplay

在不同平台上有不同的机制以关联窗口系统,在 Windows 上是 WGL ,在 Linux 上是 GLX ,在 Apple OS 上是 AGL 等。 

EGL 则是平台上 WGL / GLX / AGL 的等价物。eglGetDisplay 为原生窗口系统 displayId 获取一个EGL display连接,在 OpenGL ES 与本地窗口系统之间架起了一座沟通的桥梁,函数声明如下:

/* 描述:获取 EGLDisplay 对象 显示设备
 * 参数:
 *   displayId:系统显示类型
 *
 * 返回值:成功返回 EGLDisplay 对象,失败返回 EGL_NO_DISPLAY
 */
 EGLDisplay eglGetDisplay(EGLNativeDisplayType displayId);

1.使用系统默认显示类型

EGLNativeDisplayType  默认为 EGL_DEFAULT_DISPLAY ,即返回与默认原生窗口的连接,在 Windows 中默认为 DX 渲染

EGLDisplay eglDisplay = eglGetDisplay(EGL_DEFAULT_DISPLAY);    //两种写法任选其一,效果等价
EGLDisplay eglDisplay = eglGetDisplay(0);                      //两种写法任选其一,效果等价 

2.强制启用 OpenGL 渲染

OpenGL 选择 EGL_PLATFORM_ANGLE_TYPE_OPENGL_ANGLE

//OpenGL 选择 EGL_PLATFORM_ANGLE_TYPE_OPENGL_ANGLE
 EGLAttrib dispattrs[] = { EGL_PLATFORM_ANGLE_TYPE_ANGLE,
             EGL_PLATFORM_ANGLE_TYPE_OPENGL_ANGLE,EGL_NONE };

 EGLDisplay eglDisplay = eglGetPlatformDisplay(EGL_PLATFORM_ANGLE_ANGLE,
             EGL_DEFAULT_DISPLAY, dispattrs);

3.强制启用 DX 渲染

DX 选择 EGL_PLATFORM_ANGLE_TYPE_D3D9_ANGLE 或者 EGL_PLATFORM_ANGLE_TYPE_D3D11_ANGLE

 //DX 选择 EGL_PLATFORM_ANGLE_TYPE_D3D9_ANGLE 或者 EGL_PLATFORM_ANGLE_TYPE_D3D11_ANGLE
 EGLAttrib dispattrs[] = { EGL_PLATFORM_ANGLE_TYPE_ANGLE,
             EGL_PLATFORM_ANGLE_TYPE_D3D9_ANGLE,EGL_NONE };

 EGLDisplay eglDisplay = eglGetPlatformDisplay(EGL_PLATFORM_ANGLE_ANGLE,
             EGL_DEFAULT_DISPLAY, dispattrs);

4.检查返回值

EGLDisplay eglDisplay = eglGetDisplay(EGLNativeDisplayType displayId);
 if (eglDisplay == EGL_NO_DISPLAY || eglGetError() != EGL_SUCCESS))
    return error;
 else
    return success;

四.猜你喜欢

  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

推荐文章

发表评论