68 lines
2.3 KiB
GLSL
68 lines
2.3 KiB
GLSL
float hash21(vec2 p) {
|
|
p = fract(p * vec2(123.34, 456.21));
|
|
p += dot(p, p + 45.32);
|
|
return fract(p.x * p.y);
|
|
}
|
|
|
|
float noise21(vec2 p) {
|
|
vec2 i = floor(p);
|
|
vec2 f = fract(p);
|
|
f = f * f * (3.0 - 2.0 * f);
|
|
return mix(
|
|
mix(hash21(i), hash21(i + vec2(1.0, 0.0)), f.x),
|
|
mix(hash21(i + vec2(0.0, 1.0)), hash21(i + vec2(1.0, 1.0)), f.x),
|
|
f.y
|
|
);
|
|
}
|
|
|
|
float fbm(vec2 p) {
|
|
float value = 0.0;
|
|
float amplitude = 0.5;
|
|
mat2 turn = mat2(0.80, 0.60, -0.60, 0.80);
|
|
for (int i = 0; i < 5; i++) {
|
|
value += amplitude * noise21(p);
|
|
p = turn * p * 2.03 + vec2(3.1, 1.7);
|
|
amplitude *= 0.5;
|
|
}
|
|
return value;
|
|
}
|
|
|
|
void mainImage(out vec4 fragColor, in vec2 fragCoord) {
|
|
vec2 uv = fragCoord / iResolution.xy;
|
|
float unit = min(iResolution.x, iResolution.y);
|
|
vec2 p = (2.0 * fragCoord - iResolution.xy) / unit;
|
|
vec2 mouse = (2.0 * iMouse.xy - iResolution.xy) / unit;
|
|
float t = iTime * 0.12;
|
|
|
|
vec2 pointerDelta = p - mouse;
|
|
float pointerGlow = exp(-dot(pointerDelta, pointerDelta) * 4.0);
|
|
float pressed = iMouse.z > 0.0 ? 1.0 : 0.0;
|
|
|
|
vec2 q = vec2(
|
|
fbm(p * 0.65 + vec2(t * 0.35, -t * 0.20)),
|
|
fbm(p * 0.65 + vec2(4.7 - t * 0.24, 2.9 + t * 0.18))
|
|
);
|
|
vec2 r = vec2(
|
|
fbm(p + q * 1.8 + vec2(1.7, 8.2) + t * 0.16),
|
|
fbm(p + q * 1.8 + vec2(8.3, 2.8) - t * 0.13)
|
|
);
|
|
float field = fbm(p * 0.85 + r * 2.2 + pointerDelta * pointerGlow * 0.12);
|
|
|
|
float ribbon = 0.5 + 0.5 * sin(10.0 * field + 3.0 * r.x - 1.8 * p.y + t * 1.4);
|
|
float silk = pow(ribbon, 4.0);
|
|
float edge = pow(1.0 - abs(ribbon * 2.0 - 1.0), 10.0);
|
|
|
|
vec3 color = mix(vec3(0.006, 0.010, 0.032), vec3(0.075, 0.025, 0.16), field);
|
|
color = mix(color, vec3(0.02, 0.65, 0.72), silk * 0.72);
|
|
color += vec3(0.65, 0.08, 0.32) * pow(1.0 - field, 5.0) * 0.28;
|
|
color += vec3(0.08, 0.55, 0.70) * edge * 0.16;
|
|
color += mix(vec3(0.02, 0.55, 0.68), vec3(0.85, 0.12, 0.38), pressed)
|
|
* pointerGlow * (0.14 + pressed * 0.18);
|
|
|
|
float vignette = 1.0 - smoothstep(0.25, 1.25, length((uv - 0.5) * vec2(1.1, 0.9)));
|
|
color *= 0.62 + vignette * 0.38;
|
|
color = 1.0 - exp(-color * 1.35);
|
|
color += (hash21(fragCoord + fract(iTime) * 91.0) - 0.5) * 0.012;
|
|
fragColor = vec4(color, 1.0);
|
|
}
|