/*{
"CATEGORIES": [
"Stylize",
"Feedback",
"Color Effect"
],
"CREDIT": "by VIDVOX",
"DESCRIPTION": "",
"INPUTS": [
{
"NAME": "inputImage",
"TYPE": "image"
},
{
"DEFAULT": -0.5,
"LABEL": "Bias",
"MAX": 0,
"MIN": -1,
"NAME": "uBias",
"TYPE": "float"
},
{
"DEFAULT": 0.5,
"LABEL": "Scale",
"MAX": 2,
"MIN": 0,
"NAME": "uScale",
"TYPE": "float"
},
{
"DEFAULT": 5,
"LABEL": "Ghosts",
"MAX": 5,
"MIN": 0,
"NAME": "uGhosts",
"TYPE": "float"
},
{
"DEFAULT": 0.0125,
"LABEL": "Ghost Dispersal",
"MAX": 0.1,
"MIN": 0,
"NAME": "uGhostDispersal",
"TYPE": "float"
},
{
"DEFAULT": 1,
"LABEL": "Additive Mode",
"NAME": "uAdditive",
"TYPE": "bool"
},
{
"DEFAULT": [
0.5,
0.5
],
"LABEL": "Direction",
"MAX": [
1,
1
],
"MIN": [
0,
0
],
"NAME": "uDirection",
"TYPE": "point2D"
},
{
"DEFAULT": [
0.9,
0.8,
0.7,
1
],
"LABEL": "Lens Color",
"NAME": "uLensColor",
"TYPE": "color"
}
],
"ISFVSN": "2",
"PASSES": [
{
"DESCRIPTION": "Downsample and threshold",
"HEIGHT": "floor($HEIGHT/1.0)",
"TARGET": "downsampleAndThresholdImage",
"WIDTH": "floor($WIDTH/1.0)"
},
{
}
]
}
*/
void main()
{
if (PASSINDEX == 0) {
vec2 loc = isf_FragNormCoord;
gl_FragColor = max(vec4(0.0), IMG_NORM_PIXEL(inputImage,loc) + uBias) * uScale;
}
else if (PASSINDEX == 1) {
vec2 texcoord = isf_FragNormCoord;
vec2 texelSize = 1.0 / RENDERSIZE;
vec2 direction = vec2(1.0) - uDirection;
vec2 ghostVec = (direction - texcoord) * uGhostDispersal;
//vec2 direction = vec2(0.5,0.5);
vec4 result = vec4(0.0);
for (int i = 0; i < 5; ++i) {
if (float(i)>uGhosts)
break;
vec2 offset = fract(texcoord + ghostVec * float(i));
result += IMG_NORM_PIXEL(downsampleAndThresholdImage, offset) * uLensColor;
}
// apply the alpha
result.rgb = result.rgb * uLensColor.a;
if (uAdditive) {
result = result + IMG_NORM_PIXEL(inputImage, texcoord);
}
else {
result = result * IMG_NORM_PIXEL(inputImage, texcoord);
}
gl_FragColor = result;
}
}