mandelbrot-nim/src/mandelbrot/shader.frag

316 lines
11 KiB
GLSL

#version 410 core
in vec4 gl_FragCoord;
out vec4 fragColor;
uniform float center_x;
uniform float center_y;
uniform float zoom;
#define MAX_ITERATIONS 600
const vec3 colors[256] = vec3[256](
vec3(0.0,0.0,0.0),
vec3(0.5,0.0,0.0),
vec3(0.0,0.5,0.0),
vec3(0.5,0.5,0.0),
vec3(0.0,0.0,0.5),
vec3(0.5,0.0,0.5),
vec3(0.0,0.5,0.5),
vec3(0.75,0.75,0.75),
vec3(0.5,0.5,0.5),
vec3(0.99609375,0.0,0.0),
vec3(0.0,0.99609375,0.0),
vec3(0.99609375,0.99609375,0.0),
vec3(0.0,0.0,0.99609375),
vec3(0.99609375,0.0,0.99609375),
vec3(0.0,0.99609375,0.99609375),
vec3(0.99609375,0.99609375,0.99609375),
vec3(0.0,0.0,0.0),
vec3(0.0,0.0,0.37109375),
vec3(0.0,0.0,0.52734375),
vec3(0.0,0.0,0.68359375),
vec3(0.0,0.0,0.83984375),
vec3(0.0,0.0,0.99609375),
vec3(0.0,0.37109375,0.0),
vec3(0.0,0.37109375,0.37109375),
vec3(0.0,0.37109375,0.52734375),
vec3(0.0,0.37109375,0.68359375),
vec3(0.0,0.37109375,0.83984375),
vec3(0.0,0.37109375,0.99609375),
vec3(0.0,0.52734375,0.0),
vec3(0.0,0.52734375,0.37109375),
vec3(0.0,0.52734375,0.52734375),
vec3(0.0,0.52734375,0.68359375),
vec3(0.0,0.52734375,0.83984375),
vec3(0.0,0.52734375,0.99609375),
vec3(0.0,0.68359375,0.0),
vec3(0.0,0.68359375,0.37109375),
vec3(0.0,0.68359375,0.52734375),
vec3(0.0,0.68359375,0.68359375),
vec3(0.0,0.68359375,0.83984375),
vec3(0.0,0.68359375,0.99609375),
vec3(0.0,0.83984375,0.0),
vec3(0.0,0.83984375,0.37109375),
vec3(0.0,0.83984375,0.52734375),
vec3(0.0,0.83984375,0.68359375),
vec3(0.0,0.83984375,0.83984375),
vec3(0.0,0.83984375,0.99609375),
vec3(0.0,0.99609375,0.0),
vec3(0.0,0.99609375,0.37109375),
vec3(0.0,0.99609375,0.52734375),
vec3(0.0,0.99609375,0.68359375),
vec3(0.0,0.99609375,0.83984375),
vec3(0.0,0.99609375,0.99609375),
vec3(0.37109375,0.0,0.0),
vec3(0.37109375,0.0,0.37109375),
vec3(0.37109375,0.0,0.52734375),
vec3(0.37109375,0.0,0.68359375),
vec3(0.37109375,0.0,0.83984375),
vec3(0.37109375,0.0,0.99609375),
vec3(0.37109375,0.37109375,0.0),
vec3(0.37109375,0.37109375,0.37109375),
vec3(0.37109375,0.37109375,0.52734375),
vec3(0.37109375,0.37109375,0.68359375),
vec3(0.37109375,0.37109375,0.83984375),
vec3(0.37109375,0.37109375,0.99609375),
vec3(0.37109375,0.52734375,0.0),
vec3(0.37109375,0.52734375,0.37109375),
vec3(0.37109375,0.52734375,0.52734375),
vec3(0.37109375,0.52734375,0.68359375),
vec3(0.37109375,0.52734375,0.83984375),
vec3(0.37109375,0.52734375,0.99609375),
vec3(0.37109375,0.68359375,0.0),
vec3(0.37109375,0.68359375,0.37109375),
vec3(0.37109375,0.68359375,0.52734375),
vec3(0.37109375,0.68359375,0.68359375),
vec3(0.37109375,0.68359375,0.83984375),
vec3(0.37109375,0.68359375,0.99609375),
vec3(0.37109375,0.83984375,0.0),
vec3(0.37109375,0.83984375,0.37109375),
vec3(0.37109375,0.83984375,0.52734375),
vec3(0.37109375,0.83984375,0.68359375),
vec3(0.37109375,0.83984375,0.83984375),
vec3(0.37109375,0.83984375,0.99609375),
vec3(0.37109375,0.99609375,0.0),
vec3(0.37109375,0.99609375,0.37109375),
vec3(0.37109375,0.99609375,0.52734375),
vec3(0.37109375,0.99609375,0.68359375),
vec3(0.37109375,0.99609375,0.83984375),
vec3(0.37109375,0.99609375,0.99609375),
vec3(0.52734375,0.0,0.0),
vec3(0.52734375,0.0,0.37109375),
vec3(0.52734375,0.0,0.52734375),
vec3(0.52734375,0.0,0.68359375),
vec3(0.52734375,0.0,0.83984375),
vec3(0.52734375,0.0,0.99609375),
vec3(0.52734375,0.37109375,0.0),
vec3(0.52734375,0.37109375,0.37109375),
vec3(0.52734375,0.37109375,0.52734375),
vec3(0.52734375,0.37109375,0.68359375),
vec3(0.52734375,0.37109375,0.83984375),
vec3(0.52734375,0.37109375,0.99609375),
vec3(0.52734375,0.52734375,0.0),
vec3(0.52734375,0.52734375,0.37109375),
vec3(0.52734375,0.52734375,0.52734375),
vec3(0.52734375,0.52734375,0.68359375),
vec3(0.52734375,0.52734375,0.83984375),
vec3(0.52734375,0.52734375,0.99609375),
vec3(0.52734375,0.68359375,0.0),
vec3(0.52734375,0.68359375,0.37109375),
vec3(0.52734375,0.68359375,0.52734375),
vec3(0.52734375,0.68359375,0.68359375),
vec3(0.52734375,0.68359375,0.83984375),
vec3(0.52734375,0.68359375,0.99609375),
vec3(0.52734375,0.83984375,0.0),
vec3(0.52734375,0.83984375,0.37109375),
vec3(0.52734375,0.83984375,0.52734375),
vec3(0.52734375,0.83984375,0.68359375),
vec3(0.52734375,0.83984375,0.83984375),
vec3(0.52734375,0.83984375,0.99609375),
vec3(0.52734375,0.99609375,0.0),
vec3(0.52734375,0.99609375,0.37109375),
vec3(0.52734375,0.99609375,0.52734375),
vec3(0.52734375,0.99609375,0.68359375),
vec3(0.52734375,0.99609375,0.83984375),
vec3(0.52734375,0.99609375,0.99609375),
vec3(0.68359375,0.0,0.0),
vec3(0.68359375,0.0,0.37109375),
vec3(0.68359375,0.0,0.52734375),
vec3(0.68359375,0.0,0.68359375),
vec3(0.68359375,0.0,0.83984375),
vec3(0.68359375,0.0,0.99609375),
vec3(0.68359375,0.37109375,0.0),
vec3(0.68359375,0.37109375,0.37109375),
vec3(0.68359375,0.37109375,0.52734375),
vec3(0.68359375,0.37109375,0.68359375),
vec3(0.68359375,0.37109375,0.83984375),
vec3(0.68359375,0.37109375,0.99609375),
vec3(0.68359375,0.52734375,0.0),
vec3(0.68359375,0.52734375,0.37109375),
vec3(0.68359375,0.52734375,0.52734375),
vec3(0.68359375,0.52734375,0.68359375),
vec3(0.68359375,0.52734375,0.83984375),
vec3(0.68359375,0.52734375,0.99609375),
vec3(0.68359375,0.68359375,0.0),
vec3(0.68359375,0.68359375,0.37109375),
vec3(0.68359375,0.68359375,0.52734375),
vec3(0.68359375,0.68359375,0.68359375),
vec3(0.68359375,0.68359375,0.83984375),
vec3(0.68359375,0.68359375,0.99609375),
vec3(0.68359375,0.83984375,0.0),
vec3(0.68359375,0.83984375,0.37109375),
vec3(0.68359375,0.83984375,0.52734375),
vec3(0.68359375,0.83984375,0.68359375),
vec3(0.68359375,0.83984375,0.83984375),
vec3(0.68359375,0.83984375,0.99609375),
vec3(0.68359375,0.99609375,0.0),
vec3(0.68359375,0.99609375,0.37109375),
vec3(0.68359375,0.99609375,0.52734375),
vec3(0.68359375,0.99609375,0.68359375),
vec3(0.68359375,0.99609375,0.83984375),
vec3(0.68359375,0.99609375,0.99609375),
vec3(0.83984375,0.0,0.0),
vec3(0.83984375,0.0,0.37109375),
vec3(0.83984375,0.0,0.52734375),
vec3(0.83984375,0.0,0.68359375),
vec3(0.83984375,0.0,0.83984375),
vec3(0.83984375,0.0,0.99609375),
vec3(0.83984375,0.37109375,0.0),
vec3(0.83984375,0.37109375,0.37109375),
vec3(0.83984375,0.37109375,0.52734375),
vec3(0.83984375,0.37109375,0.68359375),
vec3(0.83984375,0.37109375,0.83984375),
vec3(0.83984375,0.37109375,0.99609375),
vec3(0.83984375,0.52734375,0.0),
vec3(0.83984375,0.52734375,0.37109375),
vec3(0.83984375,0.52734375,0.52734375),
vec3(0.83984375,0.52734375,0.68359375),
vec3(0.83984375,0.52734375,0.83984375),
vec3(0.83984375,0.52734375,0.99609375),
vec3(0.83984375,0.68359375,0.0),
vec3(0.83984375,0.68359375,0.37109375),
vec3(0.83984375,0.68359375,0.52734375),
vec3(0.83984375,0.68359375,0.68359375),
vec3(0.83984375,0.68359375,0.83984375),
vec3(0.83984375,0.68359375,0.99609375),
vec3(0.83984375,0.83984375,0.0),
vec3(0.83984375,0.83984375,0.37109375),
vec3(0.83984375,0.83984375,0.52734375),
vec3(0.83984375,0.83984375,0.68359375),
vec3(0.83984375,0.83984375,0.83984375),
vec3(0.83984375,0.83984375,0.99609375),
vec3(0.83984375,0.99609375,0.0),
vec3(0.83984375,0.99609375,0.37109375),
vec3(0.83984375,0.99609375,0.52734375),
vec3(0.83984375,0.99609375,0.68359375),
vec3(0.83984375,0.99609375,0.83984375),
vec3(0.83984375,0.99609375,0.99609375),
vec3(0.99609375,0.0,0.0),
vec3(0.99609375,0.0,0.37109375),
vec3(0.99609375,0.0,0.52734375),
vec3(0.99609375,0.0,0.68359375),
vec3(0.99609375,0.0,0.83984375),
vec3(0.99609375,0.0,0.99609375),
vec3(0.99609375,0.37109375,0.0),
vec3(0.99609375,0.37109375,0.37109375),
vec3(0.99609375,0.37109375,0.52734375),
vec3(0.99609375,0.37109375,0.68359375),
vec3(0.99609375,0.37109375,0.83984375),
vec3(0.99609375,0.37109375,0.99609375),
vec3(0.99609375,0.52734375,0.0),
vec3(0.99609375,0.52734375,0.37109375),
vec3(0.99609375,0.52734375,0.52734375),
vec3(0.99609375,0.52734375,0.68359375),
vec3(0.99609375,0.52734375,0.83984375),
vec3(0.99609375,0.52734375,0.99609375),
vec3(0.99609375,0.68359375,0.0),
vec3(0.99609375,0.68359375,0.37109375),
vec3(0.99609375,0.68359375,0.52734375),
vec3(0.99609375,0.68359375,0.68359375),
vec3(0.99609375,0.68359375,0.83984375),
vec3(0.99609375,0.68359375,0.99609375),
vec3(0.99609375,0.83984375,0.0),
vec3(0.99609375,0.83984375,0.37109375),
vec3(0.99609375,0.83984375,0.52734375),
vec3(0.99609375,0.83984375,0.68359375),
vec3(0.99609375,0.83984375,0.83984375),
vec3(0.99609375,0.83984375,0.99609375),
vec3(0.99609375,0.99609375,0.0),
vec3(0.99609375,0.99609375,0.37109375),
vec3(0.99609375,0.99609375,0.52734375),
vec3(0.99609375,0.99609375,0.68359375),
vec3(0.99609375,0.99609375,0.83984375),
vec3(0.99609375,0.99609375,0.99609375),
vec3(0.03125,0.03125,0.03125),
vec3(0.0703125,0.0703125,0.0703125),
vec3(0.109375,0.109375,0.109375),
vec3(0.1484375,0.1484375,0.1484375),
vec3(0.1875,0.1875,0.1875),
vec3(0.2265625,0.2265625,0.2265625),
vec3(0.265625,0.265625,0.265625),
vec3(0.3046875,0.3046875,0.3046875),
vec3(0.34375,0.34375,0.34375),
vec3(0.3828125,0.3828125,0.3828125),
vec3(0.421875,0.421875,0.421875),
vec3(0.4609375,0.4609375,0.4609375),
vec3(0.5,0.5,0.5),
vec3(0.5390625,0.5390625,0.5390625),
vec3(0.578125,0.578125,0.578125),
vec3(0.6171875,0.6171875,0.6171875),
vec3(0.65625,0.65625,0.65625),
vec3(0.6953125,0.6953125,0.6953125),
vec3(0.734375,0.734375,0.734375),
vec3(0.7734375,0.7734375,0.7734375),
vec3(0.8125,0.8125,0.8125),
vec3(0.8515625,0.8515625,0.8515625),
vec3(0.890625,0.890625,0.890625),
vec3(0.9296875,0.9296875,0.9296875)
);
int get_iterations()
{
double real = ((gl_FragCoord.x / 1000.0f - 1.2f) * zoom + center_x) * 1.5f;
double imag = ((gl_FragCoord.y / 800.0f - 0.9f) * zoom + center_y) * 1.5f;
int iterations = 0;
double const_real = real;
double const_imag = imag;
while (iterations < MAX_ITERATIONS)
{
double tmp_real = real;
real = (real * real - imag * imag) + const_real;
imag = (2.0 * tmp_real * imag) + const_imag;
double dist = real * real + imag * imag;
if (dist > 4.0)
break;
++iterations;
}
return iterations;
}
vec4 return_color()
{
int iter = get_iterations();
if (iter == MAX_ITERATIONS)
{
gl_FragDepth = 0.0f;
return vec4(0.0f, 0.0f, 0.0f, 1.0f);
}
int colorIndex = int((float(iter)/float(MAX_ITERATIONS))*256);
vec3 color = colors[colorIndex];
return vec4(color.x, color.y, color.z, 1.0);
}
void main()
{
fragColor = return_color();
}