gpu-fractal/frag_shader.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);
}