/rumbo/mandelbrot/ mandelbrot función potencial n-ciclos bonus
xxxxxxxxxx
1
// Author: Sol Sarratea// Title: Conjunto de Mandelbrot
2
precision mediump float;
3
4
uniform float u_time;
5
uniform vec2 u_resolution;
6
uniform vec2 u_mouse;
7
// Multilicacion de vectores : 
8
// sean a,b vectores de 2 componentes se los puede pensar como numeros complejos. Luego:
9
// a = ax + ay i, donde `ax` es la parte real y `ay` la parte imaginaria
10
// b = bx + by i, donde `bx` es la parte real y `by` la parte imaginaria
11
12
// La multiplicacion queda definida como : 
13
// a * b = (ax * bx - ay * bx) + ( ax * by + ay * bx ) i          
14
15
vec2 multC(vec2 a, vec2 b){
16
    float re = a.x*b.x - a.y*b.y;
17
    float im = a.x*b.y + a.y*b.x;
18
    return vec2(re,im);
19
}
20
21
vec2 uv(){
22
    /* Devuelve las posiciones del canvas en rango [-1.,1.]x[-1.,1.] */
23
    vec2 pos = gl_FragCoord.xy/u_resolution;
24
    pos = pos *2.-1.;
25
    return pos;
26
}
27
28
29
void main() {
30
    vec3 color;
31
    vec2 pos = uv() *1. - vec2(0.5,0.);
32
33
    // Descomentar las lineas 25 y 26
34
    // para explorar la frontera
35
    // pos.x -= 14600. + u_mouse.x*0.1;
36
    // pos *= .0001;
37
38
    float dist = 0.;
39
    const int max_pasos =100;
40
41
    // zn inicia en 0 para todas las pocisiones
42
    vec2 zn = vec2(0);
43
    
44
    // En el ciclo se actualiza zn por  zn ^ 2 + pos ;
45
    for (int i = 0; i < max_pasos; i++) {
46
        zn = multC(zn,zn) + pos;
47
48
        float magnitud = length(zn);
49
        if ( magnitud > 400.) break;
50
51
        dist += 2.056/float(max_pasos);
52
    }
53
54
    // Coloreamos con un gradiente negro-blanco que tan cerca estoy del conjunto
55
    color += dist;
56
    
57
    gl_FragColor = vec4(color,1.);
58
59
}
60
61
62