简介
OpenGL 是跨平台的、专业的图形编程接口,而接口的实现是由厂商来完成的。
OpenGL使用这些接口绘制完成后,需要把数据渲染到屏幕上,就需要EGL来接手这部分工作。
EGL:全称Embedded Graphic Library。是 OpenGL ES 和底层 Native 平台 视窗系统之间的接口,如下图所示。
EGL介绍
EGL接口中含有3个对象,如下图所示:
其中:
-
Display(EGLDisplay) 是对实际显示设备的抽象,也就是屏幕
-
Surface(EGLSurface)是对用来存储图像的内存区域
-
FrameBuffer 的抽象,包括 Color Buffer, Stencil Buffer ,Depth Buffer
-
Context (EGLContext) 存储 OpenGL ES绘图的一些状态信息
OpenGL和EGL配合工作的大概流程:
- EGL 获取到手机屏幕的handle,获取到手机支持的配置(RGBA8888/RGB565 之类,表示每个像素中包 含的颜色等信息的存储空间是多少位)。即EGLConfig。
- 然后根据这个配置创建一块包含默认 buffer 的 surface(buffer 的大小是根据屏幕分辨率乘以每像素信息所占大小计 算而得)。即EGLSurface
- 用于存放 OpenGL ES 状态集的 context,并将它们 enable 起来。即eglMakeCurrent操作
- 然后, 通过 OpenGL ES 操作 GPU 进行计算,将计算的结果保存在 surface 的 buffer 中。
- 最后,使用 EGL将绘制的图片显示到手机屏幕上。即eglSwapBuffer操作。
实例代码
Android平台上,在利用OpenGL去播放渲染视频时,通常会配合GLSurfaceView一起用,这是因为GLSurfaceView
封装屏蔽了以上EGL
的工作细节,为了展示这些细节,下面使用OpenGL + EGL + SurfaceView + MediaCodec
播放一个视频。流程图如下:
代码github传送门:EGLPlayerSimpleDemo
参考文章
glumes《OpenGL之EGL实践》
夜行过客《OpenGL ES: (2) OpenGL ES 与 EGL、GLSL的关系》