首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

OpenglEs之EGL环境搭建

前言

前面我们发布了一系列的入门教程,例如C++系列的指针扫盲、多线程的使用等,JNI入门系列,ffmpeg入门系列等,有感兴趣的童鞋们可以关注往回自行查阅。

今天我们的主题依然是音视频开发的范畴,做过音视频开发的都知道Opengl也是音视频开发中的一项重要技能,特别是涉及到视频录制、特效处理、画质渲染细分功能。因此后续笔者打算再出一系列的Opengl ES的学习笔记,希望能与大家共同温故知新。

因为前面介绍了一些NDK和C++的教程,所以为了巩固,后续的一些demo多以NDK的形式呈现给大家,使用Opengl ES3的版本。

今天我们的主题是Opengl ES的第一篇-->EGL

EGL是什么

众所周知,Opengl是跨平台的,那么面对各种平台的差异性,Opengl是如何抹平而做到跨平台的呢?这也许就是EGL的功劳吧,简单地说EGL就是Opengl和平台各平台之间的一个适配器,是一系列的接口,具体实现是由具体的设备厂商实现的。

EGL 是渲染 API(如 OpenGL ES)和原生窗口系统之间的接口.通常来说,OpenGL 是一个操作 GPU 的 API,它通过驱动向 GPU 发送相关指令,控制图形渲染管线状态机的运行状态,但是当涉及到与本地窗口系统进行交互时,就需要这么一个中间层,且它最好是与平台无关的,因此 EGL 被设计出来,作为 OpenGL 和原生窗口系统之间的桥梁。

Opengl与EGL的关系图

EGL API 是独立于 OpenGL 各版本标准的独立的一套 API,其主要作用是为 OpenGL 指令 创建上下文 Context 、绘制目标 Surface 、配置 FrameBuffer 属性、Swap 提交绘制结果等。EGL提供如下机制:

与设备的原生窗口系统通信

查询绘图表面的可用类型和配置

创建绘图表面

在 OpenGL ES 和其他图形渲染 API 之间同步渲染

管理纹理贴图等渲染资源

下面这张图可简要看出EGL的接口能力:

EGL创建流程

想要在安卓上使用Opengl ES我们可以直接使用GLSurfaceView来进行Opengl的渲染,因为GLSurfaceView内部给我们封装好了EGL环境和渲染线程。如果我们想要更高的拓展性,我们也使用SurfaceView,然后参考SurfaceView中的EGL环境搭建、线程模型来自行搭建Opengl ES的渲染环境。

本着学习探索的目的,我们尝试在NDK搭建EGL环境。

下面这张图展示的是安卓系统上EGL的主要使用API:

需要说明的一点是EGL是单线程模型的,也就说说EGL环境的创建、渲染操作、EGL环境的销毁都必须在同一个线程内完成,否则是无效的。当然我们可以通过共享EGL上下文来做多多线程渲染,但这些都是后话了...

任何OpenGL ES应用程序都必须在开始渲染之前使用EGL执行如下任务:

查询并初始化设备商可用的显示器。

创建渲染表面。

EGL中创建的表面可以分类为屏幕上的表面或者屏幕外的表面。屏幕上的表面连接到原生窗口系统,而屏幕外的表面是不显示但是可以用作渲染表面的像素缓冲区。这些表面可以用来渲染纹理,并可以在多个Khronos API之间共享。

创建渲染上下文。

EGL是创建OpenGL ES渲染上下文所必需的。这个上下文必须连接到合适的表面才能开始渲染。

下面是EGL环境创建的主要流程:

说完烦躁的基础理论,那就放码过来吧!!!

使用Android Studio创建一个Native工程,然后配置好引入相关库:

下面我们创建一个与Native映射的EGLHelper类:

然后自定义一个MySurfaceView继承于SurfaceView,在它的Callback回调方法中对EGL进行操作:

测试效果时,我们在布局中使用我们自定义好MySurfaceView即可,自此java层代码编写完毕,在NDK层我们将EGL环境创建完毕后即可通过MySurfaceView看到渲染结果。

为了方便调试和debug,我们定义日志工具:

将EGL的相关操作封装在类C++的类EglHelper中:

EglHelper.cpp主要实现如下,EGL的主要创建过程在函数中,具体看注释:

自己EGL环境创建完毕,我们通过JNI调用起来看看效果,native-lib.cpp:

上述涉及到了之前介绍过的JNI函数签名、动态注册等相关知识点,忘记了的童鞋可往回看之前的记录。

如无意外,运行看到的是一个蓝屏画面则说明EGL环境搭建成功了,后续开启你的Opengl炫酷之旅吧!!!

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20220826A0152R00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券