diff options
Diffstat (limited to '')
| -rw-r--r-- | justfile | 3 | ||||
| -rw-r--r-- | sketches/01/mandelbrot.frag | 55 | ||||
| -rw-r--r-- | sketches/02/newton.frag | 55 |
3 files changed, 111 insertions, 2 deletions
@@ -1,7 +1,8 @@ sketch name *args: cd sketches/{{name}} && {{args}} -s1: (sketch "01" "live-server" "--port=3000" "--no-browser" ".") +s1: (sketch "01" "glslViewer" "mandelbrot.frag") +s1_bqn: (sketch "01" "live-server" "--port=3000" "--no-browser" ".") s2: (sketch "02" "glslViewer" "newton.frag") diff --git a/sketches/01/mandelbrot.frag b/sketches/01/mandelbrot.frag new file mode 100644 index 0000000..689f2a4 --- /dev/null +++ b/sketches/01/mandelbrot.frag @@ -0,0 +1,55 @@ +varying vec4 v_position; +uniform vec2 u_resolution; +uniform float u_time; +uniform float u_mouse; + +#define MAX_ITERATIONS 100 + +vec2 cdiv(vec2 a, vec2 b) { + float r = length(b); + float theta = atan(b.y, b.x); + return vec2(cos(theta), sin(theta)) * (dot(a, b) / (r * r)); +} + +vec2 cpow(vec2 z, float n) { + float r = length(z); + float theta = atan(z.y, z.x); + return pow(r, n) * vec2(cos(n * theta), sin(n * theta)); +} + +void main() { + float time = 1.1 + mod(u_time * 1000.0, 100000.0) / 10000.0; + // float time = 4.0; + + float ratio = u_resolution.x / u_resolution.y; + vec2 pos = v_position.xy/vec2(1.0, ratio); + + vec2 c = 2.0 * (pos - vec2(0.0, 0.0)); + vec2 z = vec2(0.0, 0.0); + int i; + + vec2 prevZ = z; + for (i = 0; i < MAX_ITERATIONS; i++) { + prevZ = z; + z = cpow(z, time) + c; + + if (length(z - prevZ) > 10.0) { + break; + } + } + + if (i == MAX_ITERATIONS) { + gl_FragColor = vec4(27., 14., 50., 255.0) / 255.; + } else if (i > 5) { + gl_FragColor = vec4(97., 42., 191., 255.0) / 255.; + } else if (i > 4) { + gl_FragColor = vec4(150., 191., 69., 255.0) / 255.; + } else if (i > 3) { + gl_FragColor = vec4(230., 123., 40., 255.0) / 255.; + } else if (i > 2) { + gl_FragColor = vec4(27., 14., 50., 255.0) / 255.; + } else { + gl_FragColor = vec4(0., 0., 0., 1.); + } +} + diff --git a/sketches/02/newton.frag b/sketches/02/newton.frag index 9cbf92c..ac31d73 100644 --- a/sketches/02/newton.frag +++ b/sketches/02/newton.frag @@ -1,5 +1,58 @@ +varying vec4 v_position; +uniform vec2 u_resolution; +uniform float u_time; +uniform float u_mouse; + +#define MAX_ITERATIONS 100 + +vec2 cmul(vec2 a, vec2 b) { + return vec2(a.x*b.x - a.y*b.y, a.x*b.y + a.y*b.x); +} + +vec2 cdiv(vec2 a, vec2 b) { + float denominator = b.x*b.x + b.y*b.y; + if (denominator == 0.) return a; + return cmul(a, vec2(b.x, -b.y)) / denominator; +} + +vec2 cpow(vec2 z, float n) { + float r = length(z); + float theta = atan(z.y, z.x); + return pow(r, n) * vec2(cos(n * theta), sin(n * theta)); +} void main() { - gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0); + float time = mod(1.1 + mod(u_time * 1000.0, 100000.0) / 10000.0, 10.); + // float time = 2.0; + + float ratio = u_resolution.x / u_resolution.y; + vec2 pos = v_position.xy/vec2(1.0, ratio); + + vec2 z = 2.0 * (pos - vec2(0., 0.)); + int i; + + vec2 prevZ = z; + for (i = 0; i < MAX_ITERATIONS; i++) { + prevZ = z; + vec2 value = cpow(z, 3.0) + vec2(1., 0.); + vec2 value_der = 3.0 * cpow(z, 2.0); + z = z - time * cdiv(value, value_der); + + if (length(z - prevZ) > 30.0) { + break; + } + } + + gl_FragColor = vec4(0., 0., 0., 1.); + + float diff = length(z - prevZ); + + if (diff > 10.0) { + gl_FragColor = vec4(97., 42., 191., 255.0) / 255.; + } else if (diff > 1.0) { + gl_FragColor = vec4(150., 191., 69., 255.0) / 255.; + } else if (diff > 0.0) { + gl_FragColor = vec4(27., 14., 50., 255.0) / 255.; + } } |
