首页 热点专区 小学知识 中学知识 出国留学 考研考公
您的当前位置:首页正文

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

2024-12-06 来源:要发发知识网

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

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

算法分析:

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

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

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

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

原图:

效果图:

片元着色器代码:

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 );

}

显示全文