void mainImage( out vec4 fragColor, in vec2 fragCoord )
{
// Set up coordinates
vec2 uv = fragCoord.xy / iResolution.xy;
vec2 coord = uv * 2.0 - 1.0;

// Set up moire pattern
float moire = 0.001;
float t = iTime / 20.0;
vec2 c = vec2(0.5, 0.5);
for (int i = 1; i < 44; i++)
{
    c = vec2(c.x + sin(t + c.y) * 0.2, c.y + sin(t + c.x) * 0.2);
    moire += sin(length(c) * 1.0);
}
moire = moire / 3.0;

// Set up fractal geometry
float f = 0.05;
vec3 p = vec3(coord, 0.0);
for (int i = 0; i < 10; i++)
{
    f += 0.5 / length(p);
    p = abs(p) / dot(p, p) - 0.5;
}

// Set up psychedelic colors
vec3 color = vec3(0.0, 0.0, 0.0);
color += vec3(1.0, 0.5, 0.0) * sin(f * 1.0 + moire * 5.0 + t * 1.0);
color += vec3(0.0, 0.5, 1.0) * sin(f * 2.0 + moire * 10.0 + t * 2.0);
color += vec3(0.5, 1.0, 0.0) * sin(f * 3.0 + moire * 15.0 + t * 3.0);

// Set output color
fragColor = vec4(color, 1.0);
}
