Skip to content

liquid signal field

BLOKS Shader Bulletin Board

liquid signal field

By RJ Shelton June 9, 2026

Shader Preview Unavailable

This realtime shader may be too intensive for your current device or browser.

Shader Code
void mainImage(out vec4 fragColor, in vec2 fragCoord) {
    vec2 uv = fragCoord.xy / iResolution.xy;
    vec2 p = uv * 2.0 - 1.0;
    p.x *= uAspect;

    vec2 m = uPointer * 2.0 - 1.0;
    m.x *= uAspect;

    vec2 delta = uPointerDelta * vec2(uAspect, 1.0);
    float t = iTime;

    float d = length(p - m);
    float influence = exp(-d * 4.5);

    vec2 q = p;
    q += delta * influence * 22.0;
    q += 0.08 * vec2(
        sin(q.y * 7.0 + t * 1.4),
        cos(q.x * 6.0 - t * 1.1)
    );

    float bands = sin(q.x * 10.0 + sin(q.y * 5.0 + t) * 2.0 + t);
    bands += sin(q.y * 13.0 - t * 1.2);
    bands += sin((q.x + q.y) * 8.0 + t * 0.8);
    bands /= 3.0;

    float signal = smoothstep(0.15, 0.95, bands * 0.5 + 0.5);

    float pulse = sin(d * 42.0 - t * 8.0);
    pulse = smoothstep(0.25, 1.0, pulse * 0.5 + 0.5);
    pulse *= influence;

    float click = uPointerDown * exp(-d * 7.0);

    vec3 deep = vec3(0.01, 0.015, 0.045);
    vec3 blue = vec3(0.06, 0.28, 1.0);
    vec3 cyan = vec3(0.18, 0.75, 1.0);
    vec3 magenta = vec3(0.72, 0.15, 1.0);

    vec3 col = deep;
    col += blue * signal * 0.45;
    col += cyan * pulse * 0.65;
    col += magenta * click * 0.85;
    col += cyan * (0.012 / max(d, 0.012)) * 0.14;

    col *= 1.0 - length(p / vec2(uAspect, 1.0)) * 0.18;
    col = pow(col, vec3(0.88));

    fragColor = vec4(col, 1.0);
}

← Back to Shader Bulletin Board