Back to shaders
Shader test bench
Shockwave.fs
runnable fragment
Complete GLSL fragment shader. Stronghold runs it directly when the browser can compile it.
Code
uniform sampler2D inputImage;
uniform float positionVal;
uniform float distortion;
uniform float magnitude;
uniform vec2 center;
uniform int background;
precision mediump float;
/*{
"DESCRIPTION": "",
"CREDIT": "by VIDVOX",
"CATEGORIES": [
"Distortion Effect"
],
"INPUTS": [
{
"NAME": "inputImage",
"TYPE": "image"
},
{
"NAME": "positionVal",
"TYPE": "float",
"MIN": 0,
"MAX": 1,
"DEFAULT": 0
},
{
"NAME": "distortion",
"TYPE": "float",
"MIN": 1,
"MAX": 20,
"DEFAULT": 10
},
{
"NAME": "magnitude",
"TYPE": "float",
"MIN": 0,
"MAX": 0.2,
"DEFAULT": 0.08
},
{
"NAME" : "center",
"TYPE" : "point2D",
"MAX" : [
1,
1
],
"DEFAULT" : [
0.5,
0.5
],
"MIN" : [
0,
0
]
},
{
"NAME": "background",
"TYPE": "bool",
"DEFAULT": 1
}
]
}*/
void main()
{
// do this junk so that the ripple starts from nothing
vec2 uv = (gl_FragCoord.xy / u_resolution.xy).xy;
vec2 texCoord = uv;
vec2 mod_center = center;
vec4 color = vec4(0.0);
float dist = distance(uv, mod_center);
float adjustedTime = (positionVal * u_resolution.x/u_resolution.y - magnitude)/(1.0 - magnitude);
if ( (dist <= (adjustedTime + magnitude)) && (dist >= (adjustedTime - magnitude)) ) {
float diff = (dist - adjustedTime);
float powDiff = 1.0 - pow(abs(diff*distortion),
0.8);
float diffTime = diff * powDiff;
vec2 diffUV = normalize(uv - mod_center);
texCoord = uv + (diffUV * diffTime);
color = texture2D(inputImage, texCoord);
}
else if (background) {
color = texture2D(inputImage, texCoord);
}
gl_FragColor = color;
}