PRISMACORE_002 — After Work Sky

GLSL shader by merrypranxter · created 2026-02-21 · 10s loop · 2 passes

Six-fold polar symmetry folds space into a living mandala before anything else touches it. Fbm ribbon ridges sharpened with an abs() fold glow like fiber optics through the field. Animated Worley sparkles drift along the veins like caustic light through water. Soft bloom halos everything in warmth. Thin-film iridescence maps the whole structure to hot pink, electric cyan, acid lime, and deep violet — math giving you a hug after a long day. No grime, no damage, just light.

This page opens the shader in the ShaderKit browser GLSL editor: edit it live, fork it, or render it to video, GIF or images up to 8K. Also available as a full-screen view and an embeddable player.

Shader source (GLSL)

Common

#define pi acos(-1.)
#define deg pi/180.  //1 degree
#define time iTime*2.*pi/10. //sin(time) loops 10 seconds
#define R iResolution.xy //shorthand
#define ar R.x/R.y //aspect ratio
#define M iMouse //shorthand
#define xm (M.xy/R) //normalized mouse
#define nm ((xm.xy-0.5)*vec2(ar,1.)+0.5) //aspect ratio correction
vec3 cs = vec3(1.,2.,3.);
mat2 r2d(float a) {
    return mat2(cos(a),sin(a),-sin(a),cos(a));
}

Buffer A (iChannel0)

// PRISMACORE_002 — After Work Sky
// Polar symmetry + flowing ribbons + caustic sparkles + soft bloom
// Shadertoy: iTime, iResolution

#define PI  3.14159265
#define TAU 6.28318530

// ════════════════════════════════
// KNOBS
// ════════════════════════════════
#define FOLD_N      6.0    // symmetry arms (try 3, 4, 8)
#define RIBBON      1.4    // sharpness of color veins
#define SPARKLE     0.94   // sparkle threshold (higher = fewer stars)
#define BLOOM_RAD   0.008  // bloom sample radius
#define FLOW_SPEED  0.25   // animation pace
#define IRIDESCENCE 2.6    // thin-film color density
// ════════════════════════════════

float hash(vec2 p) {
    p = fract(p * vec2(127.1, 311.7));
    p += dot(p, p + 19.19);
    return fract(p.x * p.y);
}
vec2 hash2(vec2 p) { return vec2(hash(p), hash(p + 17.3)); }

float vnoise(vec2 p) {
    vec2 i = floor(p), f = fract(p);
    vec2 u = f*f*(3.0-2.0*f);
    return mix(mix(hash(i),         hash(i+vec2(1,0)), u.x),
               mix(hash(i+vec2(0,1)), hash(i+vec2(1,1)), u.x), u.y);
}

float fbm(vec2 p, int oct) {
    float v = 0.0, a = 0.5;
    for (int i = 0; i < 6; i++) {
        if (i >= oct) break;
        v += a * vnoise(p);
        p  = p * 2.1 + vec2(1.7, 9.2);
        a *= 0.5;
    }
    return v;
}

// ---- POLAR FOLD ----
// Folds space into FOLD_N-way symmetry before anything else
vec2 polarFold(vec2 p) {
    float angle = atan(p.y, p.x);
    float r     = length(p);
    float seg   = TAU / FOLD_N;
    angle       = mod(angle, seg);
    angle       = min(angle, seg - angle); // mirror within segment
    return vec2(cos(angle), sin(angle)) * r;
}

// ---- RIBBON FIELD ----
// fbm → take abs of centered value → sharp bright ridges
float ribbon(vec2 p, float t) {
    float f = fbm(p + vec2(t * FLOW_SPEED * 0.7, t * FLOW_SPEED * 0.4), 5);
    f = abs(f - 0.5) * 2.0; // fold around 0.5 → ridges at 0
    f = pow(1.0 - f, RIBBON); // invert + sharpen
    return f;
}

