experimental backend WebGL2 · not opted in
Enable WebGPU controls in settings. WebGL2 remains unchanged. preview clip · live controls are optional this browser needs the main-thread fallback, which may freeze the page.
0.28
1.12
0.92
0.85
0.45
0.82
0.72
0.88
0.24
0.72
0.42
0.58
/*{ "DESCRIPTION": "Gritty late-PS2 Silicon Dreams panorama with thorned eye organisms, coarse grass, fog, faceted glass and tarnished chrome. Composed for a 2480x520 SoundCloud header.", "CREDIT": "Circa", "CATEGORIES": ["Generator", "Surreal", "Y2K"], "INPUTS": [ {"NAME":"speed", "TYPE":"float", "DEFAULT":0.28, "MIN":0.0, "MAX":2.0}, {"NAME":"brightness", "TYPE":"float", "DEFAULT":1.12, "MIN":0.4, "MAX":2.0}, {"NAME":"thornDensity", "TYPE":"float", "DEFAULT":0.92, "MIN":0.15, "MAX":1.0}, {"NAME":"thornLength", "TYPE":"float", "DEFAULT":0.85, "MIN":0.3, "MAX":1.5}, {"NAME":"eyeMotion", "TYPE":"float", "DEFAULT":0.45, "MIN":0.0, "MAX":1.0}, {"NAME":"chromeAmount", "TYPE":"float", "DEFAULT":0.82, "MIN":0.0, "MAX":1.0}, {"NAME":"glassAmount", "TYPE":"float", "DEFAULT":0.72, "MIN":0.0, "MAX":1.0}, {"NAME":"grassDetail", "TYPE":"float", "DEFAULT":0.88, "MIN":0.0, "MAX":1.0}, {"NAME":"dreamWarp", "TYPE":"float", "DEFAULT":0.24, "MIN":0.0, "MAX":1.0}, {"NAME":"ps2Grit", "TYPE":"float", "DEFAULT":0.72, "MIN":0.0, "MAX":1.0}, {"NAME":"textureWobble", "TYPE":"float", "DEFAULT":0.42, "MIN":0.0, "MAX":1.0}, {"NAME":"distanceFog", "TYPE":"float", "DEFAULT":0.58, "MIN":0.0, "MAX":1.0} ] }*/ #define TAU 6.28318530718 #define THORNS 40 float sat(float x) { return clamp(x, 0.0, 1.0); } float hash21(vec2 p) { p = fract(p * vec2(123.34, 456.21)); p += dot(p, p + 45.32); return fract(p.x * p.y); } float noise21(vec2 p) { vec2 i = floor(p); vec2 f = fract(p); f = f * f * (3.0 - 2.0 * f); float a = hash21(i); float b = hash21(i + vec2(1.0, 0.0)); float c = hash21(i + vec2(0.0, 1.0)); float d = hash21(i + vec2(1.0, 1.0)); return mix(mix(a, b, f.x), mix(c, d, f.x), f.y); } float fbm(vec2 p) { float v = 0.0; float a = 0.5; for (int i = 0; i < 5; i++) { v += noise21(p) * a; p = p * 2.03 + vec2(17.7, 9.2); a *= 0.5; } return v; } float sdCircle(vec2 p, float r) { return length(p) - r; } float sdCapsule(vec2 p, vec2 a, vec2 b, float r) { vec2 pa = p - a; vec2 ba = b - a; float h = sat(dot(pa, ba) / max(dot(ba, ba), 0.0001)); return length(pa - ba * h) - r; } vec3 sky(float y) { return mix(vec3(0.43, 0.58, 0.59), vec3(0.18, 0.30, 0.34), smoothstep(0.24, 1.0, y)); } vec3 grass(vec2 uv, float horizon, float t) { float z = 0.075 / max(horizon - uv.y, 0.005); vec2 w = vec2((uv.x - 0.5) * z * 4.8, z + t * 0.018); float broad = fbm(w * vec2(0.7, 0.16)); float fine = fbm(w * vec2(5.5, 0.9)); vec3 col = mix(vec3(0.012, 0.018, 0.009), vec3(0.105, 0.105, 0.042), broad); col = mix(col, vec3(0.21, 0.19, 0.070), fine * 0.34); float blade = pow(max(0.0, sin(w.x * 91.0 + w.y * 7.0) * sin(w.x * 37.0 - w.y * 13.0)), 9.0); col += vec3(0.14, 0.17, 0.045) * blade * grassDetail; float dew = pow(max(0.0, sin(w.x * 137.0 + w.y * 17.0)), 28.0); dew *= step(0.93, hash21(floor(w * 41.0))); col += vec3(0.43, 0.59, 0.55) * dew * grassDetail * 0.6; return col; } vec3 chromeRibbon(vec2 uv, float y, float amp, float phase, float width, vec3 bg) { float curve = y + sin(uv.x * 7.0 + phase) * amp + sin(uv.x * 17.0 - phase) * amp * 0.16; float d = abs(uv.y - curve); float body = 1.0 - smoothstep(width, width + 0.004, d); float edge = exp(-120.0 * abs(d - width)); float bands = 0.5 + 0.5 * sin(d * 420.0 + uv.x * 18.0); bands = floor(bands * 7.0) / 7.0; vec3 metal = mix(vec3(0.018, 0.032, 0.038), vec3(0.48, 0.61, 0.63), bands); metal += vec3(0.82, 0.88, 0.84) * pow(bands, 12.0) * chromeAmount; vec3 col = mix(bg, metal, body * chromeAmount); return col + vec3(0.72, 0.97, 1.0) * edge * chromeAmount; } vec3 glassLoop(vec2 uv, vec2 center, vec2 radius, float phase, vec3 bg) { vec2 p = (uv - center) / radius; p = mix(p, floor(p * 24.0 + 0.5) / 24.0, ps2Grit * 0.42); float ring = abs(length(p) - 1.0); float body = 1.0 - smoothstep(0.075, 0.10, ring); float edge = exp(-65.0 * abs(ring - 0.075)); float refractBand = 0.5 + 0.5 * sin(p.y * 14.0 + p.x * 5.0 + phase); refractBand = floor(refractBand * 6.0) / 6.0; vec3 glass = mix(vec3(0.025, 0.17, 0.21), vec3(0.42, 0.67, 0.68), refractBand); vec3 col = mix(bg, glass, body * glassAmount * 0.62); col += vec3(0.72, 1.0, 1.0) * edge * glassAmount; return col; } vec3 boneArch(vec2 uv, vec2 center, vec2 radius, float lean, vec3 bg) { vec2 p = (uv - center) / radius; p.x += p.y * lean; float outer = abs(length(p) - 1.0); float archGate = smoothstep(-0.22, 0.04, p.y); float body = (1.0 - smoothstep(0.055, 0.085, outer)) * archGate; float facets = floor((0.5 + 0.5 * sin(atan(p.y, p.x) * 13.0)) * 5.0) / 5.0; float grime = noise21(floor(p * 19.0) + 7.0); vec3 bone = mix(vec3(0.12, 0.13, 0.11), vec3(0.48, 0.49, 0.43), facets); bone *= 0.68 + grime * 0.32; return mix(bg, bone, body); } vec3 mirrorBall(vec2 uv, vec2 center, float radius, vec3 bg) { vec2 p = (uv - center) / radius; float rr = dot(p, p); float mask = 1.0 - smoothstep(0.94, 1.01, sqrt(rr)); float z = sqrt(max(0.0, 1.0 - rr)); vec3 n = normalize(vec3(p, z)); vec3 reflection = sky(n.y * 0.5 + 0.5); reflection = mix(reflection, vec3(0.01, 0.18, 0.025), smoothstep(0.0, -0.72, n.y)); reflection *= 1.0 - exp(-24.0 * abs(n.y + 0.12)) * 0.75; float hi = pow(max(0.0, dot(n, normalize(vec3(-0.6, 0.7, 1.0)))), 48.0); reflection += vec3(0.86, 0.90, 0.85) * hi * 1.15; reflection += vec3(0.25, 0.66, 0.86) * pow(1.0 - max(n.z, 0.0), 3.0); return mix(bg, reflection, mask); } vec3 eyeOrb(vec2 uv, vec2 center, float scale, float phase, float seed, vec3 bg) { vec2 p = (uv - center) / scale; vec3 col = bg; float bodyR = 0.255; /* Dense physical thorns: short tapered silhouettes, not luminous spokes. */ for (int i = 0; i < THORNS; i++) { float fi = float(i); float enabled = step(fi / float(THORNS), thornDensity); float a = fi / float(THORNS) * TAU; a += (hash21(vec2(fi, seed)) - 0.5) * 0.22; vec2 dir = vec2(cos(a), sin(a)); vec2 tanDir = vec2(-dir.y, dir.x); float rnd = hash21(vec2(fi * 3.17, seed * 7.3)); float len = mix(0.10, 0.27, rnd) * thornLength; vec2 root = dir * 0.205; vec2 tip = dir * (bodyR + len) + tanDir * (rnd - 0.5) * 0.055; vec2 axis = tip - root; float prog = sat(dot(p - root, axis) / max(dot(axis, axis), 0.0001)); float d = sdCapsule(p, root, tip, mix(0.026, 0.003, prog)); float mask = (1.0 - smoothstep(-0.004, 0.006, d)) * enabled; float light = sat(0.28 + dir.y * 0.55); light = floor(light * 5.0) / 5.0; vec3 thorn = mix(vec3(0.001, 0.006, 0.006), vec3(0.035, 0.105, 0.070), light); thorn += vec3(0.25, 0.43, 0.34) * pow(light, 6.0) * chromeAmount; col = mix(col, thorn, mask); } float bd = sdCircle(p, bodyR); float body = 1.0 - smoothstep(-0.008, 0.010, bd); vec2 bp = p / bodyR; float bz = sqrt(max(0.0, 1.0 - dot(bp, bp))); vec3 bn = normalize(vec3(bp, bz)); float bl = sat(dot(bn, normalize(vec3(-0.65, 0.75, 1.0)))); float pores = noise21(p * 48.0 + seed) * 0.05; bl = floor(bl * 7.0) / 7.0; vec3 resin = mix(vec3(0.001, 0.007, 0.006), vec3(0.025, 0.095, 0.063), bl); resin += pores * 0.65 + vec3(0.32, 0.47, 0.37) * pow(bl, 15.0); col = mix(col, resin, body); vec2 look = vec2(sin(phase * 0.43), cos(phase * 0.31)) * 0.023 * eyeMotion; vec2 ep = p - look; float ed = sdCircle(ep, 0.157); float em = 1.0 - smoothstep(-0.006, 0.008, ed); vec2 esp = ep / 0.157; float ez = sqrt(max(0.0, 1.0 - dot(esp, esp))); vec3 en = normalize(vec3(esp, ez)); float el = sat(dot(en, normalize(vec3(-0.55, 0.72, 1.0)))); el = floor(el * 8.0) / 8.0; vec3 sclera = mix(vec3(0.26, 0.29, 0.25), vec3(0.79, 0.76, 0.62), el); float irisD = length(ep - look * 0.3); float iris = 1.0 - smoothstep(0.058, 0.072, irisD); float pupil = 1.0 - smoothstep(0.019, 0.031, irisD); float fibers = 0.5 + 0.5 * sin(atan(ep.y, ep.x) * 25.0 + irisD * 190.0); vec3 irisCol = mix(vec3(0.005, 0.055, 0.07), vec3(0.16, 0.62, 0.70), fibers); vec3 eye = mix(sclera, irisCol, iris); eye = mix(eye, vec3(0.001, 0.004, 0.006), pupil); float highlight = 1.0 - smoothstep(0.014, 0.029, length(ep - vec2(-0.052, 0.058))); eye += vec3(1.0, 1.0, 0.96) * highlight * 1.6; col = mix(col, eye, em); return col; } void main() { vec2 uv = isf_FragNormCoord.xy; float t = TIME * speed; /* The artwork is authored directly in SoundCloud's 62:13 ratio. */ float targetAspect = 2480.0 / 520.0; float renderAspect = RENDERSIZE.x / max(RENDERSIZE.y, 1.0); vec2 sceneUV = uv; sceneUV.x = (sceneUV.x - 0.5) * renderAspect / targetAspect + 0.5; sceneUV.x += sin(t * 0.11) * 0.004 * dreamWarp; /* Affine-style texture instability without destroying the composition. */ vec2 wobbleCell = floor(uv * vec2(180.0, 42.0)); float wobbleNoise = hash21(wobbleCell + floor(t * 10.0)); sceneUV.x += (wobbleNoise - 0.5) * 0.0015 * textureWobble; sceneUV.y += (hash21(wobbleCell.yx + 31.0) - 0.5) * 0.0010 * textureWobble; float horizon = 0.455; vec3 color = sky(uv.y); float haze = fbm(vec2(sceneUV.x * 3.0 + t * 0.012, uv.y * 4.0)); color += vec3(0.23, 0.32, 0.33) * haze * smoothstep(0.32, 0.78, uv.y) * 0.20; if (uv.y < horizon) { color = mix(color, grass(uv, horizon, t), smoothstep(horizon, horizon - 0.012, uv.y)); } float hill = horizon + 0.015 + sin(sceneUV.x * 19.0) * 0.021 + sin(sceneUV.x * 43.0) * 0.008; float hillMask = 1.0 - smoothstep(hill, hill + 0.008, uv.y); vec3 hillCol = mix(vec3(0.025, 0.045, 0.019), vec3(0.14, 0.15, 0.050), fbm(sceneUV * 15.0)); color = mix(color, hillCol, hillMask * smoothstep(0.37, 0.47, uv.y)); color = glassLoop(sceneUV, vec2(0.12, 0.54), vec2(0.12, 0.37), t * 0.08, color); color = glassLoop(sceneUV, vec2(0.84, 0.55), vec2(0.15, 0.40), -t * 0.07, color); color = glassLoop(sceneUV, vec2(0.57, 0.52), vec2(0.075, 0.25), t * 0.06 + 2.0, color); color = boneArch(sceneUV, vec2(0.20, 0.47), vec2(0.070, 0.31), -0.22, color); color = boneArch(sceneUV, vec2(0.71, 0.47), vec2(0.060, 0.27), 0.18, color); color = boneArch(sceneUV, vec2(0.33, 0.45), vec2(0.035, 0.16), 0.11, color); color = chromeRibbon(sceneUV, 0.69, 0.130, t * 0.06 + 1.0, 0.008, color); color = chromeRibbon(sceneUV, 0.55, 0.115, -t * 0.05 + 4.0, 0.006, color); color = mirrorBall(sceneUV, vec2(0.34, 0.71 + sin(t * 0.24) * 0.012), 0.015, color); color = mirrorBall(sceneUV, vec2(0.65, 0.79 + cos(t * 0.21) * 0.014), 0.024, color); color = mirrorBall(sceneUV, vec2(0.78, 0.68 + sin(t * 0.18) * 0.009), 0.010, color); /* Fully visible hero and two fog-distance creatures. */ color = eyeOrb(sceneUV, vec2(0.57, 0.43 + cos(t * 0.27) * 0.007), 0.060, t + 7.1, 9.0, color); color = eyeOrb(sceneUV, vec2(0.50, 0.455 + sin(t * 0.19) * 0.004), 0.025, t + 4.4, 5.0, color); color = eyeOrb(sceneUV, vec2(0.43, 0.39 + sin(t * 0.22) * 0.010), 0.118, t, 1.0, color); float horizonGlow = exp(-32.0 * abs(uv.y - horizon)); color += vec3(0.26, 0.42, 0.46) * horizonGlow * 0.13; /* Blue-green distance fog and murky console-era draw distance. */ float fogMask = exp(-18.0 * abs(uv.y - horizon)); fogMask += smoothstep(0.55, 0.88, uv.y) * 0.18; color = mix(color, vec3(0.21, 0.31, 0.31), sat(fogMask * distanceFog * 0.62)); float spectral = sin(uv.x * 29.0 + uv.y * 9.0 + t); color.r += spectral * dreamWarp * 0.004; color.b -= spectral * dreamWarp * 0.003; float vignette = 1.0 - smoothstep(0.50, 0.88, length((uv - 0.5) * vec2(0.62, 1.0))); color *= 0.90 + 0.10 * vignette; /* Bayer-like ordered dither, low color precision and capture grit. */ vec2 dp = mod(floor(gl_FragCoord.xy), 4.0); float dither = fract(dp.x * 0.5 + dp.y * 0.25) - 0.5; color += dither * ps2Grit / 110.0; float grain = hash21(gl_FragCoord.xy + floor(t * 24.0)) - 0.5; color += grain * ps2Grit * 0.022; color = mix(color, floor(color * 31.0 + 0.5) / 31.0, ps2Grit * 0.68); color *= brightness; color = max(color, vec3(0.0)); color = color / (0.84 + color * 0.22); color = pow(color, vec3(1.02)); gl_FragColor = vec4(color, 1.0); }
Gritty late-PS2 Silicon Dreams panorama with thorned eye organisms, coarse grass, fog, faceted glass and tarnished chrome. Composed for a 2480x520 SoundCloud header.
by mcnuggetsupremewitnessed_generationmade with glslopCC0-1.0credit: Circaactive·created 2026-09-01 20:42Z94 views0 forks12 params5.6 sol light
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.
caps: ≤1920 per side, ≤60fps, ≤18000 frames (GIF ≤300)
embed · drop this shader into any page
Renders client-side in the reader's browser (CC0 — no attribution required, but the backlink is appreciated).