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详解 - 掘金

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数据操作——Column 对象

Column 对象 1. 什么是Column对象 Column 表示了 Dataset 中的一个列, 并且可以持有一个表达式, 这个表达式作用于每一条数据, 对每条数据都生成一个值 2.Column对象如何创建 ’ 单引号 ’ 在 Scala 中是一个特殊的符号, 通过 ’ 会生成一个 Symbol 对象, Symbol 对象可以理…

《SPSS统计学基础与实证研究应用精解》视频讲解:SPSS数据查找

《SPSS统计学基础与实证研究应用精解》4.4 视频讲解 视频为《SPSS统计学基础与实证研究应用精解》张甜 杨维忠著 清华大学出版社 一书的随书赠送视频讲解4.4节内容。本书已正式出版上市&#xff0c;当当、京东、淘宝等平台热销中&#xff0c;搜索书名即可。本书旨在手把手教会使…

【QT+QGIS跨平台编译】之三:【OpenSSL+Qt跨平台编译】(一套代码、一套框架,跨平台编译)

文章目录 一、OpenSSL介绍二、OpenSSL配置三、Window环境下配置四、Linux环境下配置五、Mac环境下配置 一、OpenSSL介绍 OpenSSL是一个开放源代码的软件库包&#xff0c;应用程序可以使用这个包来进行安全通信&#xff0c;避免窃听&#xff0c;同时确认另一端连接者的身份。这…

Python文件操作和异常处理:高效处理数据的利器

文章目录 一、引言1.1 文件操作和异常处理对于编程的重要性1.2 Python作为实现文件操作和异常处理的强大工具 二、为什么学习文件操作和异常处理2.1 处理各种文件格式&#xff1a;从文本到图像到音频等2.2 确保代码的鲁棒性&#xff1a;有效处理异常情况 三、文件读取和写入3.1…

2023年12月 Scratch 图形化(二级)真题解析#中国电子学会#全国青少年软件编程等级考试

Scratch图形化等级考试(1~4级)全部真题・点这里 一、单选题(共25题,每题2分,共50分) 第1题 在制作推箱子游戏时,地图是用数字形式储存在电脑里的,下图是一个推箱子地图,地图表示如下: 第一行(111111) 第二行(132231) 第三行(126621) 第四行( ) 第五行(152…

网络安全全栈培训笔记(56-服务攻防-数据库安全H2ElasticsearchCouchDBInfluxdb复现)

第56天 服务攻防-数据库安全&H2&Elasticsearch&CouchDB&Influxdb复现 知识点&#xff1a; 1、服务攻防数据库类型安全 2、influxdb,.未授权访问wt验证 3、H2 database-未授权访问-配置不当 4、CouchDB-权限绕过配合RCE-漏洞 5、ElasticSearch-文件写入&RC…

vue3前端开发,一篇文章看懂何谓pinia

vue3前端开发,pinia的基础练习第一节&#xff01; 前言&#xff0c;pinia是为了取代vuex而诞生的产品&#xff0c;它有一些改进。去掉了之前的mutations。只有一个action,既可以支持异步&#xff0c;又支持同步。还提供了解构函数&#xff0c;可以把返回的对象内部属性和方法直…

给创业者的一份忠告~创业就要选择低成本的轻资产创业项目

王健林继续出售资产&#xff0c;5天卖了4座万达广场&#xff0c;出售计划仍在继续..... 根据天眼查app最新消息&#xff0c;厦门殿前万达广场商业管理有限公司发生工商变更&#xff0c;2023至今已经转让10座万达广场。两年前万达旗下的核心子公司万达商管&#xff0c;向一群投资…

xxe漏洞之scms靶场漏洞

xxe-scms 代码审核 &#xff08;1&#xff09;全局搜索simplexml_load_string simplexml_load_string--将XML字符串解释为对象 &#xff08;2&#xff09;查看源代码 ID1 $GLOBALS[HTTP_RAW_POST_DATA]就相当于file_get_contents("php://input"); 因此这里就存…

偷偷浏览小网站时,原来有这么多人已经知道

最近看到一篇挺有意思文章&#xff0c;偷偷浏览小网站时&#xff0c;都有谁会知道你看了啥。思量之下&#xff0c;从更广泛的技术角度看&#xff0c;仍有大量补充的空间&#xff0c;于是就有了这样一篇文章。本文的目的在于增强大家的网络安全意识&#xff0c;非必要不要浏览不…

【Web实操11】定位实操_照片墙(无序摆放)

设置一个板块&#xff0c;将照片随意无序摆放在墙上&#xff0c;从而形成照片墙。本来效果应该是很唯美好看的&#xff0c;就像这种&#xff0c;但是奈何本人手太笨&#xff0c;只好设置能达到照片墙的效果就可。 代码如下&#xff1a; <!DOCTYPE html> <html lang&…

[java基础揉碎]位运算符

java中有7个位运算&#xff08;&、|、^、~、>>、<<和>>>&#xff09; 第一组 分别是按位与&、按位或|、按位异或^&#xff0c;按位取反~&#xff0c;它们的运算规则是&#xff1a; 按位与& : 两位全为1&#xff0c;结果为1&#xff0c;否则…