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(240, 240, 240)
	mx, my = wnd.mouse_delta
	x -= mx / 100
	y -= my / 100

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