目录

  • 一.EGL 简介
  • 二.EGL 跨平台之 ANGLE
  • 1.ANGLE 支持跨平台
  • 2.ANGLE 支持渲染器
  • 3.ANGLE 下载地址
  • 三.EGL 坐标系
  • 四.EGL 绘图步骤
  • 五.猜你喜欢

一.EGL 简介

EGL 是渲染 API(如 OpenGL ES)和原生窗口系统之间的接口。通常来说,OpenGL 是一个操作 GPU 的 API,它通过驱动向 GPU 发送相关指令,控制图形渲染管线状态机的运行状态,但是当涉及到与本地窗口系统进行交互时,就需要这么一个中间层,因此 EGL 被设计出来,作为 OpenGL 和原生窗口系统之间的桥梁,且它与平台无关的。

egl 怎么使用 skia gpu opengles egl_opengl教程

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

EGL 则是平台上 WGL / GLX / AGL 的等价物。EGL 假设 OS 会提供窗口系统,但 EGL 与平台无关,并不局限于任何特定的窗口系统,所有用到本地窗口系统的地方都用屏蔽指针来处理,这就是易于移植的关键。

egl 怎么使用 skia gpu opengles egl_opengl教程_02

二.EGL 跨平台之ANGLE

EGL API 是独立于 OpenGL ES 各版本标准的独立的一套 API,其主要作用是为 OpenGL ES 指令 创建 Context 、绘制目标 Surface 、配置 FrameBuffer 属性、Swap 提交绘制结果 等。

ANGLE 是一个 google 发起的开源项目, 用在 chromium 项目里面,作为底层的图形渲染引擎的一部分。ANGLE 的目标是通过将 OpenGL ES API 调用转换为该平台可用的硬件支持的 API 之一,从而允许多个操作系统的用户无缝运行 WebGL 和其他 OpenGL ES 内容。换句话说,angle 就是把 opengl es 翻译成其他的语言,譬如说 D3D9 / OpenGL ES / Vulkan 等等。

1.ANGLE 支持跨平台

egl 怎么使用 skia gpu opengles egl_opengl基础_03

2.ANGLE支持渲染器

egl 怎么使用 skia gpu opengles egl_opengles_04

ANGLE 支持 Windows / Mac / Linux / Android / Ios ;

ANGLE 目前提供从 OpenGL ES 2.0、3.0 和 3.1 到 Vulkan、桌面 OpenGL、OpenGL ES、Direct3D 9 和 Direct3D 11 的转换;

未来的计划包括 ES 3.2,转换到 Metal 和 MacOS、Chrome OS 和 Fuchsia 支持;

关于**ANGLE 编译后面会有详细讲解,留意文章目录《OpenGL ES 基础》;**

3.ANGLE下载地址

google angle 下载地址:https://github.com/google/angle

三.EGL 坐标系

EGL 坐标系和 OpenGL ES 坐标系统一致,如下:


egl 怎么使用 skia gpu opengles egl_opengl_05

很多人有一个误解:认为 OpenGL ES 纹理原点在左上角,因为如果绘制时纹理坐标设在左下角,绘制的图像就是上下倒立;而纹理坐标设制在左上角显示正常

原因:图像默认的原点在左上角,而 OpenGL ES 纹理读取数据或者 FBO 读取数据时都是以左下角开始,所以图像才会出现上下倒立的现象;

在文章《OpenGL 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 之间的连接

egl 怎么使用 skia gpu opengles egl_opengles_06