【iOS】(三)GPUImageFilter,GPUImageInput

2020-03-28 20:57:39 浏览数 (1)

一、前言

通过前面的两篇文章,我们知道了滤镜链的工作原理,以及纹理数据是怎么产生的,那么接下来,就从源码的角度继续分析GPUImageFilterGPUImageInput

二、GPUImageFilter

代码语言:javascript复制
@interface GPUImageFilter : GPUImageOutput <GPUImageInput>

看到GPUImageFilter的头文件,我们就知道它再滤镜链中,就是承担着桥梁的作用,是实现Source->GPUImageFilter->GPUImageInput的桥梁。 GPUImageFilter主要是用于封装OpenGLES 中的vertexShaderfragmentShader生成program的一个类,并且封装了访问shader里面属性的方法。例如GPUImagePoissonBlendFilter中,可以直接通过对mix修改,然后将mix的值调用program传递给shader

代码语言:javascript复制
- (void)setMix:(CGFloat)newValue;
{
    _mix = newValue;
    
    [self setFloat:_mix forUniform:mixUniform program:filterProgram];
}

在这里,用于生成program的工具类就是GLProgram,其作用就是加载vertexShaderfragmentShader生成program,并且提供attributeIndexuniformIndex的获取,具体源码需要OpenGLES的基础才能阅读

三、GPUImageInput

GPUImageInput具备接收图像数据输入,也就是渲染的终点,在GPUImage里,有四大组件,使用的比较多的GPUImageMovieWriterGPUImageView

3.1、GPUImageMovieWriter

封装了AVAssetWriter,可以逐帧从帧缓存的渲染结果中读取数据,最后通过AVAssetWriter将视频保存到指定的路径

3.2、GPUImageView

继承UIView,通过输入的纹理,执行一遍渲染流程

3.3、GPUImageRawDataOutput

通过rawBytesForImage属性,获取到当前输入纹理的二进制数据

3.4、GPUImageTextureOutput

通过提供协议方法newFrameReadyFromTextureOutput:,再每一帧渲染结束后,将自身返回,通过texture属性就可以拿到输入纹理的索引

四、总结

由于本人对GPUImageFilterGPUImageInput研究的并不是很深,所以这里先留个坑吧,或许日后有新的体悟的时候,会对这里的内容进行扩展吧,那么对于GPUImage的源码阅读,就到这里为止吧。

0 人点赞