Julia FractalΒΆ

julia_fractal

Julia Fractal

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
import struct

import GLWindow
import ModernGL

# Window & Context

wnd = GLWindow.create_window()
ctx = ModernGL.create_context()

vert = ctx.vertex_shader('''
    #version 330

    in vec2 vert;
    out vec2 tex;

    void main() {
        gl_Position = vec4(vert, 0.0, 1.0);
        tex = vert / 2.0 + vec2(0.5, 0.5);
    }
''')

frag = ctx.fragment_shader('''
    #version 330

    in vec2 tex;
    out vec4 color;

    uniform vec2 center;
    uniform int iter;

    void main() {
        vec2 z = vec2(5.0 * (tex.x - 0.5), 3.0 * (tex.y - 0.5));
        vec2 c = center;

        int i;
        for(i = 0; i < iter; i++) {
            vec2 v = vec2(
                (z.x * z.x - z.y * z.y) + c.x,
                (z.y * z.x + z.x * z.y) + c.y
            );
            if (dot(v, v) > 4.0) break;
            z = v;
        }

        float cm = fract((i == iter ? 0.0 : float(i)) * 10 / iter);
        color = vec4(
            fract(cm + 0.0 / 3.0),
            fract(cm + 1.0 / 3.0),
            fract(cm + 2.0 / 3.0),
            1.0
        );
    }
''')

prog = ctx.program([vert, frag])

vbo = ctx.buffer(struct.pack('8f', -1.0, -1.0, -1.0, 1.0, 1.0, -1.0, 1.0, 1.0))
vao = ctx.simple_vertex_array(prog, vbo, ['vert'])

prog.uniforms['iter'].value = 100

x, y = (0.49, 0.32)

wnd.grab_mouse(True)

while wnd.update():
    ctx.viewport = wnd.viewport
    ctx.clear(0.9, 0.9, 0.9)
    mx, my = wnd.mouse_delta
    x -= mx / 100
    y -= my / 100

    prog.uniforms['center'].value = (y, x)
    vao.render(ModernGL.TRIANGLE_STRIP)