OpenGL之EGL入门知识

通过一个例子理解EGL和OpenGL的离屏刷新 EGL是什么? EGL 是 OpenGL ES 渲染 API 和本地窗口系统(native platform window system)之间的一个中间接口层,它主要由系统制造商实现,为了让OpenGL ES能够绘制在当前设备上,我们需要EGL作为OpenGL ES与设备的桥梁。在Android中我们要使用OpenGL那么必须先初始化EGL环境 初始化EGL环境 获取EGL实例 egl = (... 阅读详情

参考博文

本来材料参考下述博文,感谢作者 :
https://blog.youkuaiyun.com/ba_jie/article/details/6370701

概述

EGL是由Khronos Group提供的一组平台无关的API,它的主要功能如下:
1. 和本地窗口系统(native windowing system)通讯;
2. 查询可用的配置;
3. 创建OpenGL ES可用的“绘图表面”(drawing surface);
4. 同步不同类别的API之间的渲染,比如在OpenGL ES和OpenVG之间同步,或者在OpenGL和本地窗口的绘图命令之间;
5. 管理“渲染资源”,比如纹理映射(rendering map)。

EGLDisplay

EGL可运行于GNU/Linux的X Window System,Microsoft Windows和MacOS X的Quartz。
EGL把这些平台的显示系统抽象为一个独立的类型:EGLDisplay。
使用EGL的第一步就是初始化一个可用的EGLDisplay:

EGLint majorVersion;  
EGLint minorVersion;  
EGLBoolean success = EGL_FALSE;  
EGLDisplay display = eglGetDisplay(EGL_DEFAULT_DISPLAY);  
if (display != EGL_NO_DISPLAY)  
{  
    success = eglInitialize(display, &majorVersion, &minorVersion);  
}  
if (success != EGL_TRUE)  
{  
    EGLint errno = eglGetError();  
    if (errno != EGL_SUCCESS)  
    {  
        _TCHAR errmsg[32];  
        _stprintf(errmsg, _T("[EGL] Initialization failed. Error code: 0x%04x"), errno);  
        // EGL_BAD_DISPLAY      EGLDisplay参数错误  
        // EGL_NOT_INITIALIZED  EGL不能初始化  
    }  
}  

这里用到了三个EGL函数:

EGLDisplay eglGetDisplay(EGLNativeDisplayType id);  
EGLBoolean eglInitialize(EGLDisplay display, EGLint* majorVersion, EGLint* minorVersion);  
EGLint eglGetError();  

EGLConfig

初始化过后,要选择一个合适的“绘图表面”。例子如下:

static const EGLint CONFIG_ATTRIBS[] =  
{  
    EGL_RED_SIZE,       5,  
    EGL_GREEN_SIZE,     6,  
    EGL_BLUE_SIZE,      5,  
    EGL_DEPTH_SIZE,     16,  
    EGL_ALPHA_SIZE,     EGL_DONT_CARE,  
    EGL_STENCIL_SIZE,   EGL_DONT_CARE,  
    EGL_SURFACE_TYPE,   EGL_WINDOW_BIT,  
    EGL_NONE            // 属性表以该常量为结束符  
};  
GLint numConfigs;  
EGLConfig config;  
if (success != EGL_FALSE)  
    success = eglGetConfigs(display, NULL, 0, &numConfigs);  
if (success != EGL_FALSE && numConfigs > 0)  
    success = eglChooseConfig(display, CONFIG_ATTRIBS, &config, 1, &numConfigs);  

可以查询某个配置的某个属性:

EGLBoolean eglGetConfigAttrib(EGLDisplay display,    // 已初始化  
                              EGLConfig config,      // 某个配置  
                              EGLint attribute,      // 某个属性  
                              EGLint * value);  

让EGL为你选择一个配置:

EGLBoolean eglChooseConfig(EGLDisplay display,  
                           const EGLint* attribs,    // 你想要的属性事先定义到这个数组里  
                           EGLConfig* configs,       // 图形系统将返回若干满足条件的配置到该数组  
                           EGLint maxConfigs,        // 上面数组的容量  
                           EGLint* numConfigs);      // 图形系统返回的可用的配置个数  

EGL如果选择了多个配置给你,则按一定规则放到数组里:
1. EGL_CONFIG_CAVEAT
2. EGL_COLOR_BUFFER_TYPE
3. 按color buffer所占位宽
4. EGL_BUFFER_SIZE
5. EGL_SAMPLE_BUFFERS
6. EGL_SAMPLES
7. EGL_DEPTH_SIZE
8. EGL_STENCIL_SIZE
9. EGL_ALPHA_MASK_SIZE
10. EGL_NATIVE_VISUAL_TYPE
11. EGL_CONFIG_ID

EGLSurface

EGLSurface eglCreateWindowSurface(EGLDisplay display,  
                                  EGLConfig config,  
                                  EGLNativeWindowType window, // 在Windows上就是HWND类型  
                                  const EGLint* attribs);     // 此属性表非彼属性表  

这里的属性表并非用于OpenGL ES 2.0,而是其它的API,比如OpenVG。我们只需要记住一个:EGL_RENDER_BUFFER [EGL_BACK_BUFFER, EGL_FRONT_BUFFER]。
OpenGL ES 2.0是必须工作于双缓冲窗口系统的。
该属性表当然也可以为NULL,也可以只有一个EGL_NONE。那表示所有属性使用默认值。
如果函数返回EGL_NO_SURFACE,则失败。错误码:
EGL_BAD_MATCH: 属性设置错误。比如EGL_SURFACE_TYPE没有设置EGL_WINDOW_BIT
EGL_BAD_CONFIG: 因为配置错误,图形系统不支持
EGL_BAD_NATIVE_WINDOW: 窗口句柄错误
EGL_BAD_ALLOC: 无法创建绘图表面。比如先前已经创建一个了。

EGLContext

EGLContext eglCreateContext(EGLDisplay display,  
                            EGLConfig config,  
                            EGLContext context,    // EGL_NO_CONTEXT表示不向其它的context共享资源  
                            const EGLint * attribs)// 我们暂时只用EGL_CONTEXT_CLIENT_VERSION  
const EGLint attribs[] =  
{  
    EGL_CONTEXT_CLIENT_VERSION, 2,  
    EGL_NONE  
};  
EGLContext context = eglCreateContext(display, cfg, EGL_NO_CONTEXT, attribs);  
if (context == EGL_NO_CONTEXT)  
{  
    if (EGL_BAD_CONFIG == eglGetError())  
    {  
        ...  
    }  
}  
if (!eglMakeCurrent(display, window, window, context)) // 两个window表示读写都在一个窗口  
{  
    // 报错  
}  

渲染同步

只使用OpenGL ES 2.0,那么,glFinish即可保证所有的渲染工作进行下去。
但使用OpenVG或本地图形API渲染字体,要比使用OpenGL ES 2.0要容易。所以,你可能要在同一个窗口使用多个库来渲染。

可以用EGL的同步函数:EGLBoolean eglWaitClient() 延迟客户端的执行,等待服务器端完成OpenGL ES 2.0或者OpenVG的渲染。
如果失败,返回错误码:EGL_BAD_CURRENT_SURFACE。

如果要等待本地图形API的渲染完成,使用:EGLBoolean eglWaitNative(EGLint engine)。
engine参数必须是EGL_CORE_NATIVE_ENGINE。其它值都是通过EGL扩展来指定。
如果失败,返回错误码:EGL_BAD_PARAMETER。

OpenGL ES 2.0学习之路--4.EGL介绍 第三章我们使用 OpenGL ES 2.0在窗口绘制了一个三角形,但我们使用自己的函数去打开和管理窗口,虽然我们的例子很简单,但是它让OpenGL ES 2.0在你的系统工作时减少你的工作量。 为发展编程上下文环境,提供了平台独立的API叫做EGL,用来管理绘制窗口,EGL提供下面的机制。 你使用的系统窗口之间的通讯 查询可用的类型,配置绘图窗口 创建绘图窗口 同步OpenGL ES 2.0渲染... 阅读详情

相关推荐

OpenGL ES 2.0学习(一)入门知识点

前言 一个多月前开始学习Android OpenGL ES,起初是因为需要做滤镜,然后慢慢发现很有趣。但是自己感觉学起来并没有想象那么容易,主要涉及太多的转换,还有着色器语言等,但它确实强大,可以做一些滤镜,很炫的3D效果/全景等。目前自己还处于入门阶段。 OpenGL ES OpenGL ES 为OpenGL嵌入式系统,是一个适用于嵌入式系统的二维或者三维的图形库 是桌面版O...

A_sendy的博客 914

EGL学习笔记

EGL (Embedded-System Graphics Library) 是一个图形库,主要用于在嵌入式系统中管理渲染表面(surface)和 GPU 之间的通信。EGL 定义了一组 API,用于连接 OpenGL ES、OpenVG或其他原生渲染 API 与底层图形设备驱动程序之间的通信。EGL™ 是 Khronos 渲染 API(例如 OpenGL ES 或 OpenVG)与底层原生平台窗口系统之间的接口。

weixin_45730790的博客 1616

OpenGL ES EGL介绍

前面已经在android平台上使用OpenGL ES的API了解了如何创建3D图形已经使用FBO渲染到纹理进行一些其他的操作,起初我学习OpenGL ES的目的就是为了研究Android平台上录制屏幕的方案。到目前为止,基础知识已经具备了,还差一点需要了解的是Embedded Graphics Library (EGL),EGL是连接OpenGL ES和本地窗口系统的接口,由于OpenGL ES是跨

weiersyuan的专栏 1万+

OpenGL ES 调试信息函数

该函数可以打印出OpenGL ES选中的config的一些信息,调用的时候直接传入参数即可 static void printEGLConfigAttribs(EGLDisplay dpy, EGLConfig config) { int value = 0; eglGetConfigAttrib(dpy, config, EGL_RED_SIZE, &value);...

逐梦的博客 1160

OpenGL & EGL & others

EGL 是 OpenGL ES 渲染 API 和本地窗口系统(native platform window system)之间的一个中间接口层,它主要由系统制造商实现。与设备的原生窗口系统通信查询绘图表面的可用类型和配置创建绘图表面在OpenGL ES 和其他图形渲染API之间同步渲染管理纹理贴图等渲染资源为了让OpenGL ES能够绘制在当前设备上,我们需要EGL作为OpenGL ES与设备的桥梁。

pcj2007的专栏 2376

OpenGL ES EGL的 eglChooseConfig使用问题

1、问题由来      场景编辑器开始支持3D场景,场景运行后,模型前后显示异常,感觉像是DepthCheck、DepthWite未起作用。      跟踪了脚本、引擎代码,与异常模型的DepthCheck、DepthWrite相关属性设置都设置,且最终传递给OpenGL,但效果还是异常。在同事的机器上,VS Debug运行模拟器,模型显示正常。 2、问题定位      a、对比本机与同事

XP_lmq的专栏 1万+

OpenGL——EGL

OpenGL——EGL 什么是EGL EGL 是 OpenGL ES 渲染 API 和本地窗口系统(native platform window system)之间的一个中间接口层,它主要由系统制造商实现。EGL提供如下机制: 与设备的原生窗口系统通信 查询绘图表面的可用类型和配置 创建绘图表面 在OpenGL ES 和其他图形渲染API之间同步渲染 管理纹理贴图等渲染资源 https://www.khronos.org/egl/ 与窗口系统通信 因为每个窗口系统都有不同的语义,所以EGL提供基本的不

深海流浪汉 1882

OpenGL EGL简介

OpenGL EGL结构简介 EGL,它是图形渲染API(如OpenGL ES)与本地平台窗口系统的一层接口,保证了OpenGL ES的平台独立性。EGL(The Khronos Platform Graphics Interface)提供了一种方法用于通过客户端API和本地窗口系统进行渲染,客户端API包括用于嵌入式系统的3D渲染器OpenGL ES、用于桌面系统的OpenGL(OpenGL...

GuoSenZQ的专栏 1519

opengles 3.0游戏开发_OpenGl ES 基础入门知识

相信大家都听过大名鼎鼎的 OpenGL,但可能大多数人没有实践使用过,本文就来介绍一下 Android OpenGl ES 的基础入门知识。或许你在工作中不会用到,但为你个人成长着想一下,扩展自己的知识广度,总归是有利无弊的,你说对吧?本文分为以下四部分介绍:OpenGL 基础概念OpenGL 坐标系理解OpenGL 渲染管线OpenGL 着色语言建议收藏本文哦~OpenGL 基础概念O...

weixin_39545805的博客 1101

Linux之wayland+OpenGL+EGL渲染(十九)

简介: 优快云博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长!优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀人生格言: 人生从来没有捷径,只有行动才是治疗恐惧和懒惰的唯一良药.更多原创,欢迎关注:Android系统攻城狮

Android系统攻城狮 3844

OpenGL ES 之 EGL 详解

//frameworks/native/opengl/include/EGL/ #include <EGL/egl.h> #include <stdio.h> EGLBoolean egl_init(){ EGLDisplay eglDisplay = eglGetDisplay(EGL_DEFAULT_DISPLAY); // 为何是 EGL_DEFAULT_DISPLAY? if(eglDisplay == EGL_NO_DISPLAY){ .

薛文旺 2212

OpenGL 之EGL API 介绍

EGL 是 OpenGL ES 和底层 Native 平台视窗系统之间的接口。OpenGL ES 本质上是一个图形渲染管线的状态机,而 EGL 则是用于监控这些状态以及维护 Frame buffer 和其他渲染 Surface 的外部层。与设备的原生窗口系统通信查询绘图表面的可用类型和配置创建绘图表面在OpenGL ES 和其他图形渲染API之间同步渲染管理纹理贴图等渲染资源。

轻口味的专栏 2520

OpenGL ES 3.0(三)EGL 概述

OpenGL ES 定义了一个渲染图形的规范,但没有定义窗口系统。为了让 GLES 能够适合各种平台,GLES 将与知道如何通过操作系统创建和访问窗口的库,即 EGL 结合使用。在使用 GLES 进行任何操作之前,必须先创建一个 OpenGL 上下文,这是通过 EGL 实现的。 EGL 提供了以下机制: 1) 和设备的本地窗口系统通信 2) 查询绘图表面的可用类型及配置 ...

我的学习笔记 4732

opengl,opengl es,egl,glfw,glew

opengl定义了一个跨编程语言,跨平台的应用程序接口,opengl es是opengl的嵌入式版本,用于ios和android,后来一些追求高性能的设备也开始用这种api,opengl es是opengl的子集,区别在于opengl es删减了opengl一切低效能的操作方式,有高性能的绝不留低效能的,即只求效能不追求兼容性,opengl es能实现的,opengl也能实现,opengl部分api,opengl es不支持。OpenGL 是跨平台的、专业的图形编程接口,而接口的实现是由厂商来完成的。

liguandong 3029

OpenGL之EGL、GPU工作流程(十四)

简介: 优快云博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长!优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀人生格言: 人生从来没有捷径,只有行动才是治疗恐惧和懒惰的唯一良药.更多原创,欢迎关注:Android系统攻城狮4.OpenGL EGL GPU Surface工作流程: 通常来说,OpenGL 是一个操作 GPU 的 API,它通过驱动向 GPU 发送相关指令,控制图形渲染管线状态机的运行状态,但是当涉及到与本地窗口系统

Android系统攻城狮 2246

【我的OpenGL学习进阶之旅】EGL简介

一、EGL简介 1.1 OpenGL ES 命令需要渲染上下文和绘制表面 OpenGL ES 命令需要渲染上下文和绘制表面。 渲染上下文 存储相关的OpenGL ES状态。 绘制表面 是用于绘制图元的表面,它指定渲染所需的缓冲区类型,例如颜色缓冲区、深度缓冲区和模板缓冲区。绘制表面还要指定所需的缓冲区的位深度。 OpenGL ES API 没有提及如何创建渲染上下文,或者渲染上下文如何连接到原生窗口系统。 1.2 EGL是什么? EGL是Khronos渲染API(如OpenGL ES)和 原生窗口系统

字节卷动 5980

OpenGL ES:Android平台EGL环境

#前言 这篇文章简单介绍一下在Android平台下的EGL环境的相关内容,由于OpenGL ES并不负责窗口管理以及上下文管理,该职责由各个平台自行完成;在Android平台下OpenGL ES的上下文环境是依赖EGL的API进行搭建的。 对于EGL这个框架,谷歌已经提供了GLSurfaceView,是一个已经封装EGL相关处理的工具类,但是不够灵活;对于更加核心的OpengGL ES的用法(例如...

net_168的博客 2947

本地使用大模型:Ollama+open-webui+AnythingLLM(Windows+linux)

随着大模型的发展,大量的开源模型可以被直接使用。大模型的使用可以选择在云端或者在本地,如果本地存储空间尚可,而且模型需求不是很大的话,我们可以选择在本地部署一个大模型来使用。针对特定的任务需求,进一步在本地去微调我们的大模型。我在windows和linux上都尝试了一遍,这里记录一下过程。

wpqgt的博客 2165

OpenGL ES 和 EGL 介绍

转载自OpenGL ES 和 EGL 介绍 OpenGL ES EGL介绍 OpenGL ES 什么是 OpenGL ES? OpenGL ES(OpenGL for Embedded Systems)是 OpenGL 三维图形API的子集,针对手机、PDA和游戏主机等嵌入式设备而设计,各显卡制造商和系统制造商来实现这组 API。 EGL 什么是什么是 EGL? EGL 是 OpenGL ES...

【黑键】 4396

别再手动备份了!用Python脚本批量导出华为/华三交换机配置(附完整代码)

本文详细介绍了如何使用Python脚本实现华为/华三交换机配置的自动化备份,大幅提升网络运维效率。通过paramiko库建立SSH连接,结合pandas处理设备清单,实现配置的批量导出与规范化存储,解决传统手动备份耗时易错的问题。

weixin_28737603的博客 448

告别unittest!用Pytest+Fixture重构你的Python测试代码(附实战案例)

本文详细介绍了如何从unittest迁移到Pytest框架,重点解析了Pytest的Fixture机制如何提升测试效率和代码简洁性。通过实战案例展示了Pytest在减少代码量、提升调试效率和资源管理方面的优势,帮助开发者重构Python测试代码。

weixin_26749245的博客 206
上一篇: FFmpeg视频解码中的YUV420P格式
下一篇: 基于FFmpeg解码和OpenGL ES渲染的Android视频播放
ericbars
博客等级 码龄10年 120粉丝 30原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值