Skip to content

audio nebula drive

BLOKS Shader Bulletin Board

audio nebula drive

By RJ Shelton June 9, 2026

Shader Preview Unavailable

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

Shader Code
mat2 rot(float a) {
    float s = sin(a);
    float c = cos(a);
    return mat2(c, -s, s, c);
}

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;

    float t = iTime;

    float bass = uAudioBass;
    float mid = uAudioMid;
    float high = uAudioHigh;
    float level = uAudioLevel;

    vec2 q = p;
    float distMouse = length(q - m);

    q += uPointerDelta * vec2(uAspect, 1.0) * exp(-distMouse * 4.0) * 24.0;
    q *= rot(t * 0.08 + bass * 1.6 + uPointerDown * 0.6);

    float r = length(q);
    float a = atan(q.y, q.x);

    float spiral = sin(a * 6.0 + r * (18.0 + bass * 30.0) - t * (2.5 + level * 8.0));
    float nebula = sin(q.x * (5.0 + mid * 14.0) + t);
    nebula += sin(q.y * (7.0 + high * 22.0) - t * 1.3);
    nebula += sin((q.x + q.y) * 6.0 + spiral * 2.0);
    nebula /= 3.0;

    float field = smoothstep(-0.15, 0.85, nebula);
    float core = 0.035 / max(r, 0.035);
    float mouse = 0.02 / max(distMouse, 0.02);

    vec3 bg = vec3(0.004, 0.008, 0.03);
    vec3 blue = vec3(0.04, 0.22, 1.0);
    vec3 cyan = vec3(0.18, 0.85, 1.0);
    vec3 violet = vec3(0.7, 0.16, 1.0);
    vec3 hot = vec3(1.0, 0.35, 0.75);

    vec3 col = bg;
    col += blue * field * (0.25 + mid);
    col += cyan * core * (0.25 + bass * 1.5);
    col += violet * smoothstep(0.2, 1.0, spiral * 0.5 + 0.5) * (0.2 + high);
    col += hot * level * smoothstep(0.9, 0.0, r);
    col += cyan * mouse * 0.16;

    col *= 1.0 + level * 2.0;
    col *= 1.0 - smoothstep(0.8, 1.7, length(p)) * 0.55;

    col = pow(max(col, 0.0), vec3(0.82));

    fragColor = vec4(col, 1.0);
}

← Back to Shader Bulletin Board