[8]Opengl ES多Surface预览摄像头

9 篇文章 0 订阅
8 篇文章 0 订阅

    术语:
    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同时预览摄像头的功能,建议大家观看我的视频,视频介绍另外两种方法的实现。

    

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值