Spin bluuuur shader

When something spins fast, it blurs. It has to otherwise it looks as if it’s rotating by arbitrary angles. Originally I had this effect done by rendering the same image multiple times, each time slightly rotated and more transparently than the previous time. Yesterday I tried doing it the GLSL way, which looks way better (and is faster). Here’s the result:

SpinBlur

And here’s the shader:

uniform float angle;
#define NUM_ROTATIONS 30

vec4 effect( vec4 color, Image texture, vec2 texture_coords, vec2 screen_coords )
{ 
    vec2 center = vec2( 0.5, 0.5 );
    vec2 relPos = texture_coords - center;
    vec4 finalColor = vec4( 0.0, 0.0, 0.0, 0.0 );
 
    float progression = 0.0;
 
    for( int i=0; i<NUM_ROTATIONS; i++ )
    {
        float angleFract = - angle*float(i)/float(NUM_ROTATIONS);
        float cs = cos( angleFract );
        float sn = sin( angleFract );
        
        vec2 newPos = vec2( relPos.x*cs - relPos.y*sn, relPos.x*sn + relPos.y*cs );
        newPos += center;
 
        vec4 tex = texture2D( texture, newPos );
        float rate = pow(float(i),1.2) * (tex.a +0.4);
        progression = progression + rate;
        finalColor += tex * rate;
    }
 
    return finalColor/progression;
}

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s