最近在看 滤镜绘制的流程, 先把 egl 的api 写一遍,再详细写一遍流程
一、概念
EGL : 是渲染 API(如 OpenGL ES)和原生窗口系统之间的接口, 与 opengl 对接操作GPU 能力,android使用的是 openGL ES
EGL10 11 14
EGL10 egl = (EGL10) EGLContext.getEGL();
EGLDisplay display = egl.eglGetDisplay(EGL10.EGL_DEFAULT_DISPLAY); //获取显示设备
// Init
int[] version = new int[2];
egl.eglInitialize(display, version); //version中存放EGL 版本号,int[0]为主版本号,int[1]为子版本号
String vendor = egl.eglQueryString(display, EGL10.EGL_VENDOR);
WLog.d("egl vendor: " + vendor); // 打印此版本EGL的实现厂商
String version = egl.eglQueryString(display, EGL10.EGL_VERSION);
WLog.d("egl version: " + version);// 打印EGL版本号
String extension = egl.eglQueryString(display, EGL10.EGL_EXTENSIONS);
WLog.d("egl extension: " + extension); //打印支持的EGL扩展
1,虽然Android使用(实现)的是EGL 1.4(从打印的版本号中可见), 但在Android 4.2(API 17)以前的版本没有EGL14,只有EGL10和EGL11,而这两个版本是不支持OpengGL ES 2.x的,因此在老版本中某些ES 2.x相关的常量参数只能用手写的硬编码代替,典型的如设定EGL渲染类型API的参数EGL10.EGL_RENDERABLE_TYPE,这个属性用不同的赋值指定的不同的渲染API,包括OpenGL,OpenGL ES 1.x, OpenGL ES 2.x,OpenVG等,如果采用ES 2.0,应该设置此值为: EGL14.EGL_OPENGL_ES2_BIT,但是在Android 4.2之前,没有EGL14接口,只能采取手写的硬编码来指定,类似: EGL_RENDERABLE_TYPE = 4;
2,egl.eglQueryString()用来查询EGL的相关信息,详见这里:http://www.khronos.org/registry/egl/sdk/docs/man/xhtml/
3,EGL10.EGL_DEFAULT_DISPLAY 默认对应手机主屏幕。
OpenGL: 是一个操作 GPU 的 API,它通过驱动向 GPU 发送相关指令 OpenGL 是一个操作 GPU 的 API,它通过驱动向 GPU 发送相关指令,控制图形渲染管线状态机的运行状态,但是当涉及到与本地窗口系统进行交互时,就需要这么一个中间层,且它最好是与平台无关的。
二、api
2.1 创建本地系统与 OpenGL es的链接, 返回 EGLDisplay 对象, 通俗讲:就是获取显示窗口
EGLDisplay指的是物理的显示设备比如我们的手机屏幕,我们可以通过传入屏幕设备的id去获取到设备句柄,绝大多数情况下我们传入EGL14.EGL_DEFAULT_DISPLAY获取默认的屏幕就好,一般情况下我们的手机也只有一个屏幕。
拿不到设备就会返回EGL_NO_DISPLAY
EGL14.EGL_DEFAULT_DISPLAY : 默认显示,既窗口
//用于获取一个显示连接,其中display_id即要连接的display的标识
EGLDisplay eglDisplay(EGLNativeDisplayType displayId);
返回值 : EGL14.EGL_NO_DISPLAY: 没有获取到显示链接
EGL14.EGL_BAD_DISPLAY :没有指定有效的 display
2.2 初始化环境
//用于初始化显示连接,major/minor是一对输出参数,用于返回EGL的版本号。如果不关心,可以传NULL
EGLBoolean eglInitialize(EGLDisplay display, // 创建步骤时返回的对象
EGLint *majorVersion, // 返回 EGL 主版本号
EGLint *minorVersion); // 返回 EGL 次版本号
返回 EGLBoolean:
2.3 初始化 EGL完成,开始配置, 配置完成后就可以渲染Surface了
EGLDisplay支持的配置有很多种,例如颜色可能支持ARGB888、RGB888、