Android OpenGL EGL使用——自定义相机

如果要使用OpenGl来自定义相机,EGL还是需要了解下的。

可能大多数开发者使用过OpengGL但是不知道EGL是什么?EGL的作用是什么?这其实一点都不奇怪,因为Android中的GlSurfaceView已经将EGL环境都给配置好了,你一直在使用,只是不知道他的存在罢了。

很多人可能在使用OpenGl ES渲染数据的时候都带着一个疑问,渲染的数据到底到哪里去了?没看到画布,Android中的自定义view不都是有画布的吗?

EGL就是底层OpenGL绘制图形的画布。请见<EGL和OpenGl ES的关系>介绍。

一、EGL简介

1、了解EGL是什么

EGL是什么?EGL:全称Embedded Graphic Library。EGL是渲染API(如OpenGL, OpenGL ES, OpenVG)和本地窗口系统之间的接口。它处理图形上下文管理,表面/缓冲区创建,绑定和渲染同步,并使用其他Khronos API实现高性能,加速,混合模式2D和3D渲染OpenGL / OpenGL ES渲染客户端API OpenVG渲染客户端API原生平台窗口系统。这个稍微了解下就OK,你只要知道它是一个用来给OpenGl ES提供绘制界面的接口就可以了。

EGL的作用:

  1. 与设备的原生窗口系统通信。
  2. 查询绘图表面的可用类型和配置。
  3. 创建绘图表面。
  4. 在OpenGL ES 和其他图形渲染API之间同步渲染。
  5. 管理纹理贴图等渲染资源。
2、EGL和OpenGl ES的关系

(1)从上面的讲解我们基本上可以知道,EGL是为OpenGl提供绘制表面的。

对的,这就是OpenGl ES数据渲染画布所在了。想必到这里大家也清楚了渲染数据去处的问题了。

EGL还有什么用呢?EGL可以理解为OpenGl ES ES和设备之间的桥梁。完全可以这么理解。

(2) OpenGL 是跨平台的、专业的图形编程接口,而接口的实现是由厂商来完成的。

OpenGL使用这些接口绘制完成后,需要把数据渲染到屏幕上,就需要EGL来接手这部分工作。

EGL是 OpenGL ES 和底层 Native 平台 视窗系统之间的接口,如下图所示。

(3)有一个类比的例子

我们来思考一下画家绘画的过程:首先要有一名懂得各种绘画技艺的画家,然后他需要一张画布,一些笔,一些颜料,一些辅助工具(尺、模板、橡皮、调色板等等),然后他在画布上绘制第一幅画,完成之后展示给人们看;在人们观赏第一幅画的时候,他可以在第二张画布上绘制第二幅画,绘制完成后收回第一幅画,将第二幅画展现给人们看;接着使用工具擦除第一幅画,在同一张画布上绘制第三幅画;周而复始,人们便看到了一幅接一幅的画。

对比 OpenGL ES/EGL,各要素的对应关系大体如下:

  • 画家:编程人员
  • 笔、颜料、辅助工具:OpenGL ES API
  • 画布:EGL 创建的 Surface

所以计算机绘画的本质就是选择图像显示的像素格式,申请一块内存(画布),填充像素(颜色),绘制完成之后,通知计算机显示到屏幕上(按比例发射RGB光),最终就看到了所绘制的画面。之所以要先选择像素格式,是因为无论是所申请内存的大小,还是硬件驱动解析这块内存的方式,都是由像素格式决定的。
 

3、EGL包括哪些内容

EGL接口中含有3个对象,如下图所示:

简单讲解下各部分的作用:

  1. Display(EGLDisplay) 是对实际显示设备的抽象。
  2. Surface(EGLSurface)是对用来存储图像的内存区FrameBuffer 的抽象,包括Color Buffer,Stencil Buffer,Depth Buffer。
  3. Context (EGLContext) 存储 OpenGL ES绘图的一些状态信息。

二、EGL使用步骤

1、创建EGLDisplay,得到默认的显示设备(窗口)

首先我们需要知道绘制内容的目标在哪里,EGLDisplayer是一个封装系统屏幕的数据类型,通常通过eglGetDisplay方法来返回EGLDisplay作为OpenGl ES的渲染目标,eglGetDisplay()

mEgl = EGLContext.getEGL() as EGL10
//get Display device
mEGLDisplay = mEgl.eglGetDisplay(EGL10.EGL_DEFAULT_DISPLAY)

