由于 OpenGL ES 一开始就是为跨平台设计的,所以它本身并不承担窗口管理以及上下文环境构建的职责,这个职责需要由各自的平台来承担。
Android 平台使用的是 EGL,EGL 是 Khronos 创建的一个框架,用来给 OpenGL 的输出与设备的屏幕搭建起一个桥梁。EGL 的工作机制是双缓冲模式,也就是有一个 Back Frame Buffer 和一个 Front Frame Buffer,正常绘制操作的目标都是 Back Frame Buffer,渲染完毕之后,调用 eglSwapBuffer 这个 API,会将绘制完毕的 Back Frame Buffer 与当前的 Front Frame Buffer 进行交换,然后显示出来。EGL 承担了为 OpenGL 提供上下文环境以及窗口管理的职责。
iOS 平台使用的是 EAGL,与 EGL 的双缓冲机制比较类似,iOS 平台也不允许我们直接渲染到屏幕上,而是渲染到一个叫 renderBuffer 的对象上。这个对象你可以理解为一个特殊的 FrameBuffer,最终再调用 EAGLContext 的 presentRenderBuffer 方法,就可以将渲染结果输出到屏幕上去了。
Android 平台的环境搭建
要在 Android 平台上使用 OpenGL ES,最简单的方式是使用 GLSurfaceView,因为不需要开发者搭建 OpenGL ES 的上下文环境以及创建 OpenGL ES 的显示设备,只需要遵循 GLSurfaceView 定义的接口,实现对应的逻辑即可。就像硬币有正反面一样,使用 GLSurfaceView 的缺点也比较明显,就是不够灵活,OpenGL ES 很多核心用法,比如共享上下文,使用起来就会比较麻烦。
此处会直接使用 EGL 提供的 API,在 Native 层基于 C++ 环境进行搭建。原因是在 Java 层进行搭建的话,对于普通的应用也许可以,但是对于要进行解码或使用第三方库的场景,比如人脸识别,又需要到 Native 层来实施。考虑到效率和性能,我们这里就直接使用 Native 层的 EGL 来搭建一个 OpenGL ES 的开发环境。
引入头文件与 so 库
我们必须要在 CMake 构建脚本(CMakeLists.txt)中加入 EGL 这个库,并在使用这个库的 C++ 文件中引入 EGL 对应的头文件。
需要引用的头文件如下:
#include <EGL/egl.h>
#include <EGL/eglext.h>
需要引入的 so 库:
target_link_libraries(videoengine
# 引入系统的动态库
EGL
)
这样我们就可以在 Android 的 Native 层中使用 EGL 了,不过要使用 OpenGL ES 给开发者提供的接口,还需要引入 OpenGL ES 对应的头文件与库。
需要包含的头文件:

文章详细介绍了如何在Android和iOS平台上使用EGL来搭建OpenGLES的环境。在Android上,通常使用GLSurfaceView,但在需要更多灵活性或在Native层工作的场景下,直接使用EGLAPI更合适。EGLDisplay代表绘制目标,EGLContext提供线程的上下文,而EGLSurface则是连接EGLDisplay和系统屏幕的桥梁。整个过程涉及到上下文的创建、配置、绑定以及资源的销毁。
最低0.47元/天 解锁文章
644

被折叠的 条评论
为什么被折叠?



