美文网首页
GPUImage 学习一

GPUImage 学习一

作者: 写自己的代码 | 来源:发表于2017-11-17 17:11 被阅读0次

    最近在做视频处理方面的工作,然后接触到了GPUImage这个开源库,这是库使用的是OpenGLES这套图像处理方案。初使用时,一脸懵逼,虽然大学时学过一些图像处理方面的知识,因为不是主课程,老师讲得也比较粗糙,再加上当时也没有认真研究,所以基本是都还给老师了。

    首先熟悉下基本的概念

    • CPU 与 GPU

    电脑或者手机上做图像处理有很多方式,但是目前为止最高效的方法是有效地使用图形处理单元,或者叫GPU。你的手机包含两个不同的处理单元,CPU和GPU。CPU是个多面手,并且不得不处理所有的事情,而GPU则可以集中来处理好一件事情,就是并行地做浮点运算。事实上,图像处理和渲染就是在将要渲染到窗口上的像素上做许许多多的浮点运算。

    通过有效的利用GPU,可以成百倍甚至上千倍地提高手机上的图像渲染能力。如果不是基于GPU的处理,手机实时高清视频滤镜是不现实,甚至不可能的。

    • 着色器(shader)

    着色器(shader)是我们利用这种能力的工具。着色器是用着色语言写的小的,基于C语言的程序。现在有许多种着色语言,但你如果做OS X 或者iOS开发的话,你应该专注于OpenGL着色语言,或者叫GLSL。你可以将GLSL的理念应用到其他的更专用的语言(比如Metal)上去。这里我们即将即将介绍的概念与和Core Image中的自定义核矩阵有着很好的对应,尽管它们在语法上有一些不同。

    什么是着色器
    在OpenGL ES 中你必须创建两种着色器“顶点着色器(vertex shaders)和片段着色器(fragment shaders)。这两种着色器是一个完整程序的两半,你不能仅仅创建其中任何一个;想创建一个完整的着色程序,两个都是必须存在的。

    顶点着色器定义了在2D或者3D场景中几何图形是如何处理的。一个顶点指的是2D或者3D空间中的一个点。在图像处理中,有四个顶点:每一个顶点代表图像的一个角。顶点着色器设置顶点的位置,并且把位置和纹理坐标这样的参数发送到片段着色器。

    然后GPU使用片段着色器在对象或者说图片的每一个像素上进行计算,最终计算出每个像素的最终颜色。图片,归根结底,实际上仅仅是数据的集合。图片的文档包含每一个像素的各个颜色分量和像素透明度的值。因为对每一个像素,算式是相同的,GPU可以流水线作业这个过程,从而更加有效的进行处理。使用正确优化过的着色器,在GPU上进行处理,将使你获得百倍于在CPU上用同样的过程进行图像处理的效率。

    http://www.bkjia.com/IOSjc/1089406.html

    类型说明

    然后源码里面一堆的变量类型就够我无从下眼了,这是神马神马呢?于是开始一点点的啃,下面就来学学基本类型吧。

    首先参考这篇文章
    http://blog.csdn.net/hgl868/article/details/7846269

    • 基本数据类型
    Type(类型) 中文意思 Meaning
    void 没有返回值或空参数列表的函数 for functions that do not return a value or for an empty parameter list
    bool 一种有条件的类型,取真或假的值。 a conditional type,taking on values of true or false
    int 一个有符号整数 a signed integer
    float 单浮点数标量 a single floating-point scalar
    vec2 双分量浮点向量 a two component floating-point vector
    vec3 三分量浮点向量 a three component floating-point vector
    vec4 四分量浮点向量 a four component floating-point vector
    bvec2 双分量布尔向量 a tow component Boolean vector
    bvec3 三分量布尔向量 a three component Boolean vector
    bvec4 四分量布尔向量 a four component Boolean vector
    ivec2 双分量整数向量 a tow component integer vector
    ivec3 三分量整数向量 a three component integer vector
    ivec4 四分量整数向量 a four component integer vector
    mat2 2x2 浮点矩阵 a 2x2 floating-point matrix
    mat3 3x3浮点矩阵 a 3x3 floating-point matrix
    mat4 4x4浮点矩阵 a 4x4 floating-point matrix
    sampler2D 用于访问2D纹理的句柄 a handle for accessing a 2D texture
    samplerCube 访问立方体映射纹理的句柄 a handle for accessing a cube mapped texture
    • 存储修饰符
    Qualifier 中文意思 Meaning
    <none:default> 本地读/写内存,或函数的输入参数 local read/write memory, or an input parameter to a function
    const 常数,或只读的函数参数。 a complied-time constant, or a function parameter that is read-only
    attribute 顶点着色器与每个顶点数据的OpenGL ES之间的链接 linkage between a vertex shader and OpenGL ES for per-vertex data
    uniform 值不会随着原始进程的变化而变化,制服构成着色器、OpenGL ES和应用程序之间的链接。 value does not change across the primitive being progressed, uniforms form the linkage between a shader,OpenGL ES,and the application
    varying 用于插值数据的顶点着色器和片段着色器之间的链接 linkage between a vertex shader and a fragment shader for interpolated data
    • 精度修饰符
    Qualifier 中文意思 Meaning
    highp 满足上面所描述的顶点语言的最低要求。 Satisfies the minimum requirements for the vertex language discribed above.Optional in the fragment language
    mediump 满足最低要求以上的片段的语言。它的射程和精度必须大于或小于或在lowP提供同时提供相同highp Satisfies the minimum requirements ablove for the fragment language.It's range and precision has to be greater than or the same as provided by lowp and less than or the same as provided by highp.
    lowp 范围和精度可以小于中等,但仍然打算代表任何颜色通道的所有颜色值。 Range and precision that can be less than medium,but still intended to represent all color values for any color channel
    • 在顶点语言中有如下预定义的全局默认精度语句:
         precision highp float;
         precision highp int;
         precision lowp sampler2D;
         precision lowp samplerCube;
    
    • 在片元语言中有如下预定义的全局默认精度语句:
        precision mediump int;
        precision lowp sampler2D;
        precision lowp samplerCube;
    

    GPUImage中引用的文件说明

    /*⁃ output为输出源
    ⁃ intput为输入源
    ⁃ filter为滤镜
    */
    
    // Base classes
    #import "GPUImageContext.h"                 //是GPUImage对OpenGL ES上下文的封装,添加了GPUImage相关的上下文,比如说Program的使用缓存,处理队列,CV纹理缓存等
    #import "GPUImageOutput.h"                  //输出
    #import "GPUImageView.h"                    //GPUImageView是响应链的终点,一般用于显示GPUImage的图像
    #import "GPUImageVideoCamera.h"             //摄像头-视频流
    #import "GPUImageStillCamera.h"             //摄像头-照相
    #import "GPUImageMovie.h"                   //视频
    #import "GPUImagePicture.h"                 //图片
    #import "GPUImageRawDataInput.h"            //原始数据输入
    #import "GPUImageRawDataOutput.h"           //原始数据输出
    #import "GPUImageMovieWriter.h"             //电影制作
    #import "GPUImageFilterPipeline.h"          //滤镜管道
    #import "GPUImageTextureOutput.h"           //纹理输出
    #import "GPUImageFilterGroup.h"             //滤镜组合
    #import "GPUImageTextureInput.h"            //纹理输入
    #import "GPUImageUIElement.h"               //UI元素
    #import "GPUImageBuffer.h"                  //缓存
    #import "GPUImageFramebuffer.h"             //管理纹理缓存格式、帧缓存的buffer
    #import "GPUImageFramebufferCache.h"        //帧缓存池
    
    // Filters
    #import "GPUImageFilter.h"                  //GPUImage的滤镜的基类
    #import "GPUImageTwoInputFilter.h"          //对两个输入纹理进行通用的处理.两个输入纹理默认为inputImageTexture和inputImageTexture2。
    #import "GPUImagePixellateFilter.h"         //像素化滤镜
    #import "GPUImagePixellatePositionFilter.h" //像素化位置滤镜
    #import "GPUImageSepiaFilter.h"             //褐色(怀旧)
    #import "GPUImageColorInvertFilter.h"       //反色
    #import "GPUImageSaturationFilter.h"        //饱和度
    #import "GPUImageContrastFilter.h"          //对比度
    #import "GPUImageExposureFilter.h"          //曝光
    #import "GPUImageBrightnessFilter.h"        //亮度
    #import "GPUImageLevelsFilter.h"            //色阶
    #import "GPUImageSharpenFilter.h"           //锐化
    #import "GPUImageGammaFilter.h"             //伽马线
    #import "GPUImageSobelEdgeDetectionFilter.h"//Sobel边缘检测算法(白边,黑内容,有点漫画的反色效果)
    #import "GPUImageSketchFilter.h"            //素描
    #import "GPUImageToonFilter.h"              //卡通效果(黑色粗线描边)
    #import "GPUImageSmoothToonFilter.h"         //相比上面的效果更细腻,上面是粗旷的画风
    #import "GPUImageMultiplyBlendFilter.h"     //通常用于创建阴影和深度效果
    #import "GPUImageDissolveBlendFilter.h"     //溶解
    #import "GPUImageKuwaharaFilter.h"          //桑原(Kuwahara)滤波,水粉画的模糊效果;处理时间比较长,慎用
    #import "GPUImageKuwaharaRadius3Filter.h"
    #import "GPUImageVignetteFilter.h"             //晕影,形成黑色圆形边缘,突出中间图像的效果
    #import "GPUImageGaussianBlurFilter.h"         //高斯模糊
    #import "GPUImageGaussianBlurPositionFilter.h" //高斯模糊位置
    #import "GPUImageGaussianSelectiveBlurFilter.h"//高斯模糊,选择部分清晰
    #import "GPUImageOverlayBlendFilter.h"         //叠加,通常用于创建阴影效果
    #import "GPUImageDarkenBlendFilter.h"          //加深混合,通常用于重叠类型
    #import "GPUImageLightenBlendFilter.h"         //减淡混合,通常用于重叠类型
    #import "GPUImageSwirlFilter.h"                //漩涡,中间形成卷曲的画面
    #import "GPUImageSourceOverBlendFilter.h"      //源混合
    #import "GPUImageColorBurnBlendFilter.h"       //色彩加深混合
    #import "GPUImageColorDodgeBlendFilter.h"      //色彩减淡混合
    #import "GPUImageScreenBlendFilter.h"          //屏幕包裹,通常用于创建亮点和镜头眩光
    #import "GPUImageExclusionBlendFilter.h"       //排除混合
    #import "GPUImageDifferenceBlendFilter.h"       //差异混合,通常用于创建更多变动的颜色
    #import "GPUImageSubtractBlendFilter.h"         //差值混合,通常用于创建两个图像之间的动画变暗模糊效果
    #import "GPUImageHardLightBlendFilter.h"        //强光混合,通常用于创建阴影效果
    #import "GPUImageSoftLightBlendFilter.h"        //柔光混合
    #import "GPUImageColorBlendFilter.h"            //颜色混合
    #import "GPUImageHueBlendFilter.h"              //色彩混合
    #import "GPUImageSaturationBlendFilter.h"       //饱和度混合
    #import "GPUImageLuminosityBlendFilter.h"       //光度混合
    #import "GPUImageCropFilter.h"                  //剪裁
    #import "GPUImageGrayscaleFilter.h"             //灰度
    #import "GPUImageTransformFilter.h"             //形状变化
    #import "GPUImageChromaKeyBlendFilter.h"        //色度键混合
    #import "GPUImageHazeFilter.h"                  //朦胧加暗
    #import "GPUImageLuminanceThresholdFilter.h"    //亮度阈
    #import "GPUImagePosterizeFilter.h"             //色调分离,形成噪点效果
    #import "GPUImageBoxBlurFilter.h"               //盒状模糊
    #import "GPUImageAdaptiveThresholdFilter.h"     //自适应阈值
    #import "GPUImageUnsharpMaskFilter.h"           //反遮罩锐化
    #import "GPUImageBulgeDistortionFilter.h"       //凸起失真,鱼眼效果
    #import "GPUImagePinchDistortionFilter.h"       //收缩失真,凹面镜
    #import "GPUImageCrosshatchFilter.h"            //交叉线阴影,形成黑白网状画面
    #import "GPUImageCGAColorspaceFilter.h"         //CGA色彩滤镜,形成黑、浅蓝、紫色块的画面
    #import "GPUImagePolarPixellateFilter.h"        //同心圆像素化
    #import "GPUImageStretchDistortionFilter.h"     //伸展失真,哈哈镜
    #import "GPUImagePerlinNoiseFilter.h"           //柏林噪点,花边噪点
    #import "GPUImageJFAVoronoiFilter.h"
    #import "GPUImageVoronoiConsumerFilter.h"
    #import "GPUImageMosaicFilter.h"                //黑白马赛克
    #import "GPUImageTiltShiftFilter.h"             //条纹模糊,中间清晰,上下两端模糊
    #import "GPUImage3x3ConvolutionFilter.h"        //3x3卷积,高亮大色块变黑,加亮边缘、线条等
    #import "GPUImageEmbossFilter.h"                //浮雕效果,带有点3d的感觉
    #import "GPUImageCannyEdgeDetectionFilter.h"    //Canny边缘检测算法(比上更强烈的黑白对比度)
    #import "GPUImageThresholdEdgeDetectionFilter.h"//阈值边缘检测(效果与上差别不大)
    #import "GPUImageMaskFilter.h"                  //遮罩混合
    #import "GPUImageHistogramFilter.h"             //色彩直方图,显示在图片上
    #import "GPUImageHistogramGenerator.h"          //色彩直方图
    #import "GPUImageHistogramEqualizationFilter.h"
    #import "GPUImagePrewittEdgeDetectionFilter.h"  //普瑞维特(Prewitt)边缘检测(效果与Sobel差不多,貌似更平滑
    #import "GPUImageXYDerivativeFilter.h"          //XYDerivative边缘检测,画面以蓝色为主,绿色为边缘,带彩色
    #import "GPUImageHarrisCornerDetectionFilter.h" //Harris角点检测,会有绿色小十字显示在图片角点处
    #import "GPUImageAlphaBlendFilter.h"            //透明混合,通常用于在背景上应用前景的透明度
    #import "GPUImageNormalBlendFilter.h"           //正常
    #import "GPUImageNonMaximumSuppressionFilter.h" //非最大抑制,只显示亮度最高的像素,其他为黑
    #import "GPUImageRGBFilter.h"                   //RGB
    #import "GPUImageMedianFilter.h"                //中间值,有种稍微模糊边缘的效果
    #import "GPUImageBilateralFilter.h"             //双边模糊
    #import "GPUImageCrosshairGenerator.h"          //十字
    #import "GPUImageToneCurveFilter.h"             //色调曲线
    #import "GPUImageNobleCornerDetectionFilter.h" //Noble角点检测,检测点更多
    #import "GPUImageShiTomasiFeatureDetectionFilter.h"//ShiTomasi角点检测,与上差别不大
    #import "GPUImageErosionFilter.h"               //侵蚀边缘模糊,变黑白
    #import "GPUImageRGBErosionFilter.h"            //RGB侵蚀边缘模糊,有色彩
    #import "GPUImageDilationFilter.h"              //扩展边缘模糊,变黑白
    #import "GPUImageRGBDilationFilter.h"           //RGB扩展边缘模糊,有色彩
    #import "GPUImageOpeningFilter.h"               //黑白色调模糊
    #import "GPUImageRGBOpeningFilter.h"            //彩色模糊
    #import "GPUImageClosingFilter.h"               //黑白色调模糊,暗色会被提亮
    #import "GPUImageRGBClosingFilter.h"            //彩色模糊,暗色会被提亮
    #import "GPUImageColorPackingFilter.h"          //色彩丢失,模糊(类似监控摄像效果)
    #import "GPUImageSphereRefractionFilter.h"      //球形折射,图形倒立
    #import "GPUImageMonochromeFilter.h"            //单色
    #import "GPUImageOpacityFilter.h"               //不透明度
    #import "GPUImageHighlightShadowFilter.h"       //提亮阴影
    #import "GPUImageFalseColorFilter.h"            //色彩替换(替换亮部和暗部色彩)
    #import "GPUImageHSBFilter.h"
    #import "GPUImageHueFilter.h"                   //色度
    #import "GPUImageGlassSphereFilter.h"           //水晶球效果
    #import "GPUImageLookupFilter.h"                //lookup 色彩调整
    #import "GPUImageAmatorkaFilter.h"              //Amatorka lookup
    #import "GPUImageMissEtikateFilter.h"           //MissEtikate lookup
    #import "GPUImageSoftEleganceFilter.h"          //SoftElegance lookup
    #import "GPUImageAddBlendFilter.h"              //通常用于创建两个图像之间的动画变亮模糊效果
    #import "GPUImageDivideBlendFilter.h"           //通常用于创建两个图像之间的动画变暗模糊效果
    #import "GPUImagePolkaDotFilter.h"              //像素圆点花样
    #import "GPUImageLocalBinaryPatternFilter.h"    //图像黑白化,并有大量噪点
    #import "GPUImageLanczosResamplingFilter.h"     //Lanczos重取样,模糊效果
    #import "GPUImageAverageColor.h"                //像素平均色值
    #import "GPUImageSolidColorGenerator.h"         //纯色
    #import "GPUImageLuminosity.h"                  //亮度平均
    #import "GPUImageAverageLuminanceThresholdFilter.h"//像素色值亮度平均,图像黑白(有类似漫画效果)
    #import "GPUImageWhiteBalanceFilter.h"          //白平横
    #import "GPUImageChromaKeyFilter.h"             //色度键
    #import "GPUImageLowPassFilter.h"               //用于图像加亮
    #import "GPUImageHighPassFilter.h"              //图像低于某值时显示为黑
    #import "GPUImageMotionDetector.h"              //动作检测
    #import "GPUImageHalftoneFilter.h"              //点染,图像黑白化,由黑点构成原图的大致图形
    #import "GPUImageThresholdedNonMaximumSuppressionFilter.h"//与上相比,像素丢失更多
    #import "GPUImageHoughTransformLineDetector.h"  //线条检测
    #import "GPUImageParallelCoordinateLineTransformFilter.h" //平行线检测
    #import "GPUImageThresholdSketchFilter.h"       //阀值素描,形成有噪点的素描
    #import "GPUImageLineGenerator.h"               //线条
    #import "GPUImageLinearBurnBlendFilter.h"       //线性加深混合
    #import "GPUImageGaussianBlurPositionFilter.h"  //高斯模糊状态
    #import "GPUImagePixellatePositionFilter.h"     //像素化状态
    #import "GPUImageTwoInputCrossTextureSamplingFilter.h" //两个输入交叉纹理采样
    #import "GPUImagePoissonBlendFilter.h"          //泊松混合
    #import "GPUImageMotionBlurFilter.h"            //运动模糊
    #import "GPUImageZoomBlurFilter.h"              //放大模糊
    #import "GPUImageLaplacianFilter.h"             //算子
    #import "GPUImageiOSBlurFilter.h"               //iOS模糊
    #import "GPUImageLuminanceRangeFilter.h"        //亮度范围
    #import "GPUImageDirectionalNonMaximumSuppressionFilter.h"  //定向非极大值抑制
    #import "GPUImageDirectionalSobelEdgeDetectionFilter.h"     //定向边界检测
    #import "GPUImageSingleComponentGaussianBlurFilter.h"       //单个组件高斯模糊
    #import "GPUImageThreeInputFilter.h"                        //GPUImageThreeInputFilter的逻辑与GPUImageTwoInputFilter类似,增加了thirdInputFramebuffer作为第三个纹理inputImageTexture3的输入
    #import "GPUImageWeakPixelInclusionFilter.h"                //弱像素化
    

    好了,今天先学到这里。从一脸懵逼到初步了解。第一阶段先把一些基础的概念弄明白,后面再做原理分析和源码分析

    相关文章

      网友评论

          本文标题:GPUImage 学习一

          本文链接:https://www.haomeiwen.com/subject/ckljvxtx.html