# 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) ```