From 33fa76dfac36e70bb5fad69dc6a336800c6dacce Mon Sep 17 00:00:00 2001 From: Grant Sanderson Date: Mon, 11 Oct 2021 06:21:47 -0700 Subject: [PATCH] Add more fractals and decompose slightly --- .../shaders/inserts/complex_functions.glsl | 15 ++++ manimlib/shaders/mandelbrot_fractal/frag.glsl | 77 +++++++++++++++++++ manimlib/shaders/mandelbrot_fractal/vert.glsl | 17 ++++ manimlib/shaders/meta_poly_fractal/frag.glsl | 17 +--- manimlib/shaders/poly_fractal/frag.glsl | 21 ++--- 5 files changed, 116 insertions(+), 31 deletions(-) create mode 100644 manimlib/shaders/inserts/complex_functions.glsl create mode 100644 manimlib/shaders/mandelbrot_fractal/frag.glsl create mode 100644 manimlib/shaders/mandelbrot_fractal/vert.glsl diff --git a/manimlib/shaders/inserts/complex_functions.glsl b/manimlib/shaders/inserts/complex_functions.glsl new file mode 100644 index 00000000..0d9a0ec1 --- /dev/null +++ b/manimlib/shaders/inserts/complex_functions.glsl @@ -0,0 +1,15 @@ +vec2 complex_mult(vec2 z, vec2 w){ + return vec2(z.x * w.x - z.y * w.y, z.x * w.y + z.y * w.x); +} + +vec2 complex_div(vec2 z, vec2 w){ + return complex_mult(z, vec2(w.x, -w.y)) / (w.x * w.x + w.y * w.y); +} + +vec2 complex_pow(vec2 z, int n){ + vec2 result = vec2(1.0, 0.0); + for(int i = 0; i < n; i++){ + result = complex_mult(result, z); + } + return result; +} \ No newline at end of file diff --git a/manimlib/shaders/mandelbrot_fractal/frag.glsl b/manimlib/shaders/mandelbrot_fractal/frag.glsl new file mode 100644 index 00000000..7d7e593f --- /dev/null +++ b/manimlib/shaders/mandelbrot_fractal/frag.glsl @@ -0,0 +1,77 @@ +#version 330 + +uniform vec3 light_source_position; +uniform float gloss; +uniform float shadow; +uniform float focal_distance; + +uniform vec2 parameter; +uniform float opacity; +uniform float n_steps; +uniform float mandelbrot; + +uniform vec3 color0; +uniform vec3 color1; +uniform vec3 color2; +uniform vec3 color3; +uniform vec3 color4; +uniform vec3 color5; +uniform vec3 color6; +uniform vec3 color7; +uniform vec3 color8; + +uniform vec2 frame_shape; + +in vec3 xyz_coords; + +out vec4 frag_color; + +#INSERT finalize_color.glsl +#INSERT complex_functions.glsl + +const int MAX_DEGREE = 5; + +void main() { + vec3 color_map[9] = vec3[9]( + color0, color1, color2, color3, + color4, color5, color6, color7, color8 + ); + vec3 color; + + vec2 z; + vec2 c; + + if(bool(mandelbrot)){ + c = xyz_coords.xy; + z = vec2(0.0, 0.0); + }else{ + c = parameter; + z = xyz_coords.xy; + } + + float outer_bound = 2.0; + bool stable = true; + for(int n = 0; n < int(n_steps); n++){ + z = complex_mult(z, z) + c; + if(length(z) > outer_bound){ + float float_n = float(n); + float_n += log(outer_bound) / log(length(z)); + float_n += 0.5 * length(c); + color = float_to_color(sqrt(float_n), 1.5, 8.0, color_map); + stable = false; + break; + } + } + if(stable){ + color = vec3(0.0, 0.0, 0.0); + } + + frag_color = finalize_color( + vec4(color, opacity), + xyz_coords, + vec3(0.0, 0.0, 1.0), + light_source_position, + gloss, + shadow + ); + } \ No newline at end of file diff --git a/manimlib/shaders/mandelbrot_fractal/vert.glsl b/manimlib/shaders/mandelbrot_fractal/vert.glsl new file mode 100644 index 00000000..dbbb87f2 --- /dev/null +++ b/manimlib/shaders/mandelbrot_fractal/vert.glsl @@ -0,0 +1,17 @@ +#version 330 + +#INSERT camera_uniform_declarations.glsl + +in vec3 point; +out vec3 xyz_coords; + +uniform float scale_factor; +uniform vec3 offset; + +#INSERT position_point_into_frame.glsl +#INSERT get_gl_Position.glsl + +void main(){ + xyz_coords = (point - offset) / scale_factor; + gl_Position = get_gl_Position(position_point_into_frame(point)); +} \ No newline at end of file diff --git a/manimlib/shaders/meta_poly_fractal/frag.glsl b/manimlib/shaders/meta_poly_fractal/frag.glsl index b55abe12..63d51bbd 100644 --- a/manimlib/shaders/meta_poly_fractal/frag.glsl +++ b/manimlib/shaders/meta_poly_fractal/frag.glsl @@ -31,25 +31,10 @@ in vec3 xyz_coords; out vec4 frag_color; #INSERT finalize_color.glsl +#INSERT complex_functions.glsl const int MAX_DEGREE = 3; -vec2 complex_mult(vec2 z, vec2 w){ - return vec2(z.x * w.x - z.y * w.y, z.x * w.y + z.y * w.x); -} - -vec2 complex_div(vec2 z, vec2 w){ - return complex_mult(z, vec2(w.x, -w.y)) / (w.x * w.x + w.y * w.y); -} - -vec2 complex_pow(vec2 z, int n){ - vec2 result = vec2(1.0, 0.0); - for(int i = 0; i < n; i++){ - result = complex_mult(result, z); - } - return result; -} - vec2 poly(vec2 z, vec2[MAX_DEGREE + 1] coefs){ vec2 result = vec2(0.0); for(int n = 0; n < int(n_roots) + 1; n++){ diff --git a/manimlib/shaders/poly_fractal/frag.glsl b/manimlib/shaders/poly_fractal/frag.glsl index d0ad68c8..ce7fded3 100644 --- a/manimlib/shaders/poly_fractal/frag.glsl +++ b/manimlib/shaders/poly_fractal/frag.glsl @@ -28,6 +28,7 @@ uniform float n_roots; uniform float n_steps; uniform float julia_highlight; uniform float color_mult; +uniform float black_for_cycles; uniform vec2 frame_shape; @@ -36,24 +37,10 @@ in vec3 xyz_coords; out vec4 frag_color; #INSERT finalize_color.glsl +#INSERT complex_functions.glsl const int MAX_DEGREE = 5; -vec2 complex_mult(vec2 z, vec2 w){ - return vec2(z.x * w.x - z.y * w.y, z.x * w.y + z.y * w.x); -} - -vec2 complex_div(vec2 z, vec2 w){ - return complex_mult(z, vec2(w.x, -w.y)) / (w.x * w.x + w.y * w.y); -} - -vec2 complex_pow(vec2 z, int n){ - vec2 result = vec2(1.0, 0.0); - for(int i = 0; i < n; i++){ - result = complex_mult(result, z); - } - return result; -} vec2 poly(vec2 z, vec2[MAX_DEGREE + 1] coefs){ vec2 result = vec2(0.0); @@ -113,6 +100,10 @@ void main() { } color *= (1.0 + (color_mult - 1) * (n_iters - 5)); + if(black_for_cycles > 0.0 && min_dist > 1e-2){ + color = vec4(0.0, 0.0, 0.0, 1.0); + } + // if(julia_highlight > 0.0){ // float factor = min_dist / distance(z, found_root); // factor *= pow(2.0, n_iters);