{
  "license": "CC0-1.0",
  "shader": {
    "id": "gsb0sf12",
    "title": "spike world",
    "license": "CC0-1.0",
    "provenance_type": "witnessed_generation",
    "made_with": "glslop",
    "status": "active",
    "compile_ok": true,
    "render_hash": "00000402ffffffff",
    "tags": [
      "silicon dreams",
      "cursed"
    ],
    "parents": [],
    "author": "1gwr295ajjm0",
    "author_name": "mcnuggetsupreme",
    "author_url": "/u/mcnuggetsupreme",
    "created_at": "2026-09-01T20:42:03.977Z",
    "poster_url": "/posters/gsb0sf12.avif",
    "stats": {
      "slops": 0,
      "views": 95,
      "forks": 0
    },
    "self": "/api/v1/shaders/gsb0sf12",
    "isf": "/*{\n  \"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.\",\n  \"CREDIT\": \"Circa\",\n  \"CATEGORIES\": [\"Generator\", \"Surreal\", \"Y2K\"],\n  \"INPUTS\": [\n    {\"NAME\":\"speed\", \"TYPE\":\"float\", \"DEFAULT\":0.28, \"MIN\":0.0, \"MAX\":2.0},\n    {\"NAME\":\"brightness\", \"TYPE\":\"float\", \"DEFAULT\":1.12, \"MIN\":0.4, \"MAX\":2.0},\n    {\"NAME\":\"thornDensity\", \"TYPE\":\"float\", \"DEFAULT\":0.92, \"MIN\":0.15, \"MAX\":1.0},\n    {\"NAME\":\"thornLength\", \"TYPE\":\"float\", \"DEFAULT\":0.85, \"MIN\":0.3, \"MAX\":1.5},\n    {\"NAME\":\"eyeMotion\", \"TYPE\":\"float\", \"DEFAULT\":0.45, \"MIN\":0.0, \"MAX\":1.0},\n    {\"NAME\":\"chromeAmount\", \"TYPE\":\"float\", \"DEFAULT\":0.82, \"MIN\":0.0, \"MAX\":1.0},\n    {\"NAME\":\"glassAmount\", \"TYPE\":\"float\", \"DEFAULT\":0.72, \"MIN\":0.0, \"MAX\":1.0},\n    {\"NAME\":\"grassDetail\", \"TYPE\":\"float\", \"DEFAULT\":0.88, \"MIN\":0.0, \"MAX\":1.0},\n    {\"NAME\":\"dreamWarp\", \"TYPE\":\"float\", \"DEFAULT\":0.24, \"MIN\":0.0, \"MAX\":1.0},\n    {\"NAME\":\"ps2Grit\", \"TYPE\":\"float\", \"DEFAULT\":0.72, \"MIN\":0.0, \"MAX\":1.0},\n    {\"NAME\":\"textureWobble\", \"TYPE\":\"float\", \"DEFAULT\":0.42, \"MIN\":0.0, \"MAX\":1.0},\n    {\"NAME\":\"distanceFog\", \"TYPE\":\"float\", \"DEFAULT\":0.58, \"MIN\":0.0, \"MAX\":1.0}\n  ]\n}*/\n\n#define TAU 6.28318530718\n#define THORNS 40\n\nfloat sat(float x) { return clamp(x, 0.0, 1.0); }\n\nfloat hash21(vec2 p)\n{\n    p = fract(p * vec2(123.34, 456.21));\n    p += dot(p, p + 45.32);\n    return fract(p.x * p.y);\n}\n\nfloat noise21(vec2 p)\n{\n    vec2 i = floor(p);\n    vec2 f = fract(p);\n    f = f * f * (3.0 - 2.0 * f);\n    float a = hash21(i);\n    float b = hash21(i + vec2(1.0, 0.0));\n    float c = hash21(i + vec2(0.0, 1.0));\n    float d = hash21(i + vec2(1.0, 1.0));\n    return mix(mix(a, b, f.x), mix(c, d, f.x), f.y);\n}\n\nfloat fbm(vec2 p)\n{\n    float v = 0.0;\n    float a = 0.5;\n    for (int i = 0; i < 5; i++) {\n        v += noise21(p) * a;\n        p = p * 2.03 + vec2(17.7, 9.2);\n        a *= 0.5;\n    }\n    return v;\n}\n\nfloat sdCircle(vec2 p, float r) { return length(p) - r; }\n\nfloat sdCapsule(vec2 p, vec2 a, vec2 b, float r)\n{\n    vec2 pa = p - a;\n    vec2 ba = b - a;\n    float h = sat(dot(pa, ba) / max(dot(ba, ba), 0.0001));\n    return length(pa - ba * h) - r;\n}\n\nvec3 sky(float y)\n{\n    return mix(vec3(0.43, 0.58, 0.59), vec3(0.18, 0.30, 0.34), smoothstep(0.24, 1.0, y));\n}\n\nvec3 grass(vec2 uv, float horizon, float t)\n{\n    float z = 0.075 / max(horizon - uv.y, 0.005);\n    vec2 w = vec2((uv.x - 0.5) * z * 4.8, z + t * 0.018);\n    float broad = fbm(w * vec2(0.7, 0.16));\n    float fine = fbm(w * vec2(5.5, 0.9));\n    vec3 col = mix(vec3(0.012, 0.018, 0.009), vec3(0.105, 0.105, 0.042), broad);\n    col = mix(col, vec3(0.21, 0.19, 0.070), fine * 0.34);\n    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);\n    col += vec3(0.14, 0.17, 0.045) * blade * grassDetail;\n    float dew = pow(max(0.0, sin(w.x * 137.0 + w.y * 17.0)), 28.0);\n    dew *= step(0.93, hash21(floor(w * 41.0)));\n    col += vec3(0.43, 0.59, 0.55) * dew * grassDetail * 0.6;\n    return col;\n}\n\nvec3 chromeRibbon(vec2 uv, float y, float amp, float phase, float width, vec3 bg)\n{\n    float curve = y + sin(uv.x * 7.0 + phase) * amp + sin(uv.x * 17.0 - phase) * amp * 0.16;\n    float d = abs(uv.y - curve);\n    float body = 1.0 - smoothstep(width, width + 0.004, d);\n    float edge = exp(-120.0 * abs(d - width));\n    float bands = 0.5 + 0.5 * sin(d * 420.0 + uv.x * 18.0);\n    bands = floor(bands * 7.0) / 7.0;\n    vec3 metal = mix(vec3(0.018, 0.032, 0.038), vec3(0.48, 0.61, 0.63), bands);\n    metal += vec3(0.82, 0.88, 0.84) * pow(bands, 12.0) * chromeAmount;\n    vec3 col = mix(bg, metal, body * chromeAmount);\n    return col + vec3(0.72, 0.97, 1.0) * edge * chromeAmount;\n}\n\nvec3 glassLoop(vec2 uv, vec2 center, vec2 radius, float phase, vec3 bg)\n{\n    vec2 p = (uv - center) / radius;\n    p = mix(p, floor(p * 24.0 + 0.5) / 24.0, ps2Grit * 0.42);\n    float ring = abs(length(p) - 1.0);\n    float body = 1.0 - smoothstep(0.075, 0.10, ring);\n    float edge = exp(-65.0 * abs(ring - 0.075));\n    float refractBand = 0.5 + 0.5 * sin(p.y * 14.0 + p.x * 5.0 + phase);\n    refractBand = floor(refractBand * 6.0) / 6.0;\n    vec3 glass = mix(vec3(0.025, 0.17, 0.21), vec3(0.42, 0.67, 0.68), refractBand);\n    vec3 col = mix(bg, glass, body * glassAmount * 0.62);\n    col += vec3(0.72, 1.0, 1.0) * edge * glassAmount;\n    return col;\n}\n\nvec3 boneArch(vec2 uv, vec2 center, vec2 radius, float lean, vec3 bg)\n{\n    vec2 p = (uv - center) / radius;\n    p.x += p.y * lean;\n    float outer = abs(length(p) - 1.0);\n    float archGate = smoothstep(-0.22, 0.04, p.y);\n    float body = (1.0 - smoothstep(0.055, 0.085, outer)) * archGate;\n    float facets = floor((0.5 + 0.5 * sin(atan(p.y, p.x) * 13.0)) * 5.0) / 5.0;\n    float grime = noise21(floor(p * 19.0) + 7.0);\n    vec3 bone = mix(vec3(0.12, 0.13, 0.11), vec3(0.48, 0.49, 0.43), facets);\n    bone *= 0.68 + grime * 0.32;\n    return mix(bg, bone, body);\n}\n\nvec3 mirrorBall(vec2 uv, vec2 center, float radius, vec3 bg)\n{\n    vec2 p = (uv - center) / radius;\n    float rr = dot(p, p);\n    float mask = 1.0 - smoothstep(0.94, 1.01, sqrt(rr));\n    float z = sqrt(max(0.0, 1.0 - rr));\n    vec3 n = normalize(vec3(p, z));\n    vec3 reflection = sky(n.y * 0.5 + 0.5);\n    reflection = mix(reflection, vec3(0.01, 0.18, 0.025), smoothstep(0.0, -0.72, n.y));\n    reflection *= 1.0 - exp(-24.0 * abs(n.y + 0.12)) * 0.75;\n    float hi = pow(max(0.0, dot(n, normalize(vec3(-0.6, 0.7, 1.0)))), 48.0);\n    reflection += vec3(0.86, 0.90, 0.85) * hi * 1.15;\n    reflection += vec3(0.25, 0.66, 0.86) * pow(1.0 - max(n.z, 0.0), 3.0);\n    return mix(bg, reflection, mask);\n}\n\nvec3 eyeOrb(vec2 uv, vec2 center, float scale, float phase, float seed, vec3 bg)\n{\n    vec2 p = (uv - center) / scale;\n    vec3 col = bg;\n    float bodyR = 0.255;\n\n    /* Dense physical thorns: short tapered silhouettes, not luminous spokes. */\n    for (int i = 0; i < THORNS; i++) {\n        float fi = float(i);\n        float enabled = step(fi / float(THORNS), thornDensity);\n        float a = fi / float(THORNS) * TAU;\n        a += (hash21(vec2(fi, seed)) - 0.5) * 0.22;\n        vec2 dir = vec2(cos(a), sin(a));\n        vec2 tanDir = vec2(-dir.y, dir.x);\n        float rnd = hash21(vec2(fi * 3.17, seed * 7.3));\n        float len = mix(0.10, 0.27, rnd) * thornLength;\n        vec2 root = dir * 0.205;\n        vec2 tip = dir * (bodyR + len) + tanDir * (rnd - 0.5) * 0.055;\n        vec2 axis = tip - root;\n        float prog = sat(dot(p - root, axis) / max(dot(axis, axis), 0.0001));\n        float d = sdCapsule(p, root, tip, mix(0.026, 0.003, prog));\n        float mask = (1.0 - smoothstep(-0.004, 0.006, d)) * enabled;\n        float light = sat(0.28 + dir.y * 0.55);\n        light = floor(light * 5.0) / 5.0;\n        vec3 thorn = mix(vec3(0.001, 0.006, 0.006), vec3(0.035, 0.105, 0.070), light);\n        thorn += vec3(0.25, 0.43, 0.34) * pow(light, 6.0) * chromeAmount;\n        col = mix(col, thorn, mask);\n    }\n\n    float bd = sdCircle(p, bodyR);\n    float body = 1.0 - smoothstep(-0.008, 0.010, bd);\n    vec2 bp = p / bodyR;\n    float bz = sqrt(max(0.0, 1.0 - dot(bp, bp)));\n    vec3 bn = normalize(vec3(bp, bz));\n    float bl = sat(dot(bn, normalize(vec3(-0.65, 0.75, 1.0))));\n    float pores = noise21(p * 48.0 + seed) * 0.05;\n    bl = floor(bl * 7.0) / 7.0;\n    vec3 resin = mix(vec3(0.001, 0.007, 0.006), vec3(0.025, 0.095, 0.063), bl);\n    resin += pores * 0.65 + vec3(0.32, 0.47, 0.37) * pow(bl, 15.0);\n    col = mix(col, resin, body);\n\n    vec2 look = vec2(sin(phase * 0.43), cos(phase * 0.31)) * 0.023 * eyeMotion;\n    vec2 ep = p - look;\n    float ed = sdCircle(ep, 0.157);\n    float em = 1.0 - smoothstep(-0.006, 0.008, ed);\n    vec2 esp = ep / 0.157;\n    float ez = sqrt(max(0.0, 1.0 - dot(esp, esp)));\n    vec3 en = normalize(vec3(esp, ez));\n    float el = sat(dot(en, normalize(vec3(-0.55, 0.72, 1.0))));\n    el = floor(el * 8.0) / 8.0;\n    vec3 sclera = mix(vec3(0.26, 0.29, 0.25), vec3(0.79, 0.76, 0.62), el);\n    float irisD = length(ep - look * 0.3);\n    float iris = 1.0 - smoothstep(0.058, 0.072, irisD);\n    float pupil = 1.0 - smoothstep(0.019, 0.031, irisD);\n    float fibers = 0.5 + 0.5 * sin(atan(ep.y, ep.x) * 25.0 + irisD * 190.0);\n    vec3 irisCol = mix(vec3(0.005, 0.055, 0.07), vec3(0.16, 0.62, 0.70), fibers);\n    vec3 eye = mix(sclera, irisCol, iris);\n    eye = mix(eye, vec3(0.001, 0.004, 0.006), pupil);\n    float highlight = 1.0 - smoothstep(0.014, 0.029, length(ep - vec2(-0.052, 0.058)));\n    eye += vec3(1.0, 1.0, 0.96) * highlight * 1.6;\n    col = mix(col, eye, em);\n    return col;\n}\n\nvoid main()\n{\n    vec2 uv = isf_FragNormCoord.xy;\n    float t = TIME * speed;\n\n    /* The artwork is authored directly in SoundCloud's 62:13 ratio. */\n    float targetAspect = 2480.0 / 520.0;\n    float renderAspect = RENDERSIZE.x / max(RENDERSIZE.y, 1.0);\n    vec2 sceneUV = uv;\n    sceneUV.x = (sceneUV.x - 0.5) * renderAspect / targetAspect + 0.5;\n    sceneUV.x += sin(t * 0.11) * 0.004 * dreamWarp;\n\n    /* Affine-style texture instability without destroying the composition. */\n    vec2 wobbleCell = floor(uv * vec2(180.0, 42.0));\n    float wobbleNoise = hash21(wobbleCell + floor(t * 10.0));\n    sceneUV.x += (wobbleNoise - 0.5) * 0.0015 * textureWobble;\n    sceneUV.y += (hash21(wobbleCell.yx + 31.0) - 0.5) * 0.0010 * textureWobble;\n\n    float horizon = 0.455;\n    vec3 color = sky(uv.y);\n    float haze = fbm(vec2(sceneUV.x * 3.0 + t * 0.012, uv.y * 4.0));\n    color += vec3(0.23, 0.32, 0.33) * haze * smoothstep(0.32, 0.78, uv.y) * 0.20;\n\n    if (uv.y < horizon) {\n        color = mix(color, grass(uv, horizon, t), smoothstep(horizon, horizon - 0.012, uv.y));\n    }\n\n    float hill = horizon + 0.015 + sin(sceneUV.x * 19.0) * 0.021 + sin(sceneUV.x * 43.0) * 0.008;\n    float hillMask = 1.0 - smoothstep(hill, hill + 0.008, uv.y);\n    vec3 hillCol = mix(vec3(0.025, 0.045, 0.019), vec3(0.14, 0.15, 0.050), fbm(sceneUV * 15.0));\n    color = mix(color, hillCol, hillMask * smoothstep(0.37, 0.47, uv.y));\n\n    color = glassLoop(sceneUV, vec2(0.12, 0.54), vec2(0.12, 0.37), t * 0.08, color);\n    color = glassLoop(sceneUV, vec2(0.84, 0.55), vec2(0.15, 0.40), -t * 0.07, color);\n    color = glassLoop(sceneUV, vec2(0.57, 0.52), vec2(0.075, 0.25), t * 0.06 + 2.0, color);\n\n    color = boneArch(sceneUV, vec2(0.20, 0.47), vec2(0.070, 0.31), -0.22, color);\n    color = boneArch(sceneUV, vec2(0.71, 0.47), vec2(0.060, 0.27), 0.18, color);\n    color = boneArch(sceneUV, vec2(0.33, 0.45), vec2(0.035, 0.16), 0.11, color);\n\n    color = chromeRibbon(sceneUV, 0.69, 0.130, t * 0.06 + 1.0, 0.008, color);\n    color = chromeRibbon(sceneUV, 0.55, 0.115, -t * 0.05 + 4.0, 0.006, color);\n\n    color = mirrorBall(sceneUV, vec2(0.34, 0.71 + sin(t * 0.24) * 0.012), 0.015, color);\n    color = mirrorBall(sceneUV, vec2(0.65, 0.79 + cos(t * 0.21) * 0.014), 0.024, color);\n    color = mirrorBall(sceneUV, vec2(0.78, 0.68 + sin(t * 0.18) * 0.009), 0.010, color);\n\n    /* Fully visible hero and two fog-distance creatures. */\n    color = eyeOrb(sceneUV, vec2(0.57, 0.43 + cos(t * 0.27) * 0.007), 0.060, t + 7.1, 9.0, color);\n    color = eyeOrb(sceneUV, vec2(0.50, 0.455 + sin(t * 0.19) * 0.004), 0.025, t + 4.4, 5.0, color);\n    color = eyeOrb(sceneUV, vec2(0.43, 0.39 + sin(t * 0.22) * 0.010), 0.118, t, 1.0, color);\n\n    float horizonGlow = exp(-32.0 * abs(uv.y - horizon));\n    color += vec3(0.26, 0.42, 0.46) * horizonGlow * 0.13;\n\n    /* Blue-green distance fog and murky console-era draw distance. */\n    float fogMask = exp(-18.0 * abs(uv.y - horizon));\n    fogMask += smoothstep(0.55, 0.88, uv.y) * 0.18;\n    color = mix(color, vec3(0.21, 0.31, 0.31), sat(fogMask * distanceFog * 0.62));\n    float spectral = sin(uv.x * 29.0 + uv.y * 9.0 + t);\n    color.r += spectral * dreamWarp * 0.004;\n    color.b -= spectral * dreamWarp * 0.003;\n\n    float vignette = 1.0 - smoothstep(0.50, 0.88, length((uv - 0.5) * vec2(0.62, 1.0)));\n    color *= 0.90 + 0.10 * vignette;\n    /* Bayer-like ordered dither, low color precision and capture grit. */\n    vec2 dp = mod(floor(gl_FragCoord.xy), 4.0);\n    float dither = fract(dp.x * 0.5 + dp.y * 0.25) - 0.5;\n    color += dither * ps2Grit / 110.0;\n    float grain = hash21(gl_FragCoord.xy + floor(t * 24.0)) - 0.5;\n    color += grain * ps2Grit * 0.022;\n    color = mix(color, floor(color * 31.0 + 0.5) / 31.0, ps2Grit * 0.68);\n    color *= brightness;\n    color = max(color, vec3(0.0));\n    color = color / (0.84 + color * 0.22);\n    color = pow(color, vec3(1.02));\n    gl_FragColor = vec4(color, 1.0);\n}\n",
    "generator": {
      "model": "5.6 sol light",
      "provider": null,
      "prompt": null,
      "params": null
    }
  }
}