// ---- CAUSTIC SPARKLES ----
// Worley minima → threshold → bright points
float sparkles(vec2 p, float t) {
    vec2 i = floor(p), f = fract(p);
    float d = 1e9;
    for (int x=-1; x<=1; x++)
    for (int y=-1; y<=1; y++) {
        vec2 jit = hash2(i + vec2(x,y));
        jit = 0.5 + 0.4*sin(TAU*jit + t * FLOW_SPEED * 2.0); // animate jitter
        d = min(d, length(f - vec2(x,y) - jit));
    }
    float s = smoothstep(SPARKLE, 1.0, 1.0 - d);
    return s * s;
}

// ---- THIN FILM ----
vec3 thinFilm(float phase, float strength) {
    return vec3(
        sin(phase * TAU * strength)                * 0.5 + 0.5,
        sin(phase * TAU * strength + TAU/3.0)      * 0.5 + 0.5,
        sin(phase * TAU * strength + 2.0*TAU/3.0)  * 0.5 + 0.5
    );
}

// ---- SOFT BLOOM ----
// Sample ribbon field at 4 offsets, average → halo
float bloom(vec2 p, float t) {
    float r = BLOOM_RAD * 4.0;
    float b = ribbon(p, t);
    b += ribbon(p + vec2( r,  0), t);
    b += ribbon(p + vec2(-r,  0), t);
    b += ribbon(p + vec2( 0,  r), t);
    b += ribbon(p + vec2( 0, -r), t);
    return b / 5.0;
}

// ════════════════════════════════
void mainImage(out vec4 fragColor, in vec2 fragCoord) {
    vec2 uv  = fragCoord / iResolution.xy;
    float t  = iTime;
    float asp = iResolution.x / iResolution.y;

    vec2 p = (uv * 2.0 - 1.0) * vec2(asp, 1.0);

    // fold into symmetry
    vec2 fp = polarFold(p);

    // gentle domain warp (softer than 001)
    float wf = fbm(fp * 1.2 + t * FLOW_SPEED * 0.3, 3);
    vec2 wp  = fp + vec2(wf, wf * 0.7) * 0.4;

    // ribbon field + bloom
    float rib   = ribbon(wp * 2.0, t);
    float blm   = bloom(wp * 2.0, t);

    // phase for iridescence
    float phase = fbm(wp * 1.8 + t * FLOW_SPEED * 0.5, 4);

    vec3 film = thinFilm(phase, IRIDESCENCE);

    const vec3 PINK   = vec3(1.00, 0.07, 0.57);
    const vec3 CYAN   = vec3(0.00, 0.95, 1.00);
    const vec3 LIME   = vec3(0.60, 1.00, 0.00);
    const vec3 VIOLET = vec3(0.50, 0.00, 1.00);
    const vec3 WHITE  = vec3(1.00, 0.95, 1.00);

    // base color from film
    vec3 col = film.r * PINK + film.g * LIME + film.b * CYAN;

    // violet in the deep folds
    float depth = 1.0 - smoothstep(0.15, 0.55, phase);
    col = mix(col, VIOLET * 0.7, depth * 0.55);

    // ribbon brightens the veins
    col = mix(col, col * 2.2, rib * 0.7);

    // bloom adds soft glow halos
    col += col * blm * 0.6;

    // sparkles: tiny bright white-pink points on top
    float sp = sparkles(wp * 5.0 + t * FLOW_SPEED * 0.5, t);
    col += mix(PINK, WHITE, 0.6) * sp * 2.5;

    // soft vignette (gentle, not CRT-grim)
    vec2 vig = uv * 2.0 - 1.0;
    col *= 1.0 - dot(vig, vig) * 0.25;

    // exposure
    col = pow(max(col, 0.0), vec3(0.85)) * 1.15;

    // ACES tonemap
    col = col*(2.51*col+0.03) / (col*(2.43*col+0.59)+0.14);

    fragColor = vec4(clamp(col, 0.0, 1.0), 1.0);
}

Image

Not used

More shaders by merrypranxter

Browse all public shaders · All shaders by merrypranxter · ShaderKit home

Vibe Mode BETA
💰 ~0 credits
Uniforms
FPS: 0
Time: 0
Resolution: 0 x 0

Account

FPS: -- Time: -- --×-- 1x