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
- PRISMACORE_003 — Retina Banquet
- PRISMACORE_001 — Liquid Crystal Fever Dream
- Hopf Vibratiok in pink
- Void Geode
- Project_2026-02-14_04-53-13
- Chromatic Plexus
- Signal Death
- Deep fried math
- Candy Interference
- Project_2026-02-12_21-16-32
- Project_2026-02-12_17-00-28
- Project_2026-02-12_16-17-50
Browse all public shaders · All shaders by merrypranxter · ShaderKit home
Unread comments
×Projects with new comments. Click to open and read.