1. 输入组件
    1. 无论哪种输入都是将图像数据转换成OpenGL纹理(Texture)
    2. videocamera
      1. 把每一帧采集的数据封装成CMSampleBufferRef传送给gpu
      2. YUV420格式
        1. kCVPixelFormatType_420YpCbCr8Bi Planar FullRange
        2. kCVPixelFormatType_420YpCbCr8Bi Planar VideoRange
        3. plane
        4. Y纹理 - GL_LUMINANCE 灰度图)包含1个通道
        5. uv纹理 GL_LUMINANCE_ALPHA(带透明度的灰度图) 包含2个通道
          1. 所以计算机看到的都是灰度图
    3. stillcamera
    4. textureinput
    5. rawdatainput
    6. uielement
    7. filter
    8. imagemovie
    9. Textured都会设为GL_RGBA格式
      1. 纹理就是一张灰色的图片?包含图片的轮廓??
    10. shader 负责颜色转换的(yuv->rgb)OpenGL可编程着色器 需要扩展
    11. 最后得到RGB格式的GPU纹理
  2. 滤镜处理
    1. 滤镜链,输入->滤镜->输出->滤镜->输出
    2. GPUImageInput协议 定义GPUImageFilter之间传入数据 集成自GPUImageOutput
    3. 多输入滤镜基类 GPUImageFilter、GPUImageTwoInputFilter、GPUImageTwoInputFilter
    4. 传递数据
      1. 滤镜入口-newFrameReadyAtTime
        1. render 渲染
        2. informtarget将结果推到下一级滤镜
      2. targets - 把滤镜保存到所有目标里面(数组)
        1. 把自己的渲染结果传给下级滤镜作为输入 - (void)setInputFramebuffer:(GPUImageFramebuffer *)newInputFramebuffer atIndex:(NSInteger)textureIndex
        2. 推动下级滤镜启动渲染 newFrameReadyAtTime👆
    5. 处理数据
      1. 着色 renderToTextureWithVertices
        1. 默认流程,申请电脑,开机,打开软件,开始画图,完毕
        2. 1). 向frameBufferCache申请一个outputFrameBuffer
        3. 2). 将申请得到的outputFrameBuffer激活并设为渲染对象
        4. 3). glClear清除画布
        5. 4). 设置输入纹理
        6. 5). 传入顶点
        7. 6). 传入纹理坐标
        8. 7). 调用绘制方法
  3. 输出组件
    1. 滤镜输出 filter
    2. 纹理输出 textureoutput
    3. 输出到图片 gpuimageview
      1. 1). 创建GPUImageView
      2. 2). 串入滤镜链
      3. 3). 插到视图里去
    4. 视频输出到磁盘 moviewriter
    5. rawdataoutput
  4. 线程管理