// For friend Boleeman
const float u_iterations = 128.0;
const float u_minHueOffset = 50.0;
const float u_zoom = 1.0;
const vec2 u_offset = vec2(0.0,0.0);
const float u_bleedAmount = 12.0;
const int u_colorMode = 2;
// FBMotion function
vec2 fbm(vec2 uv, float time, float amount) {
float f = 2.0;
float a = amount;
for(int s = 0; s < 3; s++) {
uv += vec2(sin(uv.y*f + time*0.3), cos(uv.x*f + time*0.3)) * a;
f = f * 1.5;
a = a * 0.5;
}
return uv;
}
// HSL to RGB
vec3 hsl2rgb(float h, float s, float l) {
float c = (1.0 - abs(2.0 * l - 1.0)) * s;
float x = c * (1.0 - abs(mod(h / 60.0, 2.0) - 1.0));
float m = l - c / 2.0;
vec3 rgb;
if (h < 60.0) rgb = vec3(c, x, 0.0);
else if (h < 120.0) rgb = vec3(x, c, 0.0);
else if (h < 180.0) rgb = vec3(0.0, c, x);
else if (h < 240.0) rgb = vec3(0.0, x, c);
else if (h < 300.0) rgb = vec3(x, 0.0, c);
else rgb = vec3(c, 0.0, x);
return rgb + vec3(m, m, m);
}
void mainImage( out vec4 fragColor, in vec2 fragCoord )
{
vec2 uv = fragCoord.xy /iResolution.xy;
vec2 distortedUV = fbm(uv, iTime, u_bleedAmount * 0.01); // uv distortion avant calcul etc..
float zx = (-0.8 + distortedUV.x * (1.4 - (-0.8))) * -u_zoom + u_offset.x; // on inverse le zoom ici plus tard
float zy = (-0.72 + distortedUV.y * (0.7 - (-0.72))) * -u_zoom + u_offset.y; // et ici pour val param
float i = u_iterations;
while (zx*zx + zy*zy < 4.0 && i > 1.0) {
float r = sqrt(zx*zx + zy*zy);
float theta = atan(zy, zx);
float r15 = pow(r, 1.5);
float tmp = r15 * cos(1.5*theta) - 0.2;
zy = r15 * sin(1.5*theta);
zx = tmp;
i = i - 1.0;
}
float t = i / u_iterations; // multisample
float noise = fract(sin(dot(uv, vec2(12.9898, 78.233))) * 43758.5453); // bruit
t = clamp(t + noise * u_bleedAmount * 0.02, 0.0, 1.0); // lissage
vec3 color;
if (u_colorMode == 0) {
float r = mod(t * 7.0 * 255.0 + u_minHueOffset, 256.0) / 255.0;
float g = mod(t * 5.0 * 255.0 + u_minHueOffset * 2.0, 256.0) / 255.0;
float b = mod(t * 3.0 * 255.0 + u_minHueOffset * 3.0, 256.0) / 255.0;
color = vec3(r, g, b);
} else if (u_colorMode == 1) {
float hue = mod(0.0 + u_minHueOffset + t * 360.0, 360.0);
color = hsl2rgb(hue, 0.6, 0.52);
} else if (u_colorMode == 2) {
float hue = mod(120.0 + u_minHueOffset + t * 360.0, 360.0);
color = hsl2rgb(hue, 0.6, 0.52);
} else {
float hue = mod(240.0 + u_minHueOffset + t * 360.0, 360.0);
color = hsl2rgb(hue, 0.6, 0.52);
}
// Output to screen
fragColor = vec4(color,1.0);
}
// End of Transmission :)