Android OpenGL ES 离屏幕渲染1——EGL环境的创建,以及基础概念的理解

创建EGL上下文、配置EGL环境、创建EGL DISPLAY

什么是EGL:

        由于OpenGL ES并不负责窗口管理以及上下文管理,该职责由各个平台自行完成;在Android平台下OpenGL ES的上下文环境是依赖EGL的API进行搭建的。

        对于EGL这个框架,谷歌已经提供了GLSurfaceView,是一个已经封装EGL相关处理的工具类,但是不够灵活;对于更加核心的OpengGL ES的用法(例如多线程共享纹理)则需要开发者自行搭建EGL开发环境。

        EGL是一套OpenGLES、OpenVG等渲染接口和它所运行的平台的底层原生窗口系统之间的桥接接口,也就是帮助OpenGLES或其他Khronos图形API渲染的内容投射到目标系统窗口的接口。它帮助处理图形上下文管理、表面/缓冲区绑定和渲染同步。并使用其他 Khronos API 实现高性能、加速、混合模式 2D 和 3D 渲染。EGL 还提供 Khronos旗下图形API 之间的互操作能力,以实现 API 之间的高效数据传输,例如在运行 OpenMAX AL 的视频子系统和运行 OpenGL ES 的 GPU 之间。

        EGL 提供创建渲染表面的机制,OpenGL ES 和 OpenVG 等客户端 API 可在该表面上进行绘制,为客户端 API 创建图形上下文,并同步客户端 API 和原生平台渲染 API 的绘制。这样便可使用 OpenGL ES 和 OpenVG 进行无缝渲染,从而实现高性能、加速、混合模式的 2D 和 3D 渲染。

        EGL 可以在多种操作系统(如 Android 和 Linux)和本机窗口系统(如 X 和 Microsoft Windows)上实现。实现还可以选择允许通过其他受支持的本机渲染 API(如 Xlib 或 GDI)渲染到特定类型的 EGL 表面。EGL 提供:

1、  用于创建客户端 API 可以在其上绘制和共享的渲染表面(窗口、pbuffers、pixmaps)的机制

2、  用于为客户端 API 创建和管理图形上下文的方法

3、  用于同步客户端 API 以及本机平台渲染 API 的绘制的方法。

        总结:为了创建和管理OpenGL ES的上下文、按照用户要求渲染图像到对应平台表面、渲染线程管理、生命周期、缓冲区等资源,以及把渲染的内容投射到目标容器(如某个surface),需要使用EGL接口进行简介操作。而安卓自带的GLSurfaceView只是把EGL的创建以及和安卓系统Surface绑定的过程封装起来,让程序员方便一些而已。

示意图来自:

https://www.cnblogs.com/yongdaimi/p/11244950.html

创建EGL显示设备:

Display(EGLDisplay) 是对实际显示设备的抽象(这个设备不一定是物理存在,也可以是逻辑存在),也就是最终的画面输出终端。

        既然要进行渲染,那创建一个FrameBuffer容器是必须的,但这个容器根据自己的需要,可以通过绑定对应系统的窗口直接显示,也可以只是EGL内部一个不可见的容器——也就是所谓的离屏渲染

        在安卓中的创建也很简单,调用android.opengl.EGL14#eglGetDisplay(int)工具方法即可获得一个EGLDisplay对象,并使用android.opengl.EGL14#eglInitialize方法对其进行初始化。具体代码如下:

mEGLDisplay = EGL14.eglGetDisplay(EGL14.EGL_DEFAULT_DISPLAY)
val versions = IntArray(2)
EGL14.eglInitialize(mEGLDisplay, versions, 0, versions, 1)

创建EGL配置信息表:

        有了渲染的FrameBuffer容器,还需要告诉EGL渲染时,像素的格式,例如红绿蓝透明度4通读占的bit数、深度信息记录的bit数等配置。详细各种配置的参数解释具体可参阅:https://registry.khronos.org/EGL/sdk/docs/man/html/eglChooseConfig.xhtml

 private val mEGLConfigAttrs = intArrayOf(EGL14.EGL_RED_SIZE, 8,EGL14.EGL_GREEN_SIZE, 8,EGL14.EGL_BLUE_SIZE, 8,EGL14.EGL_ALPHA_SIZE, 8,EGL14.EGL_DEPTH_SIZE, 8,EGL14.EGL_RENDERABLE_TYPE, EGL14.EGL_OPENGL_ES2_BIT,EGL14.EGL_NONE)val configs: Array<EGLConfig?> = arrayOfNulls(1)val configNum = IntArray(1)EGL14.eglChooseConfig(mEGLDisplay, mEGLConfigAttrs, 0, configs, 0, 1, configNum, 0) //获取1个EGL配置,因为这个例子只需要一个

