术语:
VertexShader:顶点着色器,用来描述图形图像位置的顶点坐标;
FragmentShader:片元着色器,用来给顶点指定的区域进行着色;
Vertex:顶点
Texture:纹理,给顶点区域进行渲染的材质,比如图像等;
上一小节我们大致介绍了FBO的概念,以及怎么在其上附着颜色绘制内容,然后把我们绘制的东西渲染到屏幕,下面我们就来介绍下Opengl ES下怎么样在多个Surface上渲染同一个摄像头的图像数据。
摄像头在多个Surface上预览有多种方法可以实现,今天我们就讲在单线程中的实现,其它两种在我的视频有详细介绍,大家可以去观看,要在单线程中实现多个Surface同时预览同一个摄像头的数据,这个要先从EGL的环境搭建说起,其中有一个方法eglMakeCurrent,还记得我们说过吧,这个方法相当重要,它做了如下几个事情:
1)检查传入的EGLContext是否在其它线程有没有绑定过,如果有绑定直接返回错误;
2)检查传入的EGLSurface是否关联到其它的EGLContext上,如果有直接返回错误;
3)检查传入的EGLContext是否已经绑定到当前线程,如果没有保存到线程的TLS;
4)检查传入的EGLContext中绑定的EGLSurface是否和传进去的相同,如果不同断开和EGLContext的连接;
5)把传入的EGLSurface绑定到EGLContext;
我们知道Opengl ES的API调用是居于状态方式的,调用的状态变化都保存在EGLContext结构了,最后会渲染到和其绑定的Surface上完成显示,因此,我们多个Surface预览摄像头数据就是利用eglMakeCurrent这个函数的原理实现的。
有了思路,下面就看看实现的流程图:
实现的具体步骤如下:
.初始化EGL环境
.生成每个显示Surface对应的EGLSurface;
.摄像头数据回调,更新到纹理;
.调用eglMakeCurrent绑定到Surface1;
.绘制纹理到Surface1;
.然后重复上面两个步骤,绘制Surface2,直到绘制完所有Surface;
此方法可以很好实现我们的需求,但是由于调用eglMakeCurrent方法来切换对Surface的绑定,这涉及到驱动显卡的数据提交,要小心使用,会造成一定的性能影响,如果要优雅地在多线程中实现多Surface同时预览摄像头的功能,建议大家观看我的视频,视频介绍另外两种方法的实现。