2、初始化显示设备

第一参数代表Major版本,第二个代表Minor版本。如果不关心版本号,传0或者null就可以了。初始化与 EGLDisplay 之间的连接:eglInitialize()

mEgl.eglInitialize(mEGLDisplay, version)

3、配置显示设备的属性,确定渲染表面的配置信息

mEgl.eglChooseConfig(
        mEGLDisplay,
        attribList,
        configs,
        configs.size,
        numConfigs
    )

4、创建OpenGL上下文环境EGLContext实例

注:OpenGL的任何一条指令都必须再自己的OpenGL上下文环境中进行。

mEgl.eglCreateContext(
    mEGLDisplay,
    config,
    EGL10.EGL_NO_CONTEXT,
    contextList
)

eglCreateContext中的第三个参数可以传入一个EGLContext类型的变量,该变量的意义是可以与正在创建的上下文环境共享OpenGl资源,包括纹理ID,FrameBuffer以及其他Buffer资源。如果没有的话可以填写Null.

5、创建渲染表面EGLSurface

通过上面四步,获取OpenGl 上下文之后,说明EGL和OpenGl ES端的环境已经搭建完毕,也就是说OpengGl的输出我们可以获取到了(OpenGL的绘制数据我们可以获取到了,接下来就是如何显示这些数据到显示设备上)。下面的步骤我们讲如何将EGl和设备屏幕连接起来。如果连接呢?当然,这时候我们就要使用EGLSurface了,我们通过EGL库提供eglCreateWindowSurface可以创建一个实际可以显示的surface.当然,如果需要离线的surface,我们可以通过eglCreatePbufferSurface创建。其中,eglCreateWindowSurface()用于创建屏幕上渲染区域,eglCreatePbufferSurface用于创建屏幕外渲染区域。

private EGLSurface mSurface= EGL14.EGL_NO_SURFACE;
mEGLSurface = mEgl.eglCreateWindowSurface(
    mEGLDisplay,
    mEGLConfig,
    mSurface,
    attribList
)

6、绑定三者:Display 显示设备,surface渲染表面,context上下文环境

通过上面的步骤,EGL的准备工作做好了,一方面我们为OpenGl ES渲染提供了目标及上下文环境,可以接收到OpenGl ES渲染出来的纹理,另一方面我们连接好了设备显示屏(这里指SurfaceView或者TextureView),接下来我们讲解如何在创建好的EGL环境下工作的。首先我们有一点必须要明确,OpenGl ES 的渲染必须新开一个线程,并为该线程绑定显示设备及上下文环境(Context)。因为前面有说过OpenGl指令必须要在其上下文环境中才能执行。所以我们首先要通过 eglMakeCurrent()方法来绑定该线程的显示设备及上下文。

通过eglMakeCurrent方法将EGLSurface,EGLContext,EGLDisplay绑定成功之后,OpenGL ES环境就搭建好了,接下来便可以渲染了。

mEgl.eglMakeCurrent(mEGLDisplay, mEGLSurface, mEGLSurface, mEGLContext)

7、交换缓冲

绑定完成之后,就可以进行RenderLoop循环了。这里简单说一下,EGL的工作模式是双缓冲模式,其内部有两个FrameBuffer(帧缓冲区,可以理解为一个图像存储区域),当EGL将一个FrameBuffer显示到屏幕上的时候,另一个FrameBuffer就在后台等待OpenGl ES进行渲染输出。直到调用了eglSwapBuffers这条指令的时候,才会把前台的FrameBuffers和后台的FrameBuffer进行交换,这样界面呈现的就是OpenGl ES刚刚渲染的结构了。即,切换 front buffer 和 back buffer 送显。

屏幕外的渲染不需要调用此方法。

mEgl.eglSwapBuffers(mEGLDisplay, mEGLSurface)

如何进行渲染显示(未完待续。。。)

8、释放EGL环境

当然,在所有的操作都执行完之后,我们要销毁资源。特别注意,销毁资源必须在当前线程中进行,不然会报错。首先取消eglMakeCurrent的绑定,销毁三个对象:EGLSurface,EGLContext和EGLDisplay,即销毁显示设备(EGLSurface),然后销毁上下文(EGLContext),停止并释放线程,最后终止与EGLDisplay之间的链接。

