/*{ "DESCRIPTION": "Cursed US $100 bills falling naturally through dusty green vault light: leaf-like swooping descent, banking into each swing, lazy turn-overs, and curled sheets whose bowed silhouette shows when a bill tilts edge-on. Every bill is drawn procedurally (no textures): ornamental border lace, an alchemist transmutation circle (double ring, runic ticks, twin-armed vortex spiral, vertex sigil-circles), pentagram seals, serial dashes, corner 666s, and a Baphomet-style sigil + eye-in-pyramid on the back. A glow slider makes the occult ink throb red; a burn slider chars noise-eaten holes into the paper with flickering ember rims and flames licking into the gaps. Eight parallax depth layers with fog and god rays. Speed, density, size, flutter, spin, glow, burn, rays, hue and vignette on sliders.", "CREDIT": "CC0", "CATEGORIES": ["generator", "money", "rain", "occult"], "INPUTS": [ { "NAME": "uSpeed", "TYPE": "float", "DEFAULT": 1.20, "MIN": 0.0, "MAX": 3.0 }, { "NAME": "uDensity", "TYPE": "float", "DEFAULT": 1.00, "MIN": 0.0, "MAX": 1.5 }, { "NAME": "uSize", "TYPE": "float", "DEFAULT": 0.30, "MIN": 0.3, "MAX": 2.5 }, { "NAME": "uFlutter", "TYPE": "float", "DEFAULT": 2.00, "MIN": 0.0, "MAX": 2.0 }, { "NAME": "uSpin", "TYPE": "float", "DEFAULT": 1.66, "MIN": 0.0, "MAX": 2.5 }, { "NAME": "uGlow", "TYPE": "float", "DEFAULT": 0.80, "MIN": 0.0, "MAX": 1.5 }, { "NAME": "uBurn", "TYPE": "float", "DEFAULT": 0.55, "MIN": 0.0, "MAX": 1.0 }, { "NAME": "uRays", "TYPE": "float", "DEFAULT": 0.91, "MIN": 0.0, "MAX": 2.0 }, { "NAME": "uHue", "TYPE": "float", "DEFAULT": 0.00, "MIN": 0.0, "MAX": 1.0 }, { "NAME": "uVignette", "TYPE": "float", "DEFAULT": 0.60, "MIN": 0.0, "MAX": 1.0 } ] }*/ // MONEY RAIN — ISF port of the Shadertoy/WebGL2 version // (GLSL ES 1.00: fixed loop bounds, gl_FragColor, TIME/RENDERSIZE). #define TAU 6.28318530718 vec3 hueShift(vec3 c, float a){ vec3 k = vec3(0.57735); float ca = cos(a * TAU); float sa = sin(a * TAU); return c * ca + cross(k, c) * sa + k * dot(k, c) * (1.0 - ca); } float hash21(vec2 p){ p = fract(p * vec2(234.34, 435.345)); p += dot(p, p + 34.23); return fract(p.x * p.y); } float hash11(float n){ return fract(sin(n * 127.1) * 43758.5453); } vec2 hash22(vec2 p){ float h = hash21(p); return vec2(h, hash21(p + h + 17.31)); } float noise2(vec2 p){ vec2 i = floor(p), f = fract(p); f = f * f * (3.0 - 2.0 * f); return mix(mix(hash21(i), hash21(i + vec2(1.0, 0.0)), f.x), mix(hash21(i + vec2(0.0, 1.0)), hash21(i + vec2(1.0, 1.0)), f.x), f.y); } mat2 rot(float a){ float c = cos(a), s = sin(a); return mat2(c, -s, s, c); } float sbox(vec2 p, vec2 c, vec2 b, float aa){ vec2 d = abs(p - c) - b; return smoothstep(aa, -aa, max(d.x, d.y)); } float disc(vec2 p, vec2 c, float r, float aa){ return smoothstep(aa, -aa, length(p - c) - r); } float ring(vec2 p, vec2 c, vec2 rad, float th, float aa){ float e = length((p - c) / rad); float a = aa / min(rad.x, rad.y); return smoothstep(th + a, th - a, abs(e - 1.0)); } float sdSeg(vec2 p, vec2 b){ float h = clamp(dot(p, b) / dot(b, b), 0.0, 1.0); return length(p - b * h); } float spiralArm(vec2 q, float b, float phase){ float r = length(q); float a = atan(q.y, q.x) + phase; float n = floor((r / b - a) / TAU + 0.5); return abs(r - b * (a + TAU * n)); } float penta(vec2 p, float R, float w, float aa){ float d = 1e3; for (int i = 0; i < 5; i++){ float a1 = -1.5708 + float(i) * 2.51327; vec2 A = R * vec2(cos(a1), sin(a1)); vec2 B2 = R * vec2(cos(a1 + 2.51327), sin(a1 + 2.51327)); d = min(d, sdSeg(p - A, B2 - A)); } return smoothstep(w + aa, w - aa, d); } float glyph6(vec2 c, float aa){ float g = ring(c, vec2(-0.01, -0.09), vec2(0.13, 0.155), 0.34, aa); vec2 A = vec2(0.12, 0.26); float d = sdSeg(c - A, vec2(-0.06, -0.02) - A); return max(g, smoothstep(0.05 + aa, 0.05 - aa, d)); } float glyph666(vec2 c, float aa){ float g = glyph6(c - vec2(-0.36, 0.0), aa); g = max(g, glyph6(c, aa)); g = max(g, glyph6(c - vec2(0.36, 0.0), aa)); return g; } vec4 drawBill(vec2 p, float side, float rnd, float aa, out float glow){ glow = 0.0; vec2 B = vec2(1.175, 0.5); float dRect = max(abs(p.x) - B.x, abs(p.y) - B.y); float mask = smoothstep(aa, -aa, dRect); if (mask < 0.003) return vec4(0.0); vec2 q = p / B; float aq = aa / B.y; float grain = noise2(p * 34.0 + rnd * 90.0); vec3 paper = vec3(0.87, 0.89, 0.80) * (0.95 + 0.08 * grain); if (side > 0.5) paper = vec3(0.82, 0.88, 0.76) * (0.95 + 0.08 * grain); vec3 ink = vec3(0.13, 0.30, 0.18); vec3 dark = vec3(0.10, 0.12, 0.10); vec3 col = paper; float m = max(abs(q.x), abs(q.y)); float gu = sin(p.x * 46.0 + 3.0 * sin(p.y * 17.0)) * sin(p.y * 38.0 - 2.5 * sin(p.x * 11.0)); col = mix(col, ink, smoothstep(0.55, 0.95, abs(gu)) * 0.10 * smoothstep(0.88, 0.80, m)); float band = smoothstep(aq, -aq, abs(m - 0.905) - 0.055); float lace = 0.72 + 0.28 * sin(q.x * 60.0) * sin(q.y * 30.0); col = mix(col, ink, band * lace); col = mix(col, ink, smoothstep(aq, -aq, abs(m - 0.815) - 0.012) * 0.85); if (side < 0.5){ // alchemist transmutation circle in place of the portrait vec2 ap2 = p - vec2(-0.05, 0.0); float ar = length(ap2); float aang = atan(ap2.y, ap2.x); float alc = smoothstep(aa, -aa, abs(ar - 0.300) - 0.010); alc = max(alc, smoothstep(aa, -aa, abs(ar - 0.268) - 0.006)); alc = max(alc, smoothstep(0.55, 0.85, sin(aang * 24.0)) * smoothstep(aa, -aa, abs(ar - 0.284) - 0.012)); float spD = min(spiralArm(ap2, 0.0153, 0.0), spiralArm(ap2, 0.0153, 3.14159)); float sp = smoothstep(0.009 + aa, 0.009 - aa, spD); sp *= smoothstep(0.245, 0.225, ar) * smoothstep(0.015, 0.032, ar); alc = max(alc, sp); alc = max(alc, smoothstep(aa, -aa, ar - 0.028)); for (int i = 0; i < 3; i++){ float va = 1.5708 + float(i) * 2.0944; vec2 vp = ap2 - 0.26 * vec2(cos(va), sin(va)); alc = max(alc, smoothstep(aa, -aa, abs(length(vp) - 0.030) - 0.007)); } col = mix(col, ink, alc * 0.95); glow = max(glow, alc); vec2 sc = vec2(0.62, -0.04); float sr = length(p - sc); col = mix(col, vec3(0.20, 0.44, 0.26), smoothstep(aa, -aa, sr - 0.145) * 0.55); float pg = penta(p - sc, 0.115, 0.012, aa); col = mix(col, ink, pg); glow = max(glow, pg); col = mix(col, ink, smoothstep(aa, -aa, abs(sr - 0.145) - 0.010)); vec2 fc = vec2(-0.72, 0.05); float fr = length(p - fc); float fa = atan(p.y - fc.y, p.x - fc.x); col = mix(col, dark, smoothstep(aa, -aa, abs(fr - 0.105) - 0.011)); col = mix(col, dark, smoothstep(aa, -aa, abs(fr - 0.070) - 0.009) * smoothstep(0.2, 0.7, 0.5 + 0.5 * sin(fa * 14.0))); float pg2 = penta(p - fc, 0.052, 0.008, aa); col = mix(col, dark, pg2); glow = max(glow, pg2); vec3 serial = vec3(0.15, 0.35, 0.22); col = mix(col, serial, smoothstep(0.5, 0.8, sin(p.x * 70.0)) * sbox(p, vec2(-0.45, 0.30), vec2(0.26, 0.024), aa) * 0.9); col = mix(col, serial, smoothstep(0.5, 0.8, sin(p.x * 70.0 + 2.0)) * sbox(p, vec2(0.42, -0.30), vec2(0.26, 0.024), aa) * 0.9); float capm = smoothstep(0.3, 0.7, sin(p.x * 90.0)); col = mix(col, ink, capm * sbox(p, vec2(0.0, 0.415), vec2(0.40, 0.015), aa) * 0.8); col = mix(col, ink, capm * sbox(p, vec2(-0.05, -0.415), vec2(0.34, 0.015), aa) * 0.8); } else { vec2 gc = vec2(0.0, -0.02); float gr = length(p - gc); float sig = smoothstep(aa, -aa, abs(gr - 0.30) - 0.010); sig = max(sig, smoothstep(aa, -aa, abs(gr - 0.26) - 0.008) * 0.9); sig = max(sig, penta(p - gc, 0.26, 0.014, aa) * 0.95); col = mix(col, ink, sig); glow = max(glow, sig); vec2 tc = p - vec2(-0.70, -0.02); vec2 T0 = vec2(0.0, 0.14); vec2 T1 = vec2(-0.13, -0.09); vec2 T2 = vec2(0.13, -0.09); float dt = min(sdSeg(tc - T0, T1 - T0), min(sdSeg(tc - T1, T2 - T1), sdSeg(tc - T2, T0 - T2))); float eye = smoothstep(0.010 + aa, 0.010 - aa, dt); eye = max(eye, ring(tc, vec2(0.0, -0.015), vec2(0.055, 0.030), 0.35, aa)); eye = max(eye, disc(tc, vec2(0.0, -0.015), 0.012, aa)); col = mix(col, ink, eye); glow = max(glow, eye); float g6 = glyph666((p - vec2(0.60, -0.30)) / 0.20, aa / 0.20); col = mix(col, vec3(0.72, 0.55, 0.20), g6 * 0.9); glow = max(glow, g6); col = mix(col, ink, smoothstep(0.3, 0.7, sin(p.x * 90.0)) * sbox(p, vec2(0.0, 0.40), vec2(0.38, 0.015), aa) * 0.8); } for (int k = 0; k < 4; k++){ vec2 sgn = vec2(k < 2 ? -1.0 : 1.0, (k == 0 || k == 2) ? -1.0 : 1.0); vec2 cc = (p - sgn * vec2(0.80, 0.30)) / 0.17; float cg = glyph666(cc, aa / 0.17); col = mix(col, ink * 0.9, cg * 0.95); glow = max(glow, cg); } // burning: charred noise holes, flickering ember rims, flames float outA = mask; if (uBurn > 0.001){ float h4 = hash11(rnd * 91.7); float lvl = uBurn * (0.05 + 0.75 * h4 * h4); float bn = noise2(p * 6.0 + rnd * 40.0) * 0.6 + noise2(p * 13.0 + rnd * 60.0) * 0.4; float d = bn - lvl; float hole = smoothstep(0.015 + aa, -0.015 - aa, d); float det = smoothstep(0.05, 0.015, aa); col = mix(col, vec3(0.06, 0.045, 0.035), smoothstep(0.12, 0.02, d) * 0.85); float flick = 0.65 + 0.35 * sin(TIME * 9.0 + bn * 40.0 + rnd * 25.0); col += vec3(1.0, 0.30, 0.05) * smoothstep(0.05 + aa, aa, abs(d - 0.012)) * flick * 1.1 * det; float fn = noise2(p * vec2(7.0, 3.5) + vec2(rnd * 30.0, -TIME * 2.2)); float fd = d + 0.055 + 0.09 * fn; float flame = smoothstep(0.055 + aa, aa * 0.5, abs(fd)) * smoothstep(0.01, -0.01, d) * smoothstep(-0.16, -0.03, d) * det; vec3 fcol = mix(vec3(1.0, 0.85, 0.30), vec3(0.85, 0.22, 0.03), clamp(-d * 5.0, 0.0, 1.0)) * (0.8 + 0.5 * flick); col = mix(col, fcol, flame); outA = mask * max(1.0 - hole, flame); } return vec4(col, outA); } void main(){ vec2 res = RENDERSIZE.xy; vec2 fragCoord = gl_FragCoord.xy; vec2 uv = (fragCoord - 0.5 * res) / res.y; float t = TIME; float pxUv = 1.0 / res.y; vec3 bg = mix(vec3(0.008, 0.022, 0.012), vec3(0.045, 0.10, 0.055), smoothstep(-0.9, 0.9, uv.y)); vec2 ld = uv - vec2(0.0, 1.45); float la = atan(ld.x, -ld.y) + sin(t * 0.10) * 0.12; float ray = pow(0.5 + 0.5 * sin(la * 14.0 + t * 0.23), 5.0) * 0.9 + pow(0.5 + 0.5 * sin(la * 23.0 - t * 0.17 + 2.3), 7.0) * 0.65 + pow(0.5 + 0.5 * sin(la * 9.0 + t * 0.11 + 5.1), 4.0) * 0.55 + pow(0.5 + 0.5 * sin(la * 37.0 + t * 0.31 + 1.2), 9.0) * 0.40; ray *= smoothstep(-1.1, 0.9, uv.y) * (0.55 + 0.45 * sin(t * 0.07 + la * 2.0)); bg += vec3(0.10, 0.20, 0.11) * ray * uRays * 0.5; float dust = 0.0; for (int i = 0; i < 3; i++){ float fi = float(i); vec2 du = uv * (14.0 + fi * 10.0); du.y += t * (1.2 + fi * 0.7); du.x += sin(t * 0.4 + fi * 2.1 + uv.y * 2.0) * 0.6; vec2 cellD = floor(du); vec2 fp = fract(du) - 0.5; vec2 jd = hash22(cellD + fi * 17.0) - 0.5; float hd = hash21(cellD * 1.61 + fi * 29.0); float sz = 0.015 + 0.035 * hd; float tw = 0.55 + 0.45 * sin(t * (1.0 + 2.0 * hd) + hd * TAU * 3.0); dust += smoothstep(sz, sz * 0.2, length(fp - jd * 0.7)) * tw * (0.3 + 0.7 * hd) / (1.0 + fi); } bg += vec3(0.55, 0.85, 0.60) * dust * 0.30 * (0.35 + 0.65 * min(uRays, 1.0)); vec3 col = bg; for (int l = 0; l < 8; l++){ float fl = float(l); float z = 3.0 - fl * 0.30; float depthK = clamp((z - 0.9) / 2.1, 0.0, 1.0); float sizeK = max(uSize, 0.2); vec2 su = uv * z / sizeK; su.x += hash11(fl + 3.0) * 13.7; float cw = 1.85; float chh = 1.55; float colId = floor(su.x / cw); float colH = hash11(colId * 13.7 + fl * 101.0); float yy = su.y + t * uSpeed * (0.55 + 0.6 * colH) * 0.85 + colH * 23.0; float row = floor(yy / chh); vec2 cell = vec2(colId, row); float rnd = hash21(cell + fl * 37.0); if (rnd <= clamp(uDensity, 0.0, 1.5) * 0.95){ float h2 = hash21(cell * 1.93 + fl * 7.1); float h3 = hash21(cell * 3.71 + fl * 11.7); vec2 lp = vec2(su.x - (colId + 0.5) * cw, yy - (row + 0.5) * chh); lp -= (hash22(cell + fl * 5.0) - 0.5) * vec2(0.20, 0.30); // leaf-like swoop: wide lateral swing + double-frequency bob float ph = h2 * TAU * 3.0; float flut = min(uFlutter, 1.4); float sw = t * (0.5 + 0.5 * h2) + ph; lp.x += sin(sw) * 0.25 * flut; lp.y += sin(2.0 * sw + 0.7) * 0.09 * flut; float aaPat = z * pxUv / sizeK; // bank into the swing, plus a slow per-bill drift float angB = (h2 - 0.5) * 1.6 + cos(sw) * 0.45 * flut + t * 0.18 * uSpin * (h3 - 0.5); vec2 bp = rot(angB) * lp; // lazy occasional turn-over, nudged by the swing itself float fph = t * (0.20 + 0.75 * h2) * uSpin + h3 * TAU + 0.35 * sin(sw) * flut; float cf = cos(fph); float sn = sin(fph); float sideB = step(cf, 0.0); float scl = 0.335 * (0.82 + 0.36 * h2); bp /= scl; // paper curl as a projected height field: invisible face-on, // a bowed arc when the bill tilts edge-on float curl = 0.40 + 0.55 * h3; float hcurl = curl * (0.16 * bp.x * bp.x - 0.08) + 0.05 * flut * sin(bp.x * 2.6 + sw * 1.7); bp.y = (bp.y - hcurl * sn) / max(abs(cf), 0.10); float glowM = 0.0; vec4 s = drawBill(bp, sideB, h2, aaPat / scl, glowM); float dh = curl * 0.32 * bp.x + 0.13 * flut * cos(bp.x * 2.6 + sw * 1.7); float light = 0.60 + 0.40 * abs(cf) + clamp(0.6 * dh * sn, -0.25, 0.25); if (s.a > 0.003){ vec3 c = s.rgb * light * (1.0 - 0.32 * depthK); c = hueShift(c, (h2 - 0.5) * 0.04); c = mix(c, bg, depthK * 0.45); float gm = clamp(glowM * uGlow, 0.0, 1.5) * (0.7 + 0.3 * sin(t * 2.2 + h2 * TAU)); c = mix(c, vec3(0.55, 0.04, 0.02), min(gm, 1.0) * 0.85); c += vec3(1.0, 0.10, 0.03) * gm * 0.7; col = mix(col, c, s.a); } } } vec2 vc = (fragCoord / res - 0.5) * vec2(res.x / res.y, 1.0); col *= 1.0 - uVignette * 0.85 * dot(vc, vc); col = hueShift(col, uHue); col = pow(max(col, vec3(0.0)), vec3(0.92)); gl_FragColor = vec4(col, 1.0); }
Cursed US $100 bills falling naturally through dusty green vault light: leaf-like swooping descent, banking into each swing, lazy turn-overs, and curled sheets whose bowed silhouette shows when a bill tilts edge-on. Every bill is drawn procedurally (no textures): ornamental border lace, an alchemist transmutation circle (double ring, runic ticks, twin-armed vortex spiral, vertex sigil-circles), pentagram seals, serial dashes, corner 666s, and a Baphomet-style sigil + eye-in-pyramid on the back. A glow slider makes the occult ink throb red; a burn slider chars noise-eaten holes into the paper with flickering ember rims and flames licking into the gaps. Eight parallax depth layers with fog and god rays. Speed, density, size, flutter, spin, glow, burn, rays, hue and vignette on sliders.
export clip · render a video in your browser
Renders to video in your browser (no upload), stepping the real renderer frame by frame so multipass + feedback come out right. motion auto-animates the shader's own knobs — each export rolls a fresh take (🎲 re-roll, 🔒 to pin one you like). GIF is slower with a tighter length cap; MP4/WebM are faster. Some devices record in real time (noted below if so) — keep the tab visible.
embed · drop this shader into any page
Renders client-side in the reader's browser (CC0 — no attribution required, but the backlink is appreciated).