Back to shaders

Shader test bench

Circle Splash Distortion.fs

vidvox-isf-files utility glsl runnable fragment MIT
Source
runnable fragment

Complete GLSL fragment shader. Stronghold runs it directly when the browser can compile it.

Code

uniform sampler2D inputImage;
uniform float radius;
uniform float streaks;
uniform vec2 center;
precision mediump float;
/*
{
  "CATEGORIES" : [
    "Distortion Effect"
  ],
  "ISFVSN" : "2",
  "INPUTS" : [
    {
      "NAME" : "inputImage",
      "TYPE" : "image"
    },
    {
      "NAME" : "radius",
      "TYPE" : "float",
      "MAX" : 0.75,
      "DEFAULT" : 0.125,
      "MIN" : 0
    },
    {
      "NAME" : "streaks",
      "TYPE" : "float",
      "MAX" : 1,
      "DEFAULT" : 0,
      "MIN" : 0
    },
    {
      "NAME" : "center",
      "TYPE" : "point2D",
      "MAX" : [
        1,
        1
      ],
      "DEFAULT" : [
        0.5,
        0.5
      ],
      "MIN" : [
        0,
        0
      ]
    }
  ],
  "CREDIT" : "by VIDVOX"
}
*/




//	Pretty simple ‚Äì¬ if we're inside the radius, draw as normal
//	If we're outside the circle grab the last color along the angle

#ifndef GL_ES
float distance (vec2 inCenter, vec2 pt)
{
	float tmp = pow(inCenter.x-pt.x,2.0)+pow(inCenter.y-pt.y,2.0);
	return pow(tmp,0.5);
}
#endif

void main() {
	vec2 uv = vec2((gl_FragCoord.xy / u_resolution.xy)[0],(gl_FragCoord.xy / u_resolution.xy)[1]);
	vec2 texSize = u_resolution;
	vec2 tc = uv * texSize;
	vec2 tc2 = uv * texSize;
	vec2 modifiedCenter = center * texSize;
	float r = distance(modifiedCenter, tc);
	float render_length = length(u_resolution);
	float a = atan ((tc.y-modifiedCenter.y),(tc.x-modifiedCenter.x));
	float radius_sized = clamp(radius * render_length, 1.0, render_length);
	
	tc -= modifiedCenter;
	tc2 -= modifiedCenter;

	if (r < radius_sized) 	{
		tc.x = r * cos(a);
		tc.y = r * sin(a);
		tc2 = tc;
	}
	else	{
		tc.x = radius_sized * cos(a);
		tc.y = radius_sized * sin(a);
		tc2.x = (radius_sized + streaks * render_length) * cos(a);
		tc2.y = (radius_sized + streaks * render_length) * sin(a); 
	}
	tc += modifiedCenter;
	tc2 += modifiedCenter;
	vec2 loc = tc / texSize;

	if ((loc.x < 0.0)||(loc.y < 0.0)||(loc.x > 1.0)||(loc.y > 1.0))	{
		gl_FragColor = vec4(0.0);
	}
	else	{
		vec4 result = texture2D(inputImage, loc);
		if (streaks > 0.0)	{
			vec2 loc2 = tc2 / texSize;
			vec4 mixColor = texture2D(inputImage, loc2);
			result = mix(result, mixColor, clamp(2.0*((r - radius_sized)/(render_length))*streaks,0.0,1.0));
		}
		gl_FragColor = result;
	}
}