美文网首页Unity Shader分享
Shader特效——实现“羽化”(转)

Shader特效——实现“羽化”(转)

作者: 树上的cat_ee3c | 来源:发表于2017-10-16 08:37 被阅读39次

    转自:http://blog.csdn.net/panda1234lee/article/details/52199296

    在PHOTOSHOP里,羽化就是使你选定范围的图边缘达到朦胧的效果。

    羽化值越大,朦胧范围越宽,羽化值越小,朦胧范围越窄。可根据你想留下图的大小来调节。

    算法分析:

    1、通过对rgb值增加额外的V值实现朦胧效果

    2、通过控制V值的大小实现范围控制。

    3、V = 255 * 当前点Point距中点距离的平方s1 / (顶点距中点的距离平方 *mSize)s2;

    4、s1 有根据 ratio 修正 dx dy值。

    原图:

    效果图:

    片元着色器代码:

    [cpp]view plaincopy

    uniform sampler2D Tex;

    constfloatsize = 0.5;

    voidmain(void)

    {

    vec2 realSize = vec2(textureSize(Tex, 0));

    floatratio = (realSize.x > realSize.y) ?

    realSize.y/realSize.x : realSize.x/realSize.y;

    vec2 texSize = vec2(512., 512.);

    vec2 xy = gl_FragCoord.xy;

    if(realSize.x > realSize.y)

    {

    xy.x = xy.x * ratio;

    }

    else

    {

    xy.y = xy.y * ratio;

    }

    vec2 center = vec2(texSize/2.);

    // ----------------------------------------------------

    floatmaxV = dot(center, center);

    floatminV = floor(maxV*(1. - size));

    floatdiff = maxV - minV;

    vec2 uv = xy / texSize;

    vec4 srcColor = texture2D(Tex, uv);

    floatdx = center.x - xy.x;

    floatdy = center.y - xy.y;

    floatdstSq = pow(dx, 2.) + pow(dy, 2.);

    floatv = (dstSq / diff);

    floatr = clamp(srcColor.r + v, 0., 1.);

    floatg = clamp(srcColor.g + v, 0., 1.);

    floatb = clamp(srcColor.b + v, 0., 1.);

    gl_FragColor = vec4( r, g, b, 1.0 );

    }

    相关文章

      网友评论

        本文标题:Shader特效——实现“羽化”(转)

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