Skip to content

Commit f84b8a6

Browse files
committed
poly_fractal shader
1 parent c635f19 commit f84b8a6

File tree

2 files changed

+132
-0
lines changed

2 files changed

+132
-0
lines changed
Lines changed: 112 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,112 @@
1+
// Copied from surface/frag.glsl
2+
3+
#version 330
4+
5+
uniform vec3 light_source_position;
6+
uniform float gloss;
7+
uniform float shadow;
8+
uniform float focal_distance;
9+
10+
uniform vec4 color0;
11+
uniform vec4 color1;
12+
uniform vec4 color2;
13+
uniform vec4 color3;
14+
uniform vec4 color4;
15+
16+
uniform vec2 coef0;
17+
uniform vec2 coef1;
18+
uniform vec2 coef2;
19+
uniform vec2 coef3;
20+
uniform vec2 coef4;
21+
uniform vec2 coef5;
22+
23+
uniform vec2 root0;
24+
uniform vec2 root1;
25+
uniform vec2 root2;
26+
uniform vec2 root3;
27+
uniform vec2 root4;
28+
29+
uniform float n_roots;
30+
uniform float n_steps;
31+
32+
uniform vec2 frame_shape;
33+
34+
in vec3 xyz_coords;
35+
36+
out vec4 frag_color;
37+
38+
#INSERT finalize_color.glsl
39+
40+
vec2 complex_mult(vec2 z, vec2 w){
41+
return vec2(z.x * w.x - z.y * w.y, z.x * w.y + z.y * w.x);
42+
}
43+
44+
vec2 complex_div(vec2 z, vec2 w){
45+
float w_norm_squared = w.x * w.x + w.y * w.y;
46+
return complex_mult(z, vec2(w.x, -w.y)) / w_norm_squared;
47+
}
48+
49+
vec2 complex_pow(vec2 z, int n){
50+
vec2 result = vec2(1.0, 0.0);
51+
for(int i = 0; i < n; i++){
52+
result = complex_mult(result, z);
53+
}
54+
return result;
55+
}
56+
57+
vec2 poly(vec2 z, vec2[6] coefs){
58+
vec2 result = vec2(0.0);
59+
for(int n = 0; n < 6; n++){
60+
result += complex_mult(coefs[n], complex_pow(z, n));
61+
}
62+
return result;
63+
}
64+
65+
vec2 dpoly(vec2 z, vec2[6] coefs){
66+
vec2 result = vec2(0.0);
67+
for(int n = 1; n < 6; n++){
68+
result += n * complex_mult(coefs[n], complex_pow(z, n - 1));
69+
}
70+
return result;
71+
}
72+
73+
vec2 seek_root(vec2 z, vec2[6] coefs){
74+
for(int i = 0; i < int(n_steps); i++){
75+
vec2 step = complex_div(poly(z, coefs), dpoly(z, coefs));
76+
if(length(step) < 1e-2){
77+
break;
78+
}
79+
z = z - step;
80+
}
81+
82+
return z;
83+
}
84+
85+
86+
void main() {
87+
vec2[6] coefs = vec2[6](coef0, coef1, coef2, coef3, coef4, coef5);
88+
vec2[5] roots = vec2[5](root0, root1, root2, root3, root4);
89+
vec4[5] colors = vec4[5](color0, color1, color2, color3, color4);
90+
91+
vec2 z = xyz_coords.xy;
92+
vec2 found_root = seek_root(z, coefs);
93+
94+
vec4 color = vec4(0.0);
95+
float curr_min = 1e10;
96+
for(int i = 0; i < 5; i++){
97+
float dist = distance(roots[i], found_root);
98+
if(dist < curr_min){
99+
curr_min = dist;
100+
color = colors[i];
101+
}
102+
}
103+
104+
frag_color = finalize_color(
105+
color,
106+
xyz_coords,
107+
vec3(0.0, 0.0, 1.0),
108+
light_source_position,
109+
gloss,
110+
shadow
111+
);
112+
}
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
// Copied from surface/vert.glsl
2+
3+
#version 330
4+
5+
#INSERT camera_uniform_declarations.glsl
6+
7+
in vec3 point;
8+
out vec3 xyz_coords;
9+
10+
uniform float scale_factor;
11+
uniform vec3 offset;
12+
13+
#INSERT position_point_into_frame.glsl
14+
#INSERT get_gl_Position.glsl
15+
#INSERT get_rotated_surface_unit_normal_vector.glsl
16+
17+
void main(){
18+
xyz_coords = (point - offset) / scale_factor;
19+
gl_Position = get_gl_Position(position_point_into_frame(point));
20+
}

0 commit comments

Comments
 (0)