1. 程式人生 > >opengl相機通過shader修改片斷著色器來實現換色,改色,膚色檢測等特殊效果

opengl相機通過shader修改片斷著色器來實現換色,改色,膚色檢測等特殊效果

1.嘴脣檢測並改掉色,不準確時可能和相同有關,關於嘴脣顏色檢測參考文章

https://blog.csdn.net/Trent1985/article/details/46330847

 private static final String CAMERA_INPUT_FRAGMENT_SHADER_OES = "" +
            "#extension GL_OES_EGL_image_external : require\n" +
            "\n" +
            "precision mediump float;\n" +
            "varying vec2 textureCoordinate;\n" +
            "uniform samplerExternalOES inputImageTexture;\n" +
            "\n" +
            "void main()\n" +
            "{\n" +
            "    vec4 nColor=texture2D(inputImageTexture, textureCoordinate);\n"+
            "    if (log(nColor.g / (pow(nColor.b, 0.391) * pow(nColor.r, 0.609))) < -0.4)\n"+
            "    {\n"+
            "         gl_FragColor = vec4(1.0, 1.0, 1.0, nColor.a);\n"+
            "    }\n"+
            "    else\n"+
            "    {\n" +
            "         gl_FragColor = nColor;\n"+
            "    }\n"+
            "}";

2.計算高斯模糊
precision mediump float;

//在片元著色器這裡新增這個 sampler2D 表示我們要新增2D貼圖
uniform sampler2D u_TextureUnit;

varying vec2 v_TextureCoordinates;

void main(){
    vec4 color = vec4(0.0);
    int coreSize=3;
    int halfSize=coreSize/2;
    float texelOffset = 0.01;
    //建立我們計算好的卷積核
    float kernel[9];
    kernel[6] = 1.0; kernel[7] = 2.0; kernel[8] = 1.0;
    kernel[3] = 2.0; kernel[4] = 4.0; kernel[5] = 2.0;
    kernel[0] = 1.0; kernel[1] = 2.0; kernel[2] = 1.0;
    int index = 0;
    //每一塊都進行影象卷積。
    for(int y=0;y<coreSize;y++)
    {
        for(int x = 0;x<coreSize;x++)
        {
            vec4 currentColor = texture2D(u_TextureUnit,v_TextureCoordinates+vec2(float((-1+x))*texelOffset,float((-1+y))*texelOffset));
            color += currentColor*kernel[index];
            index++;
        }
    }
    //歸一處理
    color/=16.0;

    gl_FragColor=color;
}

3黑白濾鏡

precision mediump float;

//在片元著色器這裡新增這個 sampler2D 表示我們要新增2D貼圖
uniform sampler2D u_TextureUnit;
//定義一個u_ChangeColor,因為顏色的變數是RGB,所以使用vec3
uniform vec3 u_ChangeColor;

varying vec2 v_TextureCoordinates;

void main(){
    //得到2d color
    vec4 nColor=texture2D(u_TextureUnit,v_TextureCoordinates);
   //黑白圖片
    float c= nColor.r*u_ChangeColor.r+nColor.g*u_ChangeColor.g+nColor.b*u_ChangeColor.b;
    gl_FragColor = vec4(c,c,c,nColor.a);
}
4冷暖色調的處理
與上面的黑白色的處理相似,冷色調的處理就是單一增加藍色通道的值,暖色調的處理可以增加紅綠通道的值。

 precision mediump float;

//在片元著色器這裡新增這個 sampler2D 表示我們要新增2D貼圖
uniform sampler2D u_TextureUnit;
//定義一個u_ChangeColor,因為顏色的變數是RGB,所以使用vec3
uniform vec3 u_ChangeColor;
varying vec2 v_TextureCoordinates;

//modifyColor.將color限制在rgb
void modifyColor(vec4 color){
    color.r=max(min(color.r,1.0),0.0);
    color.g=max(min(color.g,1.0),0.0);
    color.b=max(min(color.b,1.0),0.0);
    color.a=max(min(color.a,1.0),0.0);
}

void main(){
    //得到2d color
    vec4 nColor=texture2D(u_TextureUnit,v_TextureCoordinates);
    //簡單色彩處理,冷暖色調、增加亮度、降低亮度等
        vec4 deltaColor=nColor+vec4(u_ChangeColor,0.0);
        modifyColor(deltaColor);
        gl_FragColor=deltaColor;
}

5改色

"vec4 nColor=texture2D(inputImageTexture, textureCoordinate);\n"+
            "if (nColor.r<0.5 && nColor.g<0.5 && nColor.b<0.5)" +
            "{\n"+
            "    gl_FragColor = vec4(1.0,1.0,1.0,nColor.a);\n" +
            "}\n" +
            "else\n" +
            "{\n"+
            "    gl_FragColor = texture2D(inputImageTexture, textureCoordinate);\n" +
            "}\n"+

 

 

參考:

https://blog.csdn.net/qq_33275597/article/details/80869913

https://blog.csdn.net/qq_33275597/article/details/80869913 

https://www.jianshu.com/p/320980800358
光照
https://blog.csdn.net/yulinxx/article/details/72720963
https://blog.csdn.net/yulinxx/article/details/53670481

https://cloud.tencent.com/developer/article/1155487

海洋

https://blog.csdn.net/vily_lei/article/details/80919052

 

相機

https://cloud.tencent.com/developer/article/1175711

相機特效

https://cloud.tencent.com/developer/article/1185194

美顏濾波

https://blog.csdn.net/King1425/article/details/77776931?locationNum=4&fps=1