一、前言
通过前面的两篇文章,我们知道了滤镜链的工作原理,以及纹理数据是怎么产生的,那么接下来,就从源码的角度继续分析GPUImageFilter
,GPUImageInput
。
二、GPUImageFilter
代码语言:javascript复制@interface GPUImageFilter : GPUImageOutput <GPUImageInput>
看到GPUImageFilter
的头文件,我们就知道它再滤镜链中,就是承担着桥梁的作用,是实现Source
->GPUImageFilter
->GPUImageInput
的桥梁。
GPUImageFilter
主要是用于封装OpenGLES 中的vertexShader
和fragmentShader
生成program
的一个类,并且封装了访问shader里面属性的方法。例如GPUImagePoissonBlendFilter
中,可以直接通过对mix修改,然后将mix的值调用program
传递给shader
- (void)setMix:(CGFloat)newValue;
{
_mix = newValue;
[self setFloat:_mix forUniform:mixUniform program:filterProgram];
}
在这里,用于生成program
的工具类就是GLProgram
,其作用就是加载vertexShader
和fragmentShader
生成program
,并且提供attributeIndex
和uniformIndex
的获取,具体源码需要OpenGLES的基础才能阅读
三、GPUImageInput
GPUImageInput
具备接收图像数据输入,也就是渲染的终点,在GPUImage
里,有四大组件,使用的比较多的GPUImageMovieWriter
和GPUImageView
3.1、GPUImageMovieWriter
封装了AVAssetWriter,可以逐帧从帧缓存的渲染结果中读取数据,最后通过AVAssetWriter将视频保存到指定的路径
3.2、GPUImageView
继承UIView,通过输入的纹理,执行一遍渲染流程
3.3、GPUImageRawDataOutput
通过rawBytesForImage属性,获取到当前输入纹理的二进制数据
3.4、GPUImageTextureOutput
通过提供协议方法newFrameReadyFromTextureOutput:,再每一帧渲染结束后,将自身返回,通过texture属性就可以拿到输入纹理的索引
四、总结
由于本人对GPUImageFilter
和GPUImageInput
研究的并不是很深,所以这里先留个坑吧,或许日后有新的体悟的时候,会对这里的内容进行扩展吧,那么对于GPUImage的源码阅读,就到这里为止吧。