美文网首页多媒体科技
OpenGLES滤镜开发汇总 —— 景深特效

OpenGLES滤镜开发汇总 —— 景深特效

作者: cain_huang | 来源:发表于2018-09-09 13:32 被阅读10次

什么是景深

景深的原理

景深的实现

完整的glsl代码实现如下:

precision highp float;
varying vec2 textureCoordinate;
uniform sampler2D inputTexture;         // 输入纹理
uniform sampler2D blurImageTexture;     // 经过高斯模糊处理的纹理
uniform float inner;    // 内圆半径
uniform float outer;    // 外圆半径
uniform float width;    // 纹理宽度
uniform float height;   // 纹理高度
uniform vec2 center;    // 中心点的位置
uniform vec3 line1;     // 前景深
uniform vec3 line2;     // 后景深
uniform float intensity;// 景深程度

void main() {
    vec4 originalColor = texture2D(inputTexture, textureCoordinate);
    vec4 tempColor;
    float ratio = height / width;
    vec2 ellipse = vec2(1, ratio * ratio);
    float fx = (textureCoordinate.x - center.x);
    float fy = (textureCoordinate.y - center.y);
    // 用椭圆方程求离中心点的距离
    float dist = sqrt(fx * fx * ellipse.x + fy * fy * ellipse.y);
    // 如果小于内圆半径,则直接输出原图,否则拿原始纹理跟高斯模糊的纹理按照不同的半径进行alpha混合
    if (dist < inner) {
        tempColor = originalColor;
    } else {
        vec3 point = vec3(textureCoordinate.x, textureCoordinate.y, 1.0);
        float value1 = dot(line1, point);
        float value2 = dot(line2, point);
        if (value1 >= 0.0 && value2 >= 0.0) {
            tempColor = originalColor;
        } else {
            vec4 blurColor = texture2D(blurImageTexture, textureCoordinate);
            float lineAlpha = max(-value1 / 0.15, -value2 / 0.15);
            float alpha = (dist - inner)/outer;
            alpha = min(lineAlpha, alpha);
            alpha = clamp(alpha, 0.0, 1.0);
            tempColor = mix(originalColor, blurColor, alpha);
        }
    }
    gl_FragColor = mix(originalColor, tempColor, intensity);
}

景深的效果如下:


景深效果

详细实现过程,可以参考本人的开源相机项目:
CainCamera
CainCamera的FilterLibrary中有景深效果的实现。

相关文章

网友评论

    本文标题:OpenGLES滤镜开发汇总 —— 景深特效

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