2020-11-23 17:41:14 +00:00
|
|
|
#version 450
|
|
|
|
|
2020-11-24 15:38:29 +00:00
|
|
|
layout (location = 0) in vec2 in_uv;
|
|
|
|
|
2020-11-23 17:41:14 +00:00
|
|
|
layout (location = 0) out vec4 color;
|
|
|
|
|
2020-11-24 15:38:29 +00:00
|
|
|
layout (set = 0, binding = 0) uniform Parameters {
|
|
|
|
int max_iter;
|
|
|
|
float size;
|
|
|
|
float time;
|
|
|
|
float factor;
|
|
|
|
} parameters;
|
2020-11-23 18:08:34 +00:00
|
|
|
|
|
|
|
float hue_to_rgb(float p, float q, float t) {
|
|
|
|
if (t < 0.0) {
|
|
|
|
t += 1.0;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (t > 1.0) {
|
|
|
|
t -= 1.0;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (t < (1.0 / 6.0)) {
|
|
|
|
return p + (q - p) * 6.0 * t;
|
|
|
|
} else if (t < (1.0 / 2.0)) {
|
|
|
|
return q;
|
|
|
|
} else if (t < (2.0 / 3.0)) {
|
|
|
|
return p + (q - p) * (2.0 / 3.0 - t) * 6.0;
|
|
|
|
}
|
|
|
|
|
|
|
|
return p;
|
|
|
|
}
|
|
|
|
|
|
|
|
vec3 hsl_to_rgb(float h, float s, float l) {
|
|
|
|
float r, g, b;
|
|
|
|
|
|
|
|
if (s == 0.0) {
|
|
|
|
r = l;
|
|
|
|
g = l;
|
|
|
|
b = l;
|
|
|
|
} else {
|
|
|
|
float q, p;
|
|
|
|
|
|
|
|
if (l < 0.5) {
|
|
|
|
q = l * (1. + s);
|
|
|
|
} else {
|
|
|
|
q = l + s - l * s;
|
|
|
|
}
|
|
|
|
|
|
|
|
p = 2. * l - q;
|
|
|
|
r = hue_to_rgb(p, q, h + 1.0 / 3.0);
|
|
|
|
g = hue_to_rgb(p, q, h);
|
|
|
|
b = hue_to_rgb(p, q, h - 1.0 / 3.0);
|
|
|
|
}
|
|
|
|
|
|
|
|
return vec3(r, g, b);
|
|
|
|
}
|
|
|
|
|
|
|
|
void mandelbrot_iter(float px, float py, out float ox, out int iter) {
|
|
|
|
float x = 0.0;
|
|
|
|
float y = 0.0;
|
|
|
|
float xx = 0.0;
|
|
|
|
float yy = 0.0;
|
|
|
|
float xy = 0.0;
|
|
|
|
|
2020-11-24 15:38:29 +00:00
|
|
|
for (int i = 0; i < parameters.max_iter; i++) {
|
2020-11-23 18:08:34 +00:00
|
|
|
xx = x * x;
|
|
|
|
yy = y * y;
|
|
|
|
xy = x * y;
|
|
|
|
|
|
|
|
if ((xx + yy) > 4.0) {
|
|
|
|
ox = xx + yy;
|
|
|
|
iter = i;
|
|
|
|
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
x = xx - yy + px;
|
|
|
|
y = 2.0 * xy + py;
|
|
|
|
}
|
|
|
|
|
|
|
|
ox = xx + yy;
|
2020-11-24 15:38:29 +00:00
|
|
|
iter = parameters.max_iter;
|
2020-11-23 18:08:34 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
vec3 paint(float nx, float ny) {
|
|
|
|
float r;
|
|
|
|
int n;
|
|
|
|
|
2020-11-24 15:38:29 +00:00
|
|
|
mandelbrot_iter(parameters.size * nx, parameters.size * ny, r, n);
|
2020-11-23 18:08:34 +00:00
|
|
|
|
|
|
|
if (r > 4.0) {
|
|
|
|
return hsl_to_rgb(float(n) / 800.0 * r, 1.0, 0.5);
|
|
|
|
} else {
|
|
|
|
return vec3(1.0, 1.0, 1.0);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2020-11-24 15:38:29 +00:00
|
|
|
// void main() {
|
|
|
|
// color = vec4(paint(gl_FragCoord.x, gl_FragCoord.y), 1.0);
|
|
|
|
// }
|
|
|
|
|
2020-11-23 17:41:14 +00:00
|
|
|
void main() {
|
2020-11-24 15:38:29 +00:00
|
|
|
vec2 tc = vec2(in_uv.x) * parameters.time * parameters.factor;
|
|
|
|
|
|
|
|
float x0 = (tc.x * 3 - 2);
|
|
|
|
float y0 = (tc.y * 2 - 1);
|
|
|
|
|
|
|
|
float x = 0;
|
|
|
|
float y = 0;
|
|
|
|
int iteration = 0;
|
|
|
|
|
|
|
|
while ((x * x + y * y <= 4) && (iteration < parameters.max_iter))
|
|
|
|
{
|
|
|
|
float xtemp = x * x - y * y + x0;
|
|
|
|
y = 2 * x * y + y0;
|
|
|
|
x = xtemp;
|
|
|
|
|
|
|
|
iteration += 1;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (iteration == parameters.max_iter)
|
|
|
|
{
|
|
|
|
|
|
|
|
// Hier wird der Farbwert für das Innere der Mandelbrotmenge gesetzt
|
|
|
|
|
|
|
|
color = vec4(0, 0, 0, 1);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
|
|
|
|
// Hier kann eine beliebige Farbwahl stattfinden(z.B. mit einer Farbtabelle).
|
|
|
|
// als Index verwendet man die Variable "iteration", die einen Wert zwischen 1 und parameters.max_iter hat.
|
|
|
|
|
|
|
|
x = sin(float(iteration));
|
|
|
|
color = vec4(x, x, x, 1);
|
|
|
|
}
|
2020-11-23 17:41:14 +00:00
|
|
|
}
|