GPUImage是基于GUP图像和视频处理的iOS开源框架,它采用链式传递每一层渲染的帧缓存对象,通过addTarget:方法为链条添加每层的filter,直到最后通过GPUImageView来显示。
这里通过研究GPUImage是如何将摄像头抓取的图像经过一层一层滤镜渲染最后展示给用户,来学习GPUImage的整体框架设计原理。
首先介绍GPUImage的几个主要的类
GLProgram //加载顶点着色器和片元着色器程序并进行编译链接最终使用,着色器中attribute添加等
GPUImageOutput //抽象类,实现addTarget:以及从当前帧缓存获取图像等接口
GPUImageFilter //继承自GPUImageOutput,所有滤镜的父类(除去Group滤镜),主要提供给着色器传递参数的接口,以及渲染当前的帧缓存并传递给下一层target,链式结构的实现主要就是在newFrameReadyAtTime: atIndex:方法中,下面会详细讲述
GPUImageFramebuffer //OpenGL的FBO就是通过它实现的
GPUImageFramebufferCache //实现帧缓存的重用机制
GPUImageTwoInputFilter //所有多层纹理特效都是通过它来实现的,比如抖音的“幻觉”特效
GPUImageFilterGroup //组合滤镜
GPUImageVideoCamera //实现摄像头的实时视频和音频的采集
GPUImagePicture //可以作为混合滤镜的第N个纹理,比如抖音中那些萌萌的表情就可以通过它来实现
GPUImageView //对渲染好的图像进行显示
GPUImageMovieWriter //保存视频
下面开始跑一遍流程
1. 创建GPUImageVideoCam