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