目录

  • 一.前言
  • 二.EGLNativeDisplayType
  • 三.EGLNativeWindowType
  • 四.EGLDisplay
    • 1.默认原生窗口渲染
    • 2.强制启用 OPenGL 渲染
  • 五.EGLConfig
  • 六.EGLSurface
    • 1.创建屏幕上的渲染区域 – EGL 窗口,实时预览
    • 2.创建屏幕外的渲染区域 – 离屏渲染
  • 七.EGL Pbuffer 创建屏幕外渲染区域
  • 八.EGLContext
    • 1.创建上下文
    • 2.使用上下文
    • 3.获取上下文信息
    • 4.销毁渲染上下文
  • 九.猜你喜欢

零基础 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 编程

一.前言

OpenGL ES 定义了一个渲染图形的 API。它没有定义窗口系统。为了使 OpenGL ES 可以工作于各种平台之上,我们可以通过 google angle 完成;

ANGLE 的目标是通过将 OpenGL ES API 调用转换为该平台可用的硬件支持的 API 之一,。就是把 OpenGL ES 翻译成其他的语言,譬如说 D3D9 / OpenGL ES / Vulkan / Metal 等等。

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

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

详细参考:OpenGL ES EGL 简介》

二.EGLNativeDisplayType

EGLNativeDisplayType 在 OpenGL ES 与本地窗口系统之间架起了一座沟通的桥梁,EGLNativeDisplayType 一般使用默认的 EGL_DEFAULT_DISPLAY,在不同平台其实现是不同的,EGL 只提供抽象标准,在 Windwos 中 该值默认为 DX ,如果想使用 OPenGL,可以通过如下设置配置

EGLAttrib dispattrs[] = { EGL_PLATFORM_ANGLE_TYPE_ANGLE,EGL_PLATFORM_ANGLE_TYPE_OPENGL_ANGLE,EGL_NONE };

三.EGLNativeWindowType

EGLNativeWindowType 表示窗口句柄,在不同平台其实现是不同的,EGL 只提供抽象标准,在 Windows 中 EGLNativeWindowType 实际上就是窗口句柄 HWND ,头文件声明如下:

#if !defined(WINAPI_FAMILY) || (WINAPI_FAMILY == WINAPI_FAMILY_DESKTOP_APP) /* Windows Desktop */typedef HWND    EGLNativeWindowType;
#else
/* Windows Store */
#include <inspectable.h>
typedef IInspectable* EGLNativeWindowType;#endif

如果是想在窗口实时查看渲染结果,我们可以通过 eglCreateWindowSurface 创建可显示的 EGLSurface ,绑定窗口 HWND 后预览显示;

如果是离屏幕渲染,不需要绑定窗口,那么就不需要该参数,可以直接使用 eglCreatePbufferSurface 创建不可显示的 EGLSurface,保存在显存中的帧;

四.EGLDisplay

**EGLDisplay 是一个关联系统物理屏幕的通用数据类型。**对于 PC 来说, EGLDisplay 就是显示器的句柄。不管是嵌入式系统或 PC ,都可能有多个物理显示设备。为了使用系统的显示设备, EGL 提供了 EGLDisplay 数据类型,以及一组操作设备显示的 API 。

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

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

EGLDisplay eglGetDisplay(EGLNativeDisplayType displayId);

1.默认原生窗口渲染

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

eglDisplay = eglGetDisplay(EGL_DEFAULT_DISPLAY);

2.强制启用 OPenGL 渲染

EGLAttrib dispattrs[] = { EGL_PLATFORM_ANGLE_TYPE_ANGLE,EGL_PLATFORM_ANGLE_TYPE_OPENGL_ANGLE,EGL_NONE };eglDisplay = eglGetPlatformDisplay(EGL_PLATFORM_ANGLE_ANGLE,EGL_DEFAULT_DISPLAY, dispattrs);

五.EGLConfig

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

六.EGLSurface

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

** EGLSurface 相当于一块画布(一块内存空间),用户想绘制的信息首先都要先绘制到 EGLSurface 上**

EGLSurface 分为以下三类:

1.Surface – 可显示的 Surface,实际上就是一个 FrameBuffer,用于绑定窗口后预览显示;

2.PixmapSurface – 不是可显示的 Surface,保存在系统内存中的位图;

3.PBufferSurface – 不是可显示的 Surface,保存在显存中的帧,用于离屏渲染,不需要绑定窗口

1.创建屏幕上的渲染区域 – EGL 窗口,实时预览

eglCreateWindowSurface 成功时返回新创建的 EGLSurface ,失败时返回 EGL_NO_SURFACE.

