音视频

【iOS】(一)GPUImage的结构,滤镜链的实现原理

2020-03-24  本文已影响0人  mapleYe

前言

学了OpenGL,OpenGLES后,去阅读了GPUImage的源码,使用了一段时间,接下来,记录一下我对GPUImage使用和源码阅读的一些分析吧。
相关引用
从0打造一个GPUImage(6)-GPUImage的多滤镜处理逻辑

GPUImage结构

GPUImage目录.png

对于GPUImage,可以分为

GPUImage的滤镜链

上面也提了,所谓的GPUImage滤镜链就是
GPUImageOutput -> filter -> filter -> GPUImageInput
GPUImageOutput通过target数组(里面都是实现GPUImageInput组件),组成了滤镜链的关系,我们需要牢牢的记住这个滤镜链的关系,这样开发的时候,我们就知道如何Debug,如何实现我们需要的效果。那么问题来了,为什么GPUImage可以实现这样的滤镜链呢?

滤镜链实现的原理

这里我们先抛开GPUImage,用OpenGL ES去实现一个具有滤镜叠加效果的Demo,这里的Demo我是参考叶孤城的这篇文章,从0打造一个GPUImage(6)-GPUImage的多滤镜处理逻辑

Demo需要实现的效果,是将一张图片,先后通过叠加亮度滤镜饱和度滤镜最后显示在屏幕上。

使用GPUImage的渲染步骤

使用OpenGLES的渲染步骤

那么对应的OpenGLES,我们会怎么做呢?首先我们需要以下东西

// 绑定texture
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, brightnessTexture, 0)
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, saturationTexture, 0)
// 绑定renderBuffer
 glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, _renderBuffer);

从以上的步骤,我们可以总结以下结论

对于这个Demo的一个流程图,可以参考从0打造一个GPUImage(6)-GPUImage的多滤镜处理逻辑的一幅图,Demo的详细实现请看原文吧。

OpenGLES滤镜叠加流程图

总结

以上就是GPUImage对于滤镜链的实现原理,只有你懂了OpenGL ES的渲染流程,才能彻底的明白GPUImage的滤镜链的原理。所以时时刻刻记住以下关系
GPUImageOutput -> filter -> filter -> GPUImageInput
当然也可以存在多个Source,多个Input的情况,例如要给一个视频添加水印,用GPUImageMovie用于输出视频纹理,用GPUImageUIElement输出UI空间的纹理,通过一个filter进行Blend,最后用一个GPUImageView进行预览,用GPUImageMovieWriter进行输出,滤镜链关系如下

GPUImageOutput -> filter -> filter -> GPUImageInput
                    ↑         ↓
GPUImageOutput ----->    GPUImageInput
上一篇 下一篇

猜你喜欢

热点阅读