/* * Copyright (c) Camden Dixie O'Brien * SPDX-License-Identifier: AGPL-3.0-only */ #version 450 #define MAXITER 1000 layout(location = 0) out vec4 out_colour; layout(push_constant) uniform Constants { vec2 img_size; vec2 shift; float zoom; } params; vec2 ss_offsets[4] = vec2[]( vec2(-0.25, -0.25), vec2( 0.25, -0.25), vec2(-0.25, 0.25), vec2( 0.25, 0.25) ); vec2 maptoz(vec2 xy) { return params.zoom * ((xy / params.img_size.xy) * 4.0 - 2.0) + params.shift; } float mandelbrot(vec2 c) { vec2 z = vec2(0.0, 0.0); for (int i = 0; i < MAXITER; ++i) { z = vec2(z.x * z.x - z.y * z.y, 2.0 * z.x * z.y) + c; if (length(z) > 2.0) return float(i) / float(MAXITER); } return 0.0; } vec3 colour(float i) { return vec3(i, i * i, i * i * i); } void main() { vec2 c; vec3 col = vec3(0.0, 0.0, 0.0); for (int i = 0; i < 4; ++i) { c = maptoz(gl_FragCoord.xy + ss_offsets[i]); col += colour(mandelbrot(c)); } out_colour = vec4(col, 1.0); }