美文网首页
OpenGLES9-图滤镜处理

OpenGLES9-图滤镜处理

作者: AlanGe | 来源:发表于2020-07-01 09:29 被阅读0次

    滤镜处理

    ●GPUlmage
    ●Corelmage
    ●OpenGL ES
    

    技能

    *利用OpenGL片元着色器实现图片滤镜处理
    *多个片元着色器组合使用


    ●同一个顶点着色器调用2次,但不需要创建2个顶点着色器文件
    ●为什么要用2次片元?
    滤镜组合(饱和度和色温处理)
    饱和度/色温是2个片元着色器来处理!


    处理分为2个部分:色温处理,饱和度处理

    顶点着色器

    //图片的坐标位置(单个顶点)
    attribute vec4 position;
    //纹理坐标位置
    attribute vec2 inputTextureCoordinate;
    //将纹理坐标通过varying传递到片元着色器(饱和度/色温片元着色器)
    varying 1owp vec2 textureCoordinate;
    void main(void) {
        //值的传递
        textureCoordinate = inputTextureCoordinate;
        //赋值
        gl_Position = position;
    }
    

    饱和度片元着色器

    // 纹理坐标
    varying lowp vec2 textureCoordinate;
    // 纹理
    uniform sampler2D inputImageTexture;
    // 色温值
    uniform lowp float saturation;
    // 色温过滤器
    const lowp vec3 warmFilter = vec3(0.93, 0.54, 0.0);
    //RGB转IQ
    const mediump mat3 RGBtoYIQ = mat3(0.299, 0.587, 0.114, 0.596, -0.274, -0.322, 0.212, -0.523, 0.311);
    //YIQ转ÈRGB
    const mediump mat3 YIQtoRGB = mat3(1.0, 0.956, 0.621, 1.0, -0.272,-0.647, 1.0, -1.105, 1.702);
    //亮度加权
    const mediump vec3 luminanceWeighting = vec3(0.2125, 0.7154, 0.0721);
    void main()
        //为了读取纹理中每个像素点的原始颜色值
        /*
        texture2D(参数1,参数2)
        参数1:纹理对象
        参数2:纹理坐标
        */
        lowp vec4 source = texture2D input ImageTexture, textureCoordinate)
        //dot(v1,v2)向量点乘
        //亮度=RGB值*亮度加权
        lowp float luminance = dot(source.rgb, luminanceWeighting);
        //将亮度标量转化为vec3向量
        lowp vec3 greyScaleColor = vec3(luminance,e,e);
        /*
        mix函数:颜色与颜色混合/颜色与纹理混合/纹理与纹理混合
        mix(x,y,a);
        通过线性混合a --> 通过线性方程式混合
        x.(1-a)+y.a --> vec3向量颜色
        vec4(vec3, w); -->vec4向量
        */
        gl_ FragColor = vec4(mix(greyScaleColor, source.rgb, saturation),source.w);
    }
    

    色温片元着色器

    // 纹理坐标
    varying lowp vec2 textureCoordinate;
    // 纹理
    uniform sampler2D inputImageTexture;
    //色温
    uniform lowp float temperature;
    //色温过滤
    const lowp vec3 warmFilter = vec3(0.93, 0.54, 0.0);
    //RGBtoYIQ
    const mediump mat3 RGBtoYIQ = mat3(0.299, 0.587, 0.114, 0.596, -0.274, -0.322, 0.212, -0.523, 0.311);
    //YIQtoRGB
    const mediump mat3 YIQtoRGB = mat3(1.0, 0.956, 0.621, 1.0, -0.272, -0.647, 1.Ø, -1.105, 1.702);
    //亮度加权
    const mediump vec3 luminanceWeighting = vec3(0.2125, 0.7154, 0.0721)
    void main() {
        //为了读取纹理中每个像素点的原始颜色值
        /*
        texture2D(参数1,参数2)
        参数1:纹理对象
        参数2:纹理坐标
        */
        1owp vec4 source = texture2D( inputImageTexture, textureCoordinate);
        //将源颜色RGB转化为YIQ颜色
        mediump vec3 yiq = RGBtoYIQ * source.rgb;
        /*
        c1amp(x, minVal, maxVal);
        1.首先获取x和minVal之间较大的值
        2.再拿起与maxVa1比较
        3.最后获取比较后较小的值
        vec3(r,g, b)
        rec3(x,y,z)
        yiq.b (b指的是第3个元素.)
        */
        yiq.b = clamp(yiq.b, -0. 5226, 0.5226);
        //将yiq转化rgb值
        lowp vec3 rgb = YIQtoRGB * yiq;
        /*
        色温公式:
        warmR:色温过滤器- -warmFilter
        if r<0.5 -->2. 0*r*warmR;
        if r>= 0.5-->1. 0-2.0*(1.0-r)*(1.0-warmR);
        */
        lowp float A = (rgb.r < 0.5 ? (2.0 * rgb.r * warmFilter.r) : (1.0 - 2.0* (1.0- rgb.r) * (1.0 - warmFilter .r)));
        lowp float B = (rgb.g < 0.5 ? (2.0 * rgb.g * warmFilter.g) : (1.0 - 2.0 * (1.0 - rgb.g) * (1.0 - warmFilter .g)));
        lowp float C = (rgb.b < 0.5 ? (2.0 * rgb.b * warmFilter.b) : (1.0 - 2.0 * (1.0 - rgb.b) * (1.0 - warmFilter.b)));
        //将过滤完ABC(RGB )颜色转化成vec3向量
        lowp vec3 processed = vec3(A,B,C);
        /*
        mix函数:颜色与颜色混合/颜色与纹理混合/纹理与纹理混合
        mix(x,y,a);
        通过线性混合a --> 通过线性方程式混合
        x.(1-a)+y.a --> vec3向量颜色
        vec4(vec3, w);-->vec4向量
        */
        gl_ FragColor = vec4(mix(rgb, processed, temperature), source.a);
    }
    

    Demo: 12-多滤镜处理

    相关文章

      网友评论

          本文标题:OpenGLES9-图滤镜处理

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