mEgl.eglMakeCurrent(
    mEGLDisplay, EGL10.EGL_NO_SURFACE, EGL10.EGL_NO_SURFACE,
    EGL10.EGL_NO_CONTEXT
)
mEgl.eglDestroySurface(mEGLDisplay, mEGLSurface)//销毁EGLSurface
mEgl.eglDestroyContext(mEGLDisplay, mEGLContext)//销毁上下文EGLContext
mEgl.eglTerminate(mEGLDisplay)//终止与EGLDisplay的连接
mEGLDisplay = EGL10.EGL_NO_DISPLAY
mEGLContext = EGL10.EGL_NO_CONTEXT
mEGLSurface= EGL10.EGL_NO_SURFACE

参考链接:

Android 系统图形栈(一): OpenGL ES 和 EGL 介绍_android图栈-CSDN博客

Android笔记:OpenGL ES与EGL的关系与实例_egl的surface是在gpu-CSDN博客

你还不知道 OpenGL ES 和 EGL 的关系?_glumes的技术博客_51CTO博客Android OpenGL 开发—— EGL详解 - 掘金

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/339617.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

100天精通Python(实用脚本篇)——第113天:基于Tesseract-OCR实现OCR图片文字识别实战

文章目录 专栏导读1. OCR技术介绍2. 模块介绍3. 模块安装4. 代码实战4.1 英文图片测试4.2 数字图片测试4.3 中文图片识别 书籍分享 专栏导读 &#x1f525;&#x1f525;本文已收录于《100天精通Python从入门到就业》&#xff1a;本专栏专门针对零基础和需要进阶提升的同学所准…

Flowable 生成流程图

