54 lines
969 B
GLSL
54 lines
969 B
GLSL
/*
|
|
* 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);
|
|
}
|