Android平台Camera实时滤镜实现方法探讨(六)--创建帧缓存对象(FBO)加速实时滤镜处理

上一章探讨了如何采用SurfaceTexture+GLSurfaceView显示YUV数据,减少了片段着色器的工作量和代码量,但是采用GLSL采用的外部纹理真正的内容是在物理内存中,GPU只负责维护元数据,这样就增加了GPU取数据的时间,若进行一些运算密集的算法例如高斯滤波,每次都会到外部纹理取数据,这样则会造成明显的卡顿,所以仅采用外部纹理实现实时滤镜行不通。同时采用JNI格式转换随着预览分辨率提高时间也达不到要求,采用Shader转换则每次加权计算都需要进行格式转换,也增加了运算量。


好在OpenGL允许用户创建帧缓存对象,可以将数据渲染到纹理。因此我们可以将对应相机预览图像的外部纹理先渲染到内部纹理中,剩下的滤镜再绑定到该纹理,对其进行操作,这样就增加渲染速度,经实验帧数达到要求。

以下代码和思路参考GPUImage中的GPUImageFilterGroup,因为Android平台采用的是OpenGL ES,与OpenGL略有不同。


一.分配帧缓冲对象:


1)创建帧缓冲对象

有N+1个滤镜(其中第一个从外部纹理接收的无滤镜效果),就需要分配N个帧缓冲对象,首先创建大小为N的两个数组mFrameBuffers和mFrameBufferTextures,分别用来存储缓冲区id和纹理id,通过GLES20.glGenFramebuffers(1, mFrameBuffers, i)来创建帧缓冲对象

  • 6
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 8
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值