From 97d0d1ecc0cfd5516cfad2d477faa4d35992e7ba Mon Sep 17 00:00:00 2001 From: cursed22bc Date: Sun, 8 Mar 2026 23:15:16 +0200 Subject: liquid shader and basic text render --- shaders/liquid.glsl | 47 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 47 insertions(+) create mode 100644 shaders/liquid.glsl (limited to 'shaders') diff --git a/shaders/liquid.glsl b/shaders/liquid.glsl new file mode 100644 index 0000000..9078248 --- /dev/null +++ b/shaders/liquid.glsl @@ -0,0 +1,47 @@ +extern Image scene; +extern number time; +extern vec2 resolution; +extern vec2 splashCenter; +extern number splashTime; + +float getOffsetStrength(float t, vec2 dir) { + float maxRadius = 0.3; + float d = length(dir) - maxRadius * t; + d *= 1.0 - smoothstep(0.0, 0.05, abs(d)); + d *= smoothstep(0.0, 0.05, t); + d *= 1.0 - smoothstep(0.5, 1.0, t); + return d; +} + +vec4 effect(vec4 color, Image tex, vec2 texture_coords, vec2 screen_coords) { + vec2 uv = screen_coords / resolution; + + // waves + float x = sin(uv.y * 2.56) * 0.05 * sin(time * 0.4); + float y = sin(uv.x * 2.56) * 0.05 * cos(time * 0.4); + vec2 offset = vec2(x, y); + + // shockwave + vec2 dir = splashCenter - uv; + float dist = length(dir); + float t = splashTime * (1.0 - smoothstep(0.0, 0.3, dist)); + t = pow(max(0.0, t), 1.0 / 1.5); + + float rD = getOffsetStrength(t + 0.02, dir); + float gD = getOffsetStrength(t, dir); + float bD = getOffsetStrength(t - 0.02, dir); + + dir = normalize(dir + vec2(0.0001)); + vec2 uvR = clamp(uv + offset + dir * rD, vec2(0.0, 0.0), vec2(1.0, 1.0)); + vec2 uvG = clamp(uv + offset + dir * gD, vec2(0.0, 0.0), vec2(1.0, 1.0)); + vec2 uvB = clamp(uv + offset + dir * bD, vec2(0.0, 0.0), vec2(1.0, 1.0)); + + float red = Texel(scene, uvR).r; + float green = Texel(scene, uvG).g; + float blue = Texel(scene, uvB).b; + + vec4 col = vec4(red, green, blue, color.a); + float shading = gD * 8.0; + col.rgb += shading; + return col; +} -- cgit v1.2.3