OpenGL ES EGL eglCreateContext
目录
- 一. EGL 前言
- 二. EGL 绘制流程简介
- 三.eglCreateContext 函数简介
- 1.关于属性列表 attribList
- 2.关于返回值
- 四.eglCreateContext 函数使用
- 五.猜你喜欢
零基础 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 的配置属性
EGLContext – OpenGL ES 图形上下文
二. EGL 绘制流程简介
- 获取 EGL Display 对象:eglGetDisplay
- 初始化与 EGLDisplay 之间的连接:eglInitialize
- 获取 EGLConfig 对象:eglChooseConfig / eglGetConfigs
- 创建 EGLContext 实例:eglCreateContext
- 创建 EGLSurface 实例:eglCreateWindowSurface / eglCreatePbufferSurface
- 连接 EGLContext 和 EGLSurface:eglMakeCurrent
- 使用 OpenGL ES API 绘制图形:gl_*
- 切换 front buffer 和 back buffer 显示:eglSwapBuffer
- 断开并释放与 EGLSurface 关联的 EGLContext 对象:eglRelease
- 删除 EGLSurface 对象
- 删除 EGLContext 对象
- 终止与 EGLDisplay 之间的连接
三.eglCreateContext 函数简介
EGLContext 上下文包含了操作所需的所有状态信息,OpenGL ES 必须有一个可用的上下文 EGLContext 才能进行绘图。如果没有 EGLContext ,OpenGL 指令就没有执行的环境。函数声明如下:
/*描述:创建 OpenGL ES 上下文 EGLContext*参数:* display:指定显示的连接* config:配置 EGLConfig* share_context:允许其它 EGLContext 共享数据,使用 EGL_NO_CONTEXT 表示不共享* attribList:指定操作的属性列表,只能接受一个属性 EGL_CONTEXT_CLIENT_VERSION(设置 OpenGL ES 版本)**返回值:成功时返回新创建的 EGLContext,失败时返回 EGL_NO_CONTEXT*/EGLAPI EGLContext EGLAPIENTRY eglCreateContext(EGLDisplay display,EGLConfig config,EGLContext share_context,const EGLint *attribList);
1.关于属性列表 attribList
attribList 属性目前只有 EGL_CONTEXT_CLIENT_VERSION,类型是整数值,用于指定 OpenGL ES 版本,使用方法如下:
/*
EGL_CONTEXT_CLIENT_VERSION, 3, //使用OpenGL ES 3.0 版本 API
EGL_CONTEXT_CLIENT_VERSION, 2, //使用OpenGL ES 2.0版本 API
EGL_CONTEXT_CLIENT_VERSION, 1, //使用OpenGL ES 1.0版本 API
*/
const ELGint attribList[] = {EGL_CONTEXT_CLIENT_VERSION, 3, //使用OpenGL ES 3.0 版本 APIEGL_NONE
};
如果当前设备只支持 OpenGL ES 2.0,那么该值就不能设置为 3 ,否则上下文创建失败;
值得注意的是:如果使用 OpenGL ES 2.0,那么就不能使用 OpenGL ES 3.0 相关 API, VAO / PBO 等都属于 OpenGL ES 3.0,详细介绍请参考《OpenGL ES 2.0 和 3.0 区别》
2.关于返回值
成功时返回新创建的 EGLContext,失败时返回 EGL_NO_CONTEXT,也有可能返回其他错误,可以通过 eglGetError 获取错误号,示例代码:
EGLContext context = eglCreateContext(display, config, EGL_NO_CONTEXT, attribList);if (context == EGL_NO_CONTEXT) {EGLError error = eglGetError();if (error == EGL_BAD_CONFIG) {// Handle error and recover}
}
通过 eglGetError 获取错误类型可能是以下值:
EGL_BAD_MATCH
EGL_BAD_DISPLAY
EGL_NOT_INITIALIZED
EGL_BAD_CONFIG
EGL_BAD_CONTEXT
EGL_BAD_ATTRIBUTE
EGL_BAD_ALLOC
四.eglCreateContext 函数使用
/******************************************************************************************/
//@Author:猿说编程
//@Blog(个人博客地址): www.codersrc.com
//@File:OpenGL ES EGL eglCreateContext
//@Time:2022/08/04 07:30
//@Motto:不积跬步无以至千里,不积小流无以成江海,程序人生的精彩需要坚持不懈地积累!
/******************************************************************************************/EGLint attrs[3] = { EGL_DEPTH_SIZE, 16, EGL_NONE };
EGLint num_configs;
EGLConfigs *configs_list;
// Get the display device
if ((eglDisplay = eglGetDisplay(EGL_NO_DISPLAY)) == EGL_NO_DISPLAY) {return eglGetError();
}
// Initialize the display
if (eglInitialize(eglDisplay, NULL, NULL) == EGL_FALSE) {return eglGetError();
}
// Obtain the total number of configurations that match
if (eglChooseConfig(eglDisplay, attrs, NULL, 0, &num_configs) == EGL_FALSE) {return eglGetError();
}
configs_list = malloc(num_configs * sizeof(EGLConfig));
if (configs_list == (EGLConfig *)0){return eglGetError();
}
// Obtain the first configuration with a depth buffer of 16 bits
if (!eglChooseConfig(eglDisplay, attrs, &configs_list, num_configs, &num_configs)) {return eglGetError();
}const EGLint attribs[] =
{ EGL_CONTEXT_CLIENT_VERSION, 2, //使用OpenGL ES 2.0 版本 APIEGL_NONE
};
EGLContext context = eglCreateContext(display, configs_list, EGL_NO_CONTEXT, attribs); if (context == EGL_NO_CONTEXT)
{ if (EGL_BAD_CONFIG == eglGetError()) { ... }
}
五.猜你喜欢
- OpenGL ES 简介
- OpenGL ES 版本介绍
- OpenGL ES 2.0 和 3.0 区别
- OpenGL ES 名词解释(一)
- OpenGL ES 名词解释(二)
- OpenGL ES GLSL 着色器使用过程
- OpenGL ES EGL 简介
- OpenGL ES EGL 名词解释
- OpenGL ES EGL eglGetDisplay
- OpenGL ES EGL eglInitialize
- OpenGL ES EGL eglGetConfigs
- OpenGL ES EGL eglChooseConfig
- OpenGL ES EGL eglGetError
- OpenGL ES EGL eglCreateContext
OpenGL ES EGL eglCreateContext相关推荐
- OpenGL ES EGL eglDestroyContext
目录 一. EGL 前言 二. EGL 绘制流程简介 三.eglDestroyContext 函数简介 四.eglDestroyContext 使用 四.猜你喜欢 零基础 OpenGL ES 学习路线 ...
- OpenGL ES EGL eglCreatePbufferSurface
目录 一. EGL 前言 二. EGL 绘制流程简介 三.eglCreatePbufferSurface 函数简介 1.eglCreatePbufferSurface 简介 2.eglCreatePb ...
- OpenGL ES EGL eglQueryContext
目录 一. EGL 前言 二. EGL 绘制流程简介 三.eglQueryContext 函数简介 四.eglQueryContext 使用 四.猜你喜欢 零基础 OpenGL ES 学习路线推荐 : ...
- OpenGL ES EGL eglDestroySurface
目录 一. EGL 前言 二. EGL 绘制流程简介 三.eglDestroySurface 函数简介 四.eglDestroySurface 使用 四.猜你喜欢 零基础 OpenGL ES 学习路线 ...
- OpenGL ES EGL eglSwapBuffer
目录 一. EGL 前言 二. EGL 绘制流程简介 三.eglSwapBuffer 函数简介 四.关于多个 EGLContext 五.共享 EGLContext 六.猜你喜欢 零基础 OpenGL ...
- OpenGL ES EGL 简介
目录 一.EGL 简介 二.EGL 跨平台之 ANGLE 1.ANGLE 支持跨平台 2.ANGLE 支持渲染器 3.ANGLE 下载地址 三.EGL 坐标系 四.EGL 绘图步骤 五.猜你喜欢 零基 ...
- OpenGL ES EGL TLS(线程局部存储) G3D
1. 什么是EGL EGL是用来管理绘图表面的(Drawing surfaces),并且提供了如下的机制 (1) 与本地窗口系统进行通信 (2) 查找绘图表面可用的类型和配置信息 (3) 创建绘图表面 ...
- OpenGL ES glut glew glfw glad freeglut
目录 一.简介 1.freeglut 2.glew 3.glut 4.glfw 5.glad 二.分类 1.窗口管理 2.函数加载 三.组合使用 1.freeglut + glew 2.glfw + ...
- OpenGL ES glfw 下载和使用
目录 一.glfw 简介 二.glfw 下载 三.glfw 编译 四.glfw 使用 1.OpenGL glfw + glad 效果演示 2.OpenGL glfw + glad <源码下载&g ...
- OpenGL ES freeglut 下载和使用
目录 一.freeglut 简介 二.freeglut 下载 五.猜你喜欢 零基础 OpenGL ES 学习路线推荐 : OpenGL ES 学习目录 >> OpenGL ES 基础 零基 ...
最新文章
- python 获取文件大小,创建时间和访问时间
- linux查看ssh端口8222,下载服务器SSH被用户恶意猜密码了
- error:Flash Download failed-“Cortex-M3”,“Programming Algorithm”【转】
- C#泛型-泛型集合DictionaryK,V
- 数据库之关系模型的组成,特点以及完整性约束
- OpenCV findContours和drawContours用法的实例(附完整代码)
- docker安装软件(vim,service)
- 如何有效的保护计算机,如何保护计算机-20210717095143.pdf-原创力文档
- AT指令:常见的AT命令
- C语言宏定义,内置宏的用法
- 【面试】求数组子序列的最大和
- python面向对象设计角色攻击_Python技能:面向对象基础实战之英雄联盟
- python爬虫音乐犯法么_Python爬虫实战之爬取QQ音乐数据!QQ音乐限制太多了
- 基于Python的QQ空间相册中的所有照片下载器
- 2018 06 01 第一次博客 自然语言处理
- 乔治城大学计算机科学硕士2019,乔治城大学2019THE世界大学排名最新排名第109
- element table 左对齐
- Merriam-Webster's Vocabulary Builder 学习笔记 Unit 6
- 分光器尺寸及光损耗计算
- tcp ip通讯 linux xpe,xpe安装在PCA-6006VE( #234
热门文章
- openMP编程详解(囊括所有基本指令)
- idea如何实现修改代码即时生效
- 大型医院挂号系统(数据结构课设)
- 设置一绝对地址为0x67a9的整型变量的值为0xaa66
- 魔方游戏(附游戏开源代码)
- 【Microsoft Azure 的1024种玩法】六十九.通过SSMS将本地自建SQL Server 数据库脱机迁移至Azure SQL Database
- 《PRML》第一章 读书笔记.1
- TypeError: __init__() got an unexpected keyword argument ‘rate‘
- Mocking and Stubbing
- OpenStack部署(图文详解)