0.00
60.0 fps

ToonBrot

Forked from "Basic Mandelbrot" by llemarie. Edge detection test

Log in to post a comment.

#version 300 es
#define PIXEL 1. / iResolution.y * 2.
precision highp float;

// Forked from "Basic Mandelbrot" by llemarie
// https://oneshader.net/shader/b46e4cd625



uniform float iTime;
uniform float iLoop;
uniform vec2  iResolution;

out vec4 fragColor;

uniform float m_scale;         // value=-1, min = -1, max = 14, step = 0.001
uniform float offset_x;        // value = 0.5, min = -2, max = 2, step = 0.0001
uniform float offset_y;        // value = 0, min = -2, max = 2, step = 0.0001
uniform float offset_x_f;        // value = 0, min = -2, max = 2, step = 0.0001
uniform float offset_y_f;        // 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;
    //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);
}

vec3 mandelImage(vec2 pos){
    float m_scale2 = pow(2., m_scale);
    
    vec2 off = vec2(offset_x, offset_y) + vec2(offset_x_f, offset_y_f) / 100.;
    vec2 m = vec2(pos.x / m_scale2 - off.x, pos.y / m_scale2 - off.y);
    float iterations = mandelbrot(m);
    float value = 1. - iterations / max_iterations;
        
    float h = iterations * 0.2;
    float s = (iterations < max_iterations) && iterations >= 2. ? 1. : 0.;
    float v = (iterations < max_iterations) ? 1. : 1.;

    vec3 col = HSVtoRGB(h, s, v);

    return col;
}

void main() {
    // Screen coordinate (from [-aspect, -1] to [aspect, 1])
    vec2 pos = (2. * gl_FragCoord.xy - iResolution) / iResolution.y;

    vec3 col = -8. * mandelImage(pos);
    col += mandelImage(pos - vec2(-PIXEL)) +
            mandelImage(pos - vec2(-PIXEL, 0)) +
            mandelImage(pos - vec2(-PIXEL, PIXEL)) +
            mandelImage(pos - vec2(0, -PIXEL)) +
            mandelImage(pos - vec2(0, PIXEL)) +
            mandelImage(pos - vec2(PIXEL, -PIXEL)) +
            mandelImage(pos - vec2(PIXEL, 0)) +
            mandelImage(pos - vec2(PIXEL));
    
    float l = 1. - (length(col) * 100.);

    fragColor = vec4(normalize(vec3(l)) * mandelImage(pos) * 2., 1.);
}