java使用egl_直播渲染技术—EGL解析

我们在Andriod系统下做视频渲染时要使用 OpenGL ES, 而使用 OpenGL ES 就不得不提到 EGL。那么EGL是什么呢?它又在渲染时起到什么作用呢?今天就给大家介绍一下 EGL.图玩智能科技为企业提供直播平台的二次开发服务,详细内容欢迎随时咨询www.toivan.com.

什么是EGL

EGL是一套用于管理绘制Surface的API。它的运行机制如下:

与系统的本地窗口进行通信。

查询绘制Surface的有效类型与配置。

创建绘制的Surface。

创建Context来管理渲染资源,如OpenGL ES 的 Shader 数组数据。

将 OpenGL ES 渲染的数据输出到 Surface中,并最终将 Surface中的内容输出到本地窗口。

下图展示了 EGL 在视频渲染中的作用:

dd1b15116c3db144f20459106bf6a5d1.png

Display(EGLDisplay) 是对实际显示设备的抽象。

Surface(EGLSurface)是对用来存储图像的内存区域FrameBuffer的抽象,包括Color Buffer, Stencil Buffer ,Depth Buffer.

Context (EGLContext) 存储OpenGL ES绘图的一些状态信息及Shader数组数据。

使用 EGL 的步骤

可以把 EGL 看作是 OpenGL ES 与 本地窗口系统之间的胶水层。使用EGL需按如下步聚操作:

获取EGLDisplay对象

在EGL能够确定什么类型的会制Surface或底层系统的其它特性之前,需要先与系统窗口建立通信。EGL提供了一个类型EGLDisplay,它封装了所有操作本地窗口的API。使用EGL时,第一步操作就是创建并初始化与EGLDisplay的连接。下面是连接EGLDisplay的具体函数:

EGLDisplay eglGetDisplay(EGLNativeDisplayType display_id);

初始化与EGL之间的连接

EGL成功与EGLDisplay连接后,需要初始化EGL,调用eglInitialize函数完这成这个作务。函数如下:

9d1c7f961a4c2756e3a051d6202bec66.png

eglInitialize函数初始化EGL的内部数据结构,如果EGL初始化失败,就会返回EGL_FALSE。

获取EGLConfig对象

EGL初始化完成后,我们就可以获取渲染Surfaces的类型和配置了。EGLConfig包括所有关于Surface的配置信息。这些信息包括可用颜色数,与配置相关的额外缓冲区(如深度和模板缓冲),Surface的类型和众多的其他特点。函数如下:

5edb5970954d72869720e3c77b7a613d.png

创建EGLContext实例

EGLContext结构内部包含OpenGL ES 2所有的状态及所需的操作。例如,它包含引用到顶点和片段着色器的数组数据。在OpenGL ES 2可以绘制之前,需要先创建好EGLContext。函数如下:

f73d56ad4e3592db36cc085b061ba066.png

创建EGLSurface实例

创建完EGLConfig后,可根据EGLConfig创建EGLSurface。EGLSurface相当于一块画布(一块内存空间),用户想绘制的信息首先都要先绘制到EGLSurface上。

496f835d690f874d05eac1af67df1dd6.png

连接EGLContext和EGLSurface

通过上面的步骤,我们已经有了 EGLContext 和 EGLSurface 对象。下面我们需要将二者关联在一起,这样 EGL 就可以控制 OpenGL ES 从 EGLContext 读取 shader 数据,并向 EGLSurface 中绘制内容了。

fe449d810f605ea26fbd9aa6f4a0b9b5.png

使用GL指令绘制图形

EGL将EGLSurface中的内容通过 EGLDisplay 输出到本地窗口上。

778bfec819fcbf3ff0825df8801d8af1.png

断开并释放与EGLSurface关联的EGLContext对象

使用 eglMakeCurrent 函数,将 EGLSurface 和 EGLContext 分别设置为 EGL14.EGL_NO_SURFACE 和 EGL14.EGL_NO_CONTEXT,这样就将两者的关系断开了。

5e061f48add132563cdd54d0dae6d734.png

删除EGLSurface对象

8d539decd6a2126467a7faa3a2cef003.png

删除EGLContext对象

8a0334c7e8f5e23d8ddd3a895609f032.png

终止与EGLDisplay之间的连接

232ef20cad6407fa94e37781eb1492a7.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值