Basic, unoptimized Mandelbrot.
Log in to post a comment.
#version 300 es
precision highp float;
uniform float iTime;
uniform float iLoop;
uniform vec2 iResolution;
out vec4 fragColor;
uniform float m_scale; // value=30, min = 0.001, max = 50, step = 0.001
uniform float offset_x; // value = 1.763, min = -2, max = 2, step = 0.0001
uniform float offset_y; // value = 0, min = -2, max = 2, step = 0.0001
uniform float max_iterations; // value=60, min=1, max=1000, step=1
float mandelbrot(vec2 pos)
{
vec2 c = pos;
vec2 z = vec2(0.);
float iterations = 0.;
while (z.x * z.x + z.y * z.y < 4.)
{
z = vec2(z.x * z.x - z.y * z.y + c.x, 2. * z.x * z.y + c.y);
iterations++;
if (iterations >= max_iterations) break;
}
return iterations + 1. - log(log2(length(z)));
//return iterations;
}
vec3 HSVtoRGB(float h, float s, float v)
{
float r, g, b, f, p, q, t;
int i;
i = int(h * 6.);
f = h * 6. - float(i);
p = v * (1. - s);
q = v * (1. - f * s);
t = v * (1. - (1. - f) * s);
switch (i % 6)
{
case 0: r = v, g = t, b = p; break;
case 1: r = q, g = v, b = p; break;
case 2: r = p, g = v, b = t; break;
case 3: r = p, g = q, b = v; break;
case 4: r = t, g = p, b = v; break;
case 5: r = v, g = p, b = q; break;
}
return vec3(r, g, b);
}
void main() {
// Screen coordinate (from [-aspect, -1] to [aspect, 1])
vec2 pos = (2. * gl_FragCoord.xy - iResolution) / iResolution.y;
float m_scale2 = m_scale * ((cos(iLoop*6.283185) + 1.) * 0.5) + 0.5;
vec2 m = vec2(pos.x / m_scale2 - offset_x, pos.y / m_scale2 - offset_y);
float iterations = mandelbrot(m);
float value = 1. - iterations / max_iterations;
value *= value;
float h = value;
float s = 1.;
float v = (iterations < max_iterations) ? 1. - value*value : 0.;
vec3 col = HSVtoRGB(h, s, v);
fragColor = vec4(col, 1.);
}