88 lines
2.5 KiB
GLSL
88 lines
2.5 KiB
GLSL
#version 440
|
|
|
|
layout(location = 0) in vec2 qt_TexCoord0;
|
|
layout(location = 0) out vec4 fragColor;
|
|
|
|
layout(std140, binding = 0) uniform buf {
|
|
mat4 qt_Matrix;
|
|
float qt_Opacity;
|
|
float time;
|
|
};
|
|
|
|
// Smooth noise function
|
|
float noise(vec2 p) {
|
|
return fract(sin(dot(p, vec2(12.9898, 78.233))) * 43758.5453);
|
|
}
|
|
|
|
// Smooth interpolation
|
|
float smoothNoise(vec2 p) {
|
|
vec2 i = floor(p);
|
|
vec2 f = fract(p);
|
|
f = f * f * (3.0 - 2.0 * f); // Smoothstep
|
|
|
|
float a = noise(i);
|
|
float b = noise(i + vec2(1.0, 0.0));
|
|
float c = noise(i + vec2(0.0, 1.0));
|
|
float d = noise(i + vec2(1.0, 1.0));
|
|
|
|
return mix(mix(a, b, f.x), mix(c, d, f.x), f.y);
|
|
}
|
|
|
|
// Fractal Brownian Motion
|
|
float fbm(vec2 p) {
|
|
float value = 0.0;
|
|
float amplitude = 0.5;
|
|
for (int i = 0; i < 4; i++) {
|
|
value += amplitude * smoothNoise(p);
|
|
p *= 2.0;
|
|
amplitude *= 0.5;
|
|
}
|
|
return value;
|
|
}
|
|
|
|
// HSV to RGB conversion
|
|
vec3 hsv2rgb(vec3 c) {
|
|
vec4 K = vec4(1.0, 2.0 / 3.0, 1.0 / 3.0, 3.0);
|
|
vec3 p = abs(fract(c.xxx + K.xyz) * 6.0 - K.www);
|
|
return c.z * mix(K.xxx, clamp(p - K.xxx, 0.0, 1.0), c.y);
|
|
}
|
|
|
|
void main() {
|
|
vec2 uv = qt_TexCoord0;
|
|
float t = time * 0.05;
|
|
|
|
// Multiple moving blobs
|
|
vec2 p1 = uv * 3.0 + vec2(t * 0.3, t * 0.2);
|
|
vec2 p2 = uv * 2.5 + vec2(-t * 0.4, t * 0.3);
|
|
vec2 p3 = uv * 4.0 + vec2(t * 0.2, -t * 0.25);
|
|
|
|
float blob1 = fbm(p1);
|
|
float blob2 = fbm(p2);
|
|
float blob3 = fbm(p3);
|
|
|
|
// Combine blobs
|
|
float combined = (blob1 + blob2 + blob3) / 3.0;
|
|
|
|
// Live hue shifting - slowly cycle through hues over time
|
|
float hueShift = time * 0.02; // Slow hue rotation
|
|
|
|
// Create colors using HSV with shifting hue
|
|
vec3 color1 = hsv2rgb(vec3(fract(0.75 + hueShift), 0.6, 0.35)); // Purple range
|
|
vec3 color2 = hsv2rgb(vec3(fract(0.85 + hueShift), 0.7, 0.35)); // Magenta range
|
|
vec3 color3 = hsv2rgb(vec3(fract(0.55 + hueShift), 0.7, 0.35)); // Blue range
|
|
vec3 color4 = hsv2rgb(vec3(fract(0.08 + hueShift), 0.7, 0.35)); // Orange range
|
|
vec3 color5 = hsv2rgb(vec3(fract(0.50 + hueShift), 0.6, 0.30)); // Teal range
|
|
|
|
// Mix colors based on blob values for visible multi-color effect
|
|
vec3 color = mix(color1, color2, blob1);
|
|
color = mix(color, color3, blob2);
|
|
color = mix(color, color4, blob3);
|
|
color = mix(color, color5, combined);
|
|
|
|
// Moderate brightness for visible but dark background accent
|
|
float brightness = 0.25 + combined * 0.25;
|
|
color *= brightness;
|
|
|
|
fragColor = vec4(color, qt_Opacity);
|
|
}
|