EGLSurface eglCreateWindowSurface(EGLDisplay display,            //对应的EGL display连接EGLConfig config,         //EGL frame buffer配置NativeWindowType native_window, //原生窗口EGLint const * attrib_list);  // Window Surface属性列表,可以为NULL

2.创建屏幕外的渲染区域 – 离屏渲染

创建一个离屏 pixel buffer surface 返回它的句柄

EGLSurface eglCreatePbufferSurface(EGLDisplay display,       // 指定EGL显示连接EGLConfig config,       // 指定配置const EGLint *attribList)       // 指定像素缓冲区属性

相关错误码:

EGL_BAD_MATCH :提供了与窗口属性不匹配的 EGLConfig,或该 EGLConfig 不支持渲染到窗口
EGL_BAD_CONFIG :提供的 EGLConfig 没有得到系统支持
EGL_BAD_NATIVE_WINDOW :提供的原生窗口句柄无效
EGL_BAD_ALLOC :无法为新的窗口分配资源,或已经有和提供的原生窗口关联的 EGLConfig

七.EGL Pbuffer 创建屏幕外渲染区域

除了可以用 OpenGL ES 3.0 在屏幕上的窗口渲染之外,还可以渲染称作 Pbuffer (像素缓冲区 Pixel buffer 简写)的不可见的屏幕外表面,不需要绑定窗口,用于离屏渲染。

和窗口一样,pbuffer 可以利用 OpenGL ES 3.0 中的任何硬件加速。Pbuffer 最常用于生成纹理贴图。如果你想要做的是渲染到一个纹理,那么我们建议使用帧缓冲区代替 Pbuffer,因为 帧缓冲区更高效。

创建 Pbuffer 和创建 EGL 窗口非常类似,只有少数微小的不同。为了创建 Pbuffer ,需要和窗口一样找到 EGLConfig ,并作一处修改:我们需要扩增 EGL_SURFACE_TYPE 的值,使其包含 EGL_PBUFFER_BIT。

EGLSurface eglCreatePbufferSurface(EGLDisplay display, // 指定EGL显示连接EGLConfig config, // 符合条件的 EGLConfigconst EGLint *attribList); // 指定像素缓冲区属性列表,可为 NULL

创建一个 EGL 像素缓冲区:

 EGLint attribList[] = {EGL_SURFACE_TYPE,EGL_PBUFFER_BIT,EGL_RENDERABLE_TYPE, EGL_OPENGL_ES3_BIT_KHR,EGL_RED_SIZE, 5,EGL_GREEN_SIZE, 6,EGL_BLUE_SIZE, 5,EGL_DEPTH_SIZE, 1,EGL_NONE};// 查询EGL表面配置const EGLint MaxConfigs = 10;EGLConfig configs[MaxConfigs]; // We'll only accept 10 configsEGLint numConfigs;if (!eglChooseConfig(display, attribList, configs, MaxConfigs, &numConfigs)) {// Something didn't work … handle error situation} else {// Everything's okay. Continue to create a rendering surface}// Proceed to create a 512*512 pbufferEGLSurface pbuffer;EGLint attribList2[] ={EGL_WIDTH, 512,EGL_HEIGHT, 512,EGL_LARGEST_PBUFFER, EGL_TRUE,EGL_NONE};pbuffer = eglCreatePbufferSurface(display, config, attribList2);if (pbuffer == EGL_NO_SURFACE) {switch (eglGetError()) {case EGL_BAD_ALLOC:// Not enough resources available. Handle and recoverbreak;case EGL_BAD_CONFIG:// Verify that provided EGLConfig is validbreak;case EGL_BAD_PARAMETER:// Verify that EGL_WIDTH and EGL_HEIGHT are non-negative valuesbreak;case EGL_BAD_MATCH:// Check window and EGLConfig attributes to determine// compatibility, or verify that the EGLConfig// supports rendering to a window,break;}}EGLint width;EGLint height;if(!eglQuerySurface( display,pbuffer,EGL_WIDTH,&width) ||!eglQuerySurface( display,pbuffer,EGL_HEIGHT,&height)){//Unable to query surface information}

八.EGLContext

1.创建上下文

OpenGL ES 图形上下文,它代表了 OpenGL 状态机;如果没有它,OpenGL 指令就没有执行的环境。

EGLAPI EGLContext EGLAPIENTRY eglCreateContext(EGLDisplay display,EGLConfig config,EGLContext share_context,const EGLint *attribList);

EGLContext 上下文包含了操作所需的所有状态信息,OpenGL ES 必须有一个可用的上下文才能进行绘图。

2.使用上下文

EGLAPI EGLBoolean EGLAPIENTRY eglMakeCurrent(EGLDisplay display,EGLSurface draw,EGLSurface read, EGLContext context);

3.获取上下文信息

eglQueryContext 用于获取 Context 信息

EGLAPI EGLBoolean EGLAPIENTRY eglQueryContext(EGLDisplay display,EGLContext context,EGLint attribute,EGLint *value);

成功时返回 EGL_TRUE,失败时返回 EGL_FALSE,可能的错误为:

EGL_BAD_DISPLAY
EGL_NOT_INITIALIZED
EGL_BAD_CONTEXT
EGL_BAD_ATTRIBUTE

attribute 取值可以是:

EGL_CONFIG_ID
EGL_CONTEXT_CLIENT_TYPE
EGL_CONTEXT_CLIENT_VERSION
EGL_RENDER_BUFFER

4.销毁渲染上下文

EGLAPI EGLBoolean EGLAPIENTRY eglDestroyContext(EGLDisplay display, EGLContext context);

九.猜你喜欢

  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 名词解释

OpenGL ES EGL 名词解释相关推荐

  1. OpenGL ES EGL eglDestroyContext

    目录 一. EGL 前言 二. EGL 绘制流程简介 三.eglDestroyContext 函数简介 四.eglDestroyContext 使用 四.猜你喜欢 零基础 OpenGL ES 学习路线 ...

  2. OpenGL ES EGL eglCreatePbufferSurface

    目录 一. EGL 前言 二. EGL 绘制流程简介 三.eglCreatePbufferSurface 函数简介 1.eglCreatePbufferSurface 简介 2.eglCreatePb ...

  3. OpenGL ES EGL eglQueryContext

    目录 一. EGL 前言 二. EGL 绘制流程简介 三.eglQueryContext 函数简介 四.eglQueryContext 使用 四.猜你喜欢 零基础 OpenGL ES 学习路线推荐 : ...

  4. OpenGL ES EGL eglDestroySurface

    目录 一. EGL 前言 二. EGL 绘制流程简介 三.eglDestroySurface 函数简介 四.eglDestroySurface 使用 四.猜你喜欢 零基础 OpenGL ES 学习路线 ...

  5. OpenGL ES EGL eglSwapBuffer

    目录 一. EGL 前言 二. EGL 绘制流程简介 三.eglSwapBuffer 函数简介 四.关于多个 EGLContext 五.共享 EGLContext 六.猜你喜欢 零基础 OpenGL ...

  6. OpenGL ES EGL 简介

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

  7. OpenGL ES EGL TLS(线程局部存储) G3D

    1. 什么是EGL EGL是用来管理绘图表面的(Drawing surfaces),并且提供了如下的机制 (1) 与本地窗口系统进行通信 (2) 查找绘图表面可用的类型和配置信息 (3) 创建绘图表面 ...

  8. OpenGL ES glut glew glfw glad freeglut

    目录 一.简介 1.freeglut 2.glew 3.glut 4.glfw 5.glad 二.分类 1.窗口管理 2.函数加载 三.组合使用 1.freeglut + glew 2.glfw + ...

  9. OpenGL ES glfw 下载和使用

    目录 一.glfw 简介 二.glfw 下载 三.glfw 编译 四.glfw 使用 1.OpenGL glfw + glad 效果演示 2.OpenGL glfw + glad <源码下载&g ...

  10. OpenGL ES freeglut 下载和使用

    目录 一.freeglut 简介 二.freeglut 下载 五.猜你喜欢 零基础 OpenGL ES 学习路线推荐 : OpenGL ES 学习目录 >> OpenGL ES 基础 零基 ...

最新文章

  1. Cocos 全局变量的使用
  2. 机器学习与高维信息检索 - Note 2 - 统计决策和机器学习
  3. Framework7 4.1.0 发布,全功能 HTML 框架
  4. Android数据存储的三种方式-SharedPrefrences,File,SQLite
  5. MVC和MVVM以及MVP的介绍
  6. 简述html语音的概念,语音共振的概念和特点简述
  7. django Exception Value:no such table: cmdb_XXX
  8. jersey客户端_每个客户使用Jersey处理的Cookie
  9. 支撑阻力指标_使用k表示聚类以创建支撑和阻力
  10. 8次c语言上机作业答案,计算机二级C语言上机题库及答案2017
  11. 利用Excel进行成对(配对)T检验
  12. 可以叫板Google的一个搜索引擎 —— DuckDuckGo
  13. vscode编辑python_VSCode+Python开发环境
  14. 串口(SATA)硬盘如何使用GHOST
  15. 【Flink】RuntimeException: Row arity of from does not match serializers
  16. 解决U盘复制拷贝文件过大不能超过4G的方法
  17. 腾讯云Ubuntu我的配置
  18. 2021第十二届蓝桥杯大赛软件赛省赛C++ B组真题题解
  19. 数据分析:基于Pandas的全球自然灾害分析与可视化
  20. java计算机毕业设计H5女娲宫旅游网站设计与实现源码+mysql数据库+系统+lw文档+部署

热门文章

  1. 在vue项目中使用supermap,基于 SuperMap iClient 8C(2017) for JavaScript,底图为天地图
  2. 超级科技网络安全风险评估服务,全面了解网络系统面临的安全风险
  3. mysql 统计当个用户从当前时间连续登录天数,以及多用户某时间段,最长连续登录天数查询
  4. linux分区卡住,紧张!正在安ubuntu9.10,分区卡住!
  5. 读懂python代码_【坚持】Selenium+Python学习之从读懂代码开始 DAY6
  6. 自动驾驶汽车是如何利用高精度地图和高精度定位来进行“导航”的
  7. python英文文本分析和提取_Python实现英文新闻摘要自动提取
  8. 绑定挂载mount --bind介绍
  9. 天气预报API接口大全
  10. JSHOP2学习1:环境配置(超详细教程)