(安卓SDK自带的exoplayert2也自带了一些EGLConfig属性表的例子,可以参考com.google.android.exoplayer2.util.EGLSurfaceTexture#EGL_CONFIG_ATTRIBUTES、com.google.android.exoplayer2.util.GlUtil.Api17#getEglConfig

创建EGL渲染上下文:

使用刚刚创建的EGLDisplay及其EGLConfig通过EGL创建EGLContext。

函数形式:

    public static native EGLContext eglCreateContext(EGLDisplay dpy,EGLConfig config,EGLContext share_context,int[] attrib_list,int offset);

具体代码:

mEGLContext = EGL14.eglCreateContext(mEGLDisplay, mEGLConfig, EGL14.EGL_NO_CONTEXT, mEGLContextAttrs, 0) 

        第三个参数如果有需要共享这个EGLContext,如实现多线程渲染,则可以传入一个已创建成功的上下文, 这样就可以得到一个共享的上下文(Shared Context)。例子可以参考:https://juejin.cn/post/6969580005151997989

        eglCreateContext 为当前渲染 API(使用 eglBindAPI 设置)创建 EGL 渲染上下文并返回上下文句柄。然后可以使用该上下文渲染到 EGL 绘图表面。如果 eglCreateContext 无法创建渲染上下文,则返回 EGL_NO_CONTEXT。

        如果传入的share_context不是EGL_NO_CONTEXT,而是像mEGLContext这种已经创建好的的eglContext,则这个上下文本身以及这个它所使用的其他上下文,所有已被它共享、且可共享的数据(由当前渲染 API 的客户端 API 规范定义),在这个新创建的上下文上也会共享得到。但是,所有共享数据的渲染上下文本身必须存在于同一地址空间中。如果两个渲染上下文都属于同一个进程,则它们共享一个地址空间。

        attrib_list 指定上下文的属性列表。该列表具有与 eglChooseConfig 中描述的相同的结构。可以指定的属性和属性值可参考:

https://registry.khronos.org/EGL/sdk/docs/man/html/eglCreateContext.xhtml

创建EGLSurface:

        Surface(EGLSurface)是对用来存储图像的内存区域。也就是实际存储数据的地方

        根据自己需要绘制内容的大小和需求,创建EGLSurface。例子使用的是PbufferSurface。

mEGLSurface = EGL14.eglCreatePbufferSurface(mEGLDisplay, mEGLConfig, eglSurfaceAttrs, 0)

        也可以根据需要创建其他类型的Surface,例如WindowSurface、PixmapSurface,android使用eglCreateWindowSurface可以创建一个SurfaceViewSurfaceHolderSurface捆绑EGLSurface,这样内容可以展示这些Window对象不过不是渲染

把刚刚创建的一系列EGL对象进行绑定:

        绑定EGLSurface和EGLContext到显示设备(EGLDisplay),但这个EGLDisplay的内容没有和View绑定,所以并不会直接显示

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

销毁EGL环境:

        当在渲染任务完成后,在使用完OpenGL ES后,要把EGL环境进行销毁,否则会浪费设备资源。销毁之前创建EGL上下文存储图像内容Surface以及投射内容显示设备EGLDisplay具体代码

        // 与显示设备解绑EGL14.eglMakeCurrent(mEGLDisplay, EGL14.EGL_NO_SURFACE, EGL14.EGL_NO_SURFACE, EGL14.EGL_NO_CONTEXT)// 销毁 EGLSurfaceEGL14.eglDestroySurface(mEGLDisplay, mEGLSurface)// 销毁EGLContextEGL14.eglDestroyContext(mEGLDisplay, mEGLContext)// 销毁EGLDisplay(显示设备)EGL14.eglTerminate(mEGLDisplay)

结尾:

        本文主要介绍EGL概念、作用,为后续的离屏渲染做铺垫。下一篇文章将开始介绍EGL环境创建如何进行OpenGL ES API调用结果进行提取

引用:

OpenGL ES:Android平台EGL环境 - 简书

Android OpenGL ES从白痴到入门(四):离屏渲染(Pbuffer)_pbuffers+pixmaps-CSDN博客

EGL Overview - The Khronos Group Inc

https://en.wikipedia.org/wiki/OpenVG

https://registry.khronos.org/EGL/sdk/docs/man/html/eglChooseConfig.xhtml

https://registry.khronos.org/EGL/sdk/docs/man/html/eglCreateContext.xhtml

OpenGL ES 共享上下文实现多线程渲染 - 掘金

https://www.cnblogs.com/yongdaimi/p/11244950.html

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

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

相关文章

MES系统在工业4.0时代的应用与前景

在工业4.0时代&#xff0c;制造执行系统&#xff08;MES&#xff09;在现代制造业中的作用变得愈发重要。一个优秀的MES系统不仅可以提高生产效率和质量控制&#xff0c;还可以帮助企业实现智能制造&#xff0c;提升市场竞争力。 一、MES系统的基本概念与功能 制造执行系统&a…

补码一位乘法原理(布斯编码详讲)

最近在看补码乘法的时候&#xff0c;感觉到很奇怪的一点&#xff0c;那就是补码的一位乘法&#xff0c;就是上网查了大量的资料都没有理解到它真正的原理&#xff0c;总感觉还是不会。那么&#xff0c;补码乘法的原理到底是什么呢&#xff1f;而让我们一直困惑的点是哪里呢&…

宿州降本 提质 增效 数据采集监控平台提高生产自动化水平

在当今竞争激烈的市场环境中&#xff0c;企业追求降本、提质、增效已成为发展的关键。而我们的[数据采集监控平台名称]数据采集监控平台&#xff0c;正是助力企业实现这一目标的强大工具。 LP-SCADA数据采集监控平台是工业4.0中主要的数据采集系统之一&#xff0c;主要针对产线…

nginx的知识面试易考点

Nginx概念 Nginx 是一个高性能的 HTTP 和反向代理服务。其特点是占有内存少&#xff0c;并发能力强&#xff0c;事实上nginx的并发能力在同类型的网页服务器中表现较好。 Nginx 专为性能优化而开发&#xff0c;性能是其最重要的考量指标&#xff0c;实现上非常注重效率&#…

for nested data item, row-key is required.报错解决

今天差点被一个不起眼的bug搞到吐&#xff0c;就是在给表格设置row-key的时候&#xff0c;一直设置不成功&#xff0c;一直报错缺少row-key&#xff0c;一共就那两行代码 实在是找不到还存在什么问题... 先看下报错截图... 看下代码 我在展开行里面用到了一个表格 并且存放表格…

Python数据分析案例50——基于EEMD-LSTM的石油价格预测

案例背景 很久没更新时间序列预测有关的东西了。 之前写了很多CNN-LSTM&#xff0c;GRU-attention&#xff0c;这种神经网络之内的不同模型的缝合&#xff0c;现在写一个模态分解算法和神经网络的缝合。 虽然eemd-lstm已经在学术界被做烂了&#xff0c;但是还是很多新手小白或…

昇思MindSpore学习笔记3-03热门LLM及其他AI应用--基于MobileNetv2的垃圾分类

摘要&#xff1a; MindSpore AI框架使用MobileNetv2模型开发垃圾分检代码。检测本地图像中的垃圾物体&#xff0c;保存检测结果到文件。记录了开发过程和步骤&#xff0c;包括环境准备、数据下载、加载和预处理、模型搭建、训练、测试、推理应用等。 1、实验目的 了解垃圾分…

DDoS攻击详解

DDoS 攻击&#xff0c;其本质是通过操控大量的傀儡主机或者被其掌控的网络设备&#xff0c;向目标系统如潮水般地发送海量的请求或数据。这种行为的目的在于竭尽全力地耗尽目标系统的网络带宽、系统资源以及服务能力&#xff0c;从而致使目标系统无法正常地为合法用户提供其所应…

aop的几种动态代理以及简单案例(1)

Sping AOP是通过动态代理模式实现的&#xff0c;具体有两种实现方式&#xff0c;一种是基于Java原生的动态代理&#xff0c;一种是基于cglib的动态代理。 1.jdk动态代理 1.1创建需要被代理的方法接口 public interface TargetInteface {void method1();void method2();int me…

到底哪款护眼大路灯好?五款适合学生用的护眼落地灯分享

到底哪款护眼大路灯好&#xff1f;影响青少年近视的最大“杀手”竟是学习环境光的影响。而对于这种情形&#xff0c;尤其是对于需要长时间用眼的学生群体和伏案工作者来说&#xff0c;护眼大路灯简直就是必备神器&#xff0c;但有人会问&#xff0c;我手机打开一搜就出现了那么…

有没有适合低预算党的主食冻干?希喂主食冻干真实喂养体验分享

铲屎官们好&#xff0c;今天来和大家聊聊一款让我喂出花来的主食冻干——希喂CPMR2.0大橙罐。作为一个注重猫咪身体健康和幸福感的铲屎官&#xff0c;怎么会不喂主食冻干。铲屎官们都致力于找到一款适合自家猫咪和平衡自己预算的主食冻干&#xff0c;我也做了不少尝试&#xff…

Apache配置与应用(企业网站架构部署与优化)

本章结构 如果要修改以上文件中的内容&#xff0c;想要生效&#xff0c;需要在主配置文件中能够扫描到这个默认文件的修改&#xff1a; 文件在&#xff1a; Apache 连接保持 Apache 的访问控制 针对IP地址的限制缺陷是不可预知性&#xff0c;需要事先直到对方的IP才能进行基于…

深度学习模型分布式训练

单机单卡训练 单机多卡训练 使用torch.nn.DataParallel方式&#xff0c;修改简单&#xff0c;但单进程效率慢 使用DDP方式&#xff0c;多进程效率高&#xff0c;推荐 多机多卡 模型并行 示例&#xff1a;

如何让自动化测试框架更自动化?

一、引言 ​对于大厂的同学来说&#xff0c;接口自动化是个老生常谈的话题了&#xff0c;毕竟每年的MTSC大会议题都已经能佐证了&#xff0c;不是大数据测试&#xff0c;就是AI测试等等&#xff08;越来越高大上了&#xff09;。不可否认这些专项的方向是质量智能化发展的方向&…

Redis基本数据结构

Redis基本数据结构 ​Redis​是C​语言开发的一个开源的&#xff08;遵从BSD​协议&#xff09;高性能键值对&#xff08;key-value​&#xff09;的内存数据库&#xff0c;可以用作数据库、缓存、消息中间件等。它是一种NoSQL​&#xff08;not-only sql​&#xff0c;泛指非…

几种不同的方式禁止IP访问网站(PHP、Nginx、Apache设置方法)

1、PHP禁止IP和IP段访问 <?//禁止某个IP$banned_ip array ("127.0.0.1",//"119.6.20.66","192.168.1.4");if ( in_array( getenv("REMOTE_ADDR"), $banned_ip ) ){die ("您的IP禁止访问&#xff01;");}//禁止某个IP段…

中国式报表怎么做?用这款免费可视化工具快速搞定复杂报表

1. 什么是中国式报表&#xff1f; 中国式报表是一种中国独有的复杂报表&#xff0c;有格式复杂、计算复杂、数据来源复杂等特点&#xff0c;并且还有多样化的功能要求&#xff0c;例如图形、联动、回填等。因此许多国外报表工具在制作中国式报表方便表现得有些“水土不服”&am…

UE5.3-基础蓝图类整理一

常用蓝图类整理&#xff1a; 1、获取当前关卡名&#xff1a;Get Current LevelName 2、通过关卡名打开关卡&#xff1a;Open Level(by name) 3、碰撞检测事件&#xff1a;Event ActorBeginOverlap 4、获取当前player&#xff1a;Get Player Pawn 5、判断是否相等&#xff1…

基于OpenCv的快速图片颜色交换,轻松实现图片背景更换

图片颜色更换 图片颜色转换 当我们有2张图片,很喜欢第一张图片的颜色,第2张图片的前景照片,很多时候我们需要PS进行图片的颜色转换,这当然需要我们有强大的PS功底,当然小编这里不是介绍PS的,我们使用代码完全可以代替PS 进行图片的颜色转换 图片颜色转换步骤: 步骤…

中职网络安全B模块Cenots6.8数据库

任务环境说明&#xff1a; ✓ 服务器场景&#xff1a;CentOS6.8&#xff08;开放链接&#xff09; ✓ 用户名&#xff1a;root&#xff1b;密码&#xff1a;123456 进入虚拟机操作系统&#xff1a;CentOS 6.8&#xff0c;登陆数据库&#xff08;用户名&#xff1a;root&#x…