/*** 生成流程图** param processId 任务ID*/ RequestMapping("/diagram/{processId}") public void genProcessDiagram(HttpServletResponse response,PathVariable("processId") String processId) {InputStream inputStream flowTaskService.diagram(p…

redis优化系列(六)

本期分享redis内存过期策略&#xff1a;过期key的处理 Redis之所以性能强&#xff0c;最主要的原因就是基于内存存储。然而单节点的Redis其内存大小不宜过大&#xff0c;会影响持久化或主从同步性能。 可以通过修改配置文件来设置Redis的最大内存&#xff1a; maxmemory 1gb …

[翻译] Vulkan-Sample-MSAA (Multisample anti-aliasing)

原文 Aliasing是以低于原始信号采样率的采样率进行采样导致的。在图形学中&#xff0c;这个过程可以描述为&#xff1a;基于一个会产生artifacts的分辨率去计算像素值&#xff0c;从而在模型边缘产生锯齿。多重采样抗锯齿&#xff08;Multisample anti-aliasing&#xff0c;MS…

vivado 接口、端口映射

接口 重要&#xff01;接口只能在“fpga”类型的&#xff1c;component&#xff1e;中定义。接口部分提供了<component>上所有可用物理接口的列表。<interfaces>部分包含嵌套在其中的一个或多个<interface>标记。一个接口是通过使用<port_map>标记由多…

[pytorch入门] 3. torchvision中的transforms

torchvision中的transforms 是transforms.py工具箱&#xff0c;含有totensor、resize等工具 用于将特定格式的图片转换为想要的图片的结果&#xff0c;即用于图片变换 用法 在transforms中选择一个类创建对象&#xff0c;使用这个对象选择相应方法进行处理 能够选择的类 列…

股东出资透明度提升:企业股东出资信息API的应用

前言 在当今商业环境中&#xff0c;股东出资信息的透明度对于投资者、监管机构以及企业自身的健康发展至关重要。随着企业信息公开化的推进&#xff0c;企业股东出资信息API应运而生&#xff0c;为各方提供了一个便捷、高效的信息获取渠道。本文将探讨企业股东出资信息API如何…

【动态规划】【广度优先搜索】【状态压缩】847 访问所有节点的最短路径

作者推荐 视频算法专题 本文涉及知识点 动态规划汇总 广度优先搜索 状态压缩 LeetCode847 访问所有节点的最短路径 存在一个由 n 个节点组成的无向连通图&#xff0c;图中的节点按从 0 到 n - 1 编号。 给你一个数组 graph 表示这个图。其中&#xff0c;graph[i] 是一个列…

03.时间轮

时间轮 1.为什么需要时间轮 海量的定时任务下&#xff0c;小顶堆时间复杂度比较高&#xff0c;性能差 2.时间轮是什么 时间轮这个技术其实出来很久了&#xff0c;在kafka、zookeeper、Netty、Dubbo等高性能组件中都有时间轮使用的方式 时间轮&#xff0c;从图片上来看&…

自定义数据集 - Dataset

文章目录 1. PASCAL VOC格式 划分训练集和验证集2. 自定义dataset 1. PASCAL VOC格式 划分训练集和验证集 import os import randomdef main():random.seed(0) # 设置随机种子&#xff0c;保证随机结果可复现files_path "./VOCdevkit/VOC2012/Annotations" # 指定…

Sentinel限流规则支持流控效果

流控效果是指请求达到流控阈值时应该采取的措施&#xff0c;包括三种&#xff1a; 1.快速失败&#xff1a;达到阈值后&#xff0c;新的请求会被立即拒绝并抛出FlowException异常。是默认的处理方式。 2.warm up&#xff1a;预热模式&#xff0c;对超出阈值的请求同样是拒绝并抛…

网络安全的信息收集方法有哪些?

网络安全攻击中的信息收集是攻击者为了了解目标系统的弱点、配置、环境和潜在的防御措施而进行的活动。以下是一些常见的信息收集手段&#xff1a; 开放网络资源查询&#xff1a; 使用搜索引擎查找关于目标组织的信息&#xff0c;包括新闻稿、社交媒体帖子、官方网站等。通过W…

答案之书程序

答案之书程序 需求&#xff1a;用户输入手机号码后4位或者生日&#xff0c;自动生成答案之书对应答案 效果图 C#代码实现过程 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq;…

新买电脑配置不低却卡顿?

目录 前言&#xff1a; 电脑卡顿的原因 Windows 10必做的系统优化 禁用 IP Helper 关闭系统通知 机械硬盘开启优化驱动器功能 开启存储感知 前言&#xff1a; 新买的电脑配置不低&#xff0c;但却卡顿甚至程序不反应&#xff0c;这是怎么回事儿&#xff1f; 其实并不…

获取主流电商平台商品价格,库存信息,数据分析,SKU详情

要接入API接口以采集电商平台上的商品数据&#xff0c;可以按照以下步骤进行&#xff1a; 1、找到可用的API接口&#xff1a;首先&#xff0c;需要找到支持查询商品信息的API接口。这些信息通常可以在电商平台的官方文档或开发者门户网站上找到。 2、注册并获取API密钥&#x…

【代码随想录算法训练营第二十四天|回溯算法的理论基础、77. 组合】

代码随想录算法训练营第二十四天|回溯算法的理论基础、77. 组合 回溯算法的理论基础77. 组合 回溯算法的理论基础 这里我觉得《代码随想录》和y总的课都比较好了 《代码随想录》 &#xff1a; https://programmercarl.com/0077.%E7%BB%84%E5%90%88%E4%BC%98%E5%8C%96.html#%E5…

成人高考和自考到底应该选哪个呢?

在成人学历提升的各项方式之中 成人高考与自学考试经常会被人拿来对比 但它们之间的差别在哪里 又分别去适合什么类型的考生 成考自考报名一般8月底开始&#xff0c;要准备考试的考生需要提前做好准备了哦 成考自考报名都需要上传证件照&#xff0c;而且都很严格 大家可使用小程…

react 页签(自行封装)

思路&#xff1a;封装一个页签组件&#xff0c;包裹页面组件&#xff0c;页面渲染之后把数据缓存到全局状态实现页面缓存。 浏览本博客之前先看一下我的博客实现的功能是否满足需求&#xff0c;实现功能&#xff1a; - 页面缓存 - 关闭当前页 - 鼠标右键>关闭当前 - 鼠标右…

启发式教学是什么

学生们在上课时看似认真听讲&#xff0c;但是在下课后却一片茫然&#xff0c;不知道你讲了什么内容&#xff1f;这是因为你可能使用了传统的教学方法&#xff0c;而不是启发式教学。 启发式教学是指老师在教育教学中&#xff0c;采用引导、启示、激发等手段&#xff0c;调动学…

主板电路学习; 华硕ASUS K43SD笔记本安装win7X64(ventoy)

记录 老爷机 白色 华硕 K43SD 笔记本 安装 win7X64 1. MBR样式常规安装win7X64Sp1 (华硕 K43SD 安装 win7X64 ) 老爷机 白色 华硕 K43SD 笔记本 安装 win7X64 &#xff08;常规安装&#xff09; 设置&#xff1a; 禁用UEFI 启用AHCI ventoy制作MBR&#xff08;非UEFI&#…