转自: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 );
}
网友评论