/*{ "DESCRIPTION": "Raymarched flesh tunnel: Voronoi tumor lobes, pleated sphincter gates, veins (red/blue/capillary), parasites and wriggling surface worms, infection zones with near-black rot, heartbeat throb, black & red ambient occlusion, wet two-lobe specular. Every knob exposed.", "CREDIT": "kevin", "CATEGORIES": ["generator", "organic", "horror"], "INPUTS": [ { "NAME": "speed", "TYPE": "float", "DEFAULT": 1.0, "MIN": 0.0, "MAX": 3.0 }, { "NAME": "pulseOn", "TYPE": "bool", "DEFAULT": true }, { "NAME": "pulseSpeed", "TYPE": "float", "DEFAULT": 1.0, "MIN": 0.2, "MAX": 3.0 }, { "NAME": "wiggleSpeed", "TYPE": "float", "DEFAULT": 1.0, "MIN": 0.0, "MAX": 3.0 }, { "NAME": "lobeScale", "TYPE": "float", "DEFAULT": 0.85, "MIN": 0.4, "MAX": 2.0 }, { "NAME": "lobeAmp", "TYPE": "float", "DEFAULT": 0.42, "MIN": 0.0, "MAX": 0.8 }, { "NAME": "wrinkle", "TYPE": "float", "DEFAULT": 0.14, "MIN": 0.0, "MAX": 0.3 }, { "NAME": "groove", "TYPE": "float", "DEFAULT": 0.09, "MIN": 0.0, "MAX": 0.2 }, { "NAME": "gateAmt", "TYPE": "float", "DEFAULT": 0.38, "MIN": 0.0, "MAX": 0.7 }, { "NAME": "paraAmt", "TYPE": "float", "DEFAULT": 1.0, "MIN": 0.0, "MAX": 2.0 }, { "NAME": "wigAmt", "TYPE": "float", "DEFAULT": 1.0, "MIN": 0.0, "MAX": 2.0 }, { "NAME": "veinAmt", "TYPE": "float", "DEFAULT": 1.0, "MIN": 0.0, "MAX": 2.0 }, { "NAME": "disease", "TYPE": "float", "DEFAULT": 1.0, "MIN": 0.0, "MAX": 2.0 }, { "NAME": "hueShiftAmt", "TYPE": "float", "DEFAULT": 0.0, "MIN": -0.5, "MAX": 0.5 }, { "NAME": "saturation", "TYPE": "float", "DEFAULT": 1.0, "MIN": 0.0, "MAX": 2.0 }, { "NAME": "brightness", "TYPE": "float", "DEFAULT": 1.0, "MIN": 0.4, "MAX": 1.8 } ] }*/ // FLESH TUNNEL — disgusting / sickly / organic // ISF port of the Shadertoy version (audio reactivity omitted; ISF has no audio input here). #define SPEED speed #define PULSE_ON (pulseOn ? 1.0 : 0.0) #define PULSE_SPEED pulseSpeed #define WIGGLE_SPEED wiggleSpeed #define LOBE_SCALE lobeScale #define LOBE_AMP lobeAmp #define WRINKLE wrinkle #define GROOVE groove #define GATE gateAmt #define PARA_AMT paraAmt #define WIG_AMT wigAmt #define VEIN_AMT veinAmt #define DISEASE disease #define HUE_SHIFT hueShiftAmt #define SATURATION saturation #define BRIGHTNESS brightness vec3 hueShift(vec3 c, float a){ vec3 k = vec3(0.57735); float ca = cos(a * 6.28318); float sa = sin(a * 6.28318); return c * ca + cross(k, c) * sa + k * dot(k, c) * (1.0 - ca); } float hash(vec3 p){ p = fract(p * 0.3183099 + vec3(0.1, 0.2, 0.3)); p *= 17.0; return fract(p.x * p.y * p.z * (p.x + p.y + p.z)); } float noise(vec3 x){ vec3 i = floor(x); vec3 f = fract(x); f = f * f * (3.0 - 2.0 * f); return mix(mix(mix(hash(i + vec3(0.0, 0.0, 0.0)), hash(i + vec3(1.0, 0.0, 0.0)), f.x), mix(hash(i + vec3(0.0, 1.0, 0.0)), hash(i + vec3(1.0, 1.0, 0.0)), f.x), f.y), mix(mix(hash(i + vec3(0.0, 0.0, 1.0)), hash(i + vec3(1.0, 0.0, 1.0)), f.x), mix(hash(i + vec3(0.0, 1.0, 1.0)), hash(i + vec3(1.0, 1.0, 1.0)), f.x), f.y), f.z); } float fbm(vec3 p){ float a = 0.5; float s = 0.0; for (int i = 0; i < 4; i++){ s += a * noise(p); p = p * 2.03 + vec3(1.7, 9.2, 4.1); a *= 0.5; } return s; } float fbm3(vec3 p){ float a = 0.5; float s = 0.0; for (int i = 0; i < 3; i++){ s += a * noise(p); p = p * 2.03 + vec3(1.7, 9.2, 4.1); a *= 0.5; } return s; } vec3 hash3(vec3 p){ p = vec3(dot(p, vec3(127.1, 311.7, 74.7)), dot(p, vec3(269.5, 183.3, 246.1)), dot(p, vec3(113.5, 271.9, 124.6))); return fract(sin(p) * 43758.5453); } vec2 voro(vec3 p){ vec3 ip = floor(p); vec3 fp = fract(p); float f1 = 8.0; float f2 = 8.0; for (int k = -1; k <= 1; k++) for (int j = -1; j <= 1; j++) for (int i = -1; i <= 1; i++){ vec3 g = vec3(float(i), float(j), float(k)); vec3 r = g + hash3(ip + g) - fp; float d = dot(r, r); if (d < f1){ f2 = f1; f1 = d; } else if (d < f2){ f2 = d; } } return sqrt(vec2(f1, f2)); } vec2 path(float z){ return vec2(sin(z * 0.31) * 1.3 + sin(z * 0.13) * 0.9, cos(z * 0.24) * 1.1 + cos(z * 0.09) * 0.7); } float heartbeat(float t){ float b = fract(t * 0.9); return pow(max(sin(b * 6.28318), 0.0), 12.0) + 0.5 * pow(max(sin(b * 6.28318 - 1.2), 0.0), 24.0); } float veins(vec3 p){ float v = fbm3(p * 1.3 + vec3(31.7, 7.3, 11.1)); return smoothstep(0.045, 0.0, abs(v - 0.5)); } float parasites(vec3 p, float t){ vec3 wp = p + 0.15 * vec3(sin(p.z * 2.0 + t * 2.0), cos(p.x * 2.0 + t * 1.6), 0.0); float w = fbm3(wp * 1.1 + vec3(61.0, 23.0, 42.0)); float line = smoothstep(0.035, 0.0, abs(w - 0.5)); float region = smoothstep(0.52, 0.68, noise(p * 0.35 + vec3(51.0, 13.0, 7.0)) + 0.16 * (PARA_AMT - 1.0)); return line * region; } float wigglers(vec3 p, float t){ vec3 wp = p + 0.22 * vec3(sin(p.y * 4.0 + t * 5.0), sin(p.z * 4.0 + t * 4.2), sin(p.x * 4.0 + t * 4.6)); float w = fbm3(wp * 1.6 + vec3(101.0, 7.0, 53.0)); float line = smoothstep(0.03, 0.0, abs(w - 0.5)); float chop = smoothstep(0.35, 0.55, noise(p * 2.6 + vec3(13.0, 71.0, 31.0)) + 0.20 * (WIG_AMT - 1.0)); return line * chop; } float dispBase(vec3 p, float ang, float t){ float d = fbm(p * 0.7 + vec3(0.0, 0.0, -t * 0.25)) * 0.40; vec2 v = voro(p * LOBE_SCALE + vec3(0.0, 0.0, 5.0)); float dome = smoothstep(0.95, 0.25, v.x); float crease = 1.0 - smoothstep(0.0, 0.28, v.y - v.x); d += dome * LOBE_AMP - crease * 0.10; d += sin(p.z * 2.1 - t * 2.2 + noise(p * 0.5) * 4.0) * 0.09; float b = noise(p * 1.15 + vec3(7.0, 3.0, 5.0)); d += smoothstep(0.60, 0.85, b) * 0.22; d += sin(ang * 7.0 + noise(p * 0.4) * 5.0 + p.z * 0.3) * 0.05; float gate = pow(0.5 + 0.5 * cos(p.z * 0.42), 6.0); d += gate * (GATE + sin(ang * 16.0 + p.z * 1.5) * 0.12); return d; } float dispDetail(vec3 p, float t){ float d = fbm3(p * 3.8) * WRINKLE; d -= smoothstep(0.055, 0.0, abs(fbm3(p * 1.9 + vec3(17.0, 43.0, 8.0)) - 0.5)) * GROOVE; d += veins(p) * 0.06; d += parasites(p, t) * 0.05 * min(PARA_AMT, 1.5); d += wigglers(p, t * WIGGLE_SPEED) * 0.05 * min(WIG_AMT, 1.5); return d; } float gRadius; float map(vec3 p, float t){ vec2 q = p.xy - path(p.z); float r = length(q); float ang = atan(q.y, q.x) + p.z * 0.4; return gRadius - dispBase(p, ang, t) - r; } float mapFull(vec3 p, float t){ return map(p, t) - dispDetail(p, t); } vec3 calcNormal(vec3 p, float t){ const float h = 0.012; vec2 k = vec2(1.0, -1.0); return normalize(k.xyy * mapFull(p + k.xyy * h, t) + k.yyx * mapFull(p + k.yyx * h, t) + k.yxy * mapFull(p + k.yxy * h, t) + k.xxx * mapFull(p + k.xxx * h, t)); } float calcAO(vec3 p, vec3 n, float t){ float occ = 0.0; float w = 1.0; for (int i = 1; i <= 4; i++){ float h = 0.07 * float(i); occ += w * (h - map(p + n * h, t)); w *= 0.65; } return clamp(1.0 - 2.2 * occ, 0.0, 1.0); } void main(){ vec2 uv = (2.0 * gl_FragCoord.xy - RENDERSIZE) / RENDERSIZE.y; float t = TIME; float hb = heartbeat(t * PULSE_SPEED) * PULSE_ON; gRadius = 2.15 + 0.10 * hb + 0.05 * sin(t * 0.7); float z0 = t * 1.8 * SPEED; vec3 ro = vec3(path(z0) * 0.8, z0); vec3 ta = vec3(path(z0 + 2.5) * 0.8, z0 + 2.5); ro.xy += 0.15 * vec2(sin(t * 1.3), cos(t * 1.7)); if (map(ro, t) < 0.25) ro.xy = mix(path(z0), ro.xy, 0.3); vec3 fw = normalize(ta - ro); vec3 rt = normalize(cross(vec3(0.0, 1.0, 0.0), fw)); vec3 up = cross(fw, rt); float roll = 0.22 * sin(t * 0.3); vec2 rc = vec2(cos(roll), sin(roll)); vec3 rt2 = rt * rc.x + up * rc.y; vec3 up2 = up * rc.x - rt * rc.y; vec3 rd = normalize(fw * (1.35 - 0.08 * hb) + uv.x * rt2 + uv.y * up2); float dist = 0.02; float d = 0.0; vec3 p = ro; for (int i = 0; i < 80; i++){ p = ro + rd * dist; d = map(p, t); if (d < 0.0015 * dist || dist > 32.0) break; dist += d * 0.55; } vec3 col; if (dist > 32.0){ col = vec3(0.03, 0.0, 0.0); } else { vec3 n = calcNormal(p, t); float m0 = fbm3(p * 9.0); vec3 g = vec3(fbm3(p * 9.0 + vec3(0.02, 0.0, 0.0)) - m0, fbm3(p * 9.0 + vec3(0.0, 0.02, 0.0)) - m0, fbm3(p * 9.0 + vec3(0.0, 0.0, 0.02)) - m0) / 0.02; float m1 = fbm3(p * 26.0); g += vec3(fbm3(p * 26.0 + vec3(0.008, 0.0, 0.0)) - m1, fbm3(p * 26.0 + vec3(0.0, 0.008, 0.0)) - m1, fbm3(p * 26.0 + vec3(0.0, 0.0, 0.008)) - m1) / 0.008 * 0.35; g -= n * dot(g, n); n = normalize(n - g * 0.045); float ao = calcAO(p, n, t); float wrk = fbm3(p * 3.8); float bRaw = noise(p * 1.15 + vec3(7.0, 3.0, 5.0)); float boil = smoothstep(0.60, 0.85, bRaw); float halo = smoothstep(0.45, 0.60, bRaw) * (1.0 - smoothstep(0.60, 0.75, bRaw)); float head = smoothstep(0.80, 0.90, bRaw); float vn = veins(p); float vnB = smoothstep(0.05, 0.0, abs(fbm3(p * 0.9 + vec3(53.0, 91.0, 37.0)) - 0.5)); float vnR = smoothstep(0.04, 0.0, abs(fbm3(p * 2.1 + vec3(3.0, 59.0, 83.0)) - 0.5)); float gr = smoothstep(0.055, 0.0, abs(fbm3(p * 1.9 + vec3(17.0, 43.0, 8.0)) - 0.5)); float wig = wigglers(p, t * WIGGLE_SPEED); float para = parasites(p, t); float cap = smoothstep(0.030, 0.0, abs(fbm3(p * 3.2 + vec3(5.0, 17.0, 9.0)) - 0.5)); float sick = fbm(p * 0.9 + vec3(13.0, 41.0, 2.0)); float infect = fbm(p * 0.55 + vec3(23.0, 5.0, 47.0)); float necro = smoothstep(0.62, 0.78, infect); float inflam = smoothstep(0.45, 0.62, infect) * (1.0 - necro); float film = smoothstep(0.58, 0.75, fbm(p * 0.8 + vec3(71.0, 3.0, 29.0))); vec2 vs = voro(p * LOBE_SCALE + vec3(0.0, 0.0, 5.0)); float crease = 1.0 - smoothstep(0.0, 0.28, vs.y - vs.x); float zone = fbm(p * 0.22 + vec3(3.0, 77.0, 19.0)); float paleZone = smoothstep(0.60, 0.74, fbm(p * 0.28 + vec3(91.0, 47.0, 23.0))); float fiber = smoothstep(0.55, 0.70, fbm(p * 0.30 + vec3(67.0, 11.0, 5.0))); float rot = smoothstep(0.52, 0.68, fbm(p * 0.40 + vec3(41.0, 61.0, 17.0))); float mottle = smoothstep(0.45, 0.75, fbm3(p * 2.4 + vec3(8.0, 33.0, 55.0))); vec3 flesh = vec3(0.46, 0.11, 0.10); vec3 pink = vec3(0.78, 0.36, 0.34); vec3 bile = vec3(0.42, 0.46, 0.12); vec3 bruise = vec3(0.22, 0.08, 0.20); vec3 veinCol = vec3(0.28, 0.03, 0.10); col = mix(flesh, pink, smoothstep(0.3, 0.8, wrk)); col = mix(col, vec3(0.70, 0.50, 0.44), paleZone * 0.7); vec3 muscle = vec3(0.50, 0.09, 0.08) * (0.8 + 0.25 * sin(p.z * 55.0 + noise(p * 3.0) * 6.0)); col = mix(col, muscle, fiber * 0.7); col = mix(col, bile, smoothstep(0.55, 0.8, sick) * min(0.7 * DISEASE, 1.0)); col = mix(col, vec3(0.45, 0.10, 0.14), cap * min(0.45 * VEIN_AMT, 1.0)); col = mix(col, vec3(0.62, 0.14, 0.11), halo * 0.65); col = mix(col, bruise, boil * 0.5); col = mix(col, vec3(0.78, 0.70, 0.40), head * 0.8); col = mix(col, vec3(0.72, 0.10, 0.07), inflam * min(0.7 * DISEASE, 1.0)); col = mix(col, vec3(0.17, 0.18, 0.12), necro * min(0.85 * DISEASE, 1.0)); float fatZone = smoothstep(0.58, 0.72, zone); col = mix(col, vec3(0.55, 0.42, 0.08), fatZone * 0.75); col = mix(col, vec3(0.30, 0.08, 0.05), smoothstep(0.30, 0.18, zone) * 0.6); col = mix(col, vec3(0.32, 0.04, 0.12), crease * smoothstep(0.35, 0.65, fbm3(p * 1.6 + vec3(9.0, 27.0, 3.0))) * min(0.8 * VEIN_AMT, 1.0)); col = mix(col, vec3(0.10, 0.12, 0.03), fatZone * crease * 0.6); col = mix(col, veinCol, vn * min(0.85 * VEIN_AMT, 1.0)); col = mix(col, vec3(0.10, 0.09, 0.22), vnB * min(0.7 * VEIN_AMT, 1.0)); col = mix(col, vec3(0.30, 0.02, 0.04), vnR * min(0.6 * VEIN_AMT, 1.0)); col = mix(col, col * vec3(0.50, 0.35, 0.40), gr * 0.8); float segT = (p.x + p.y * 1.3 + p.z * 1.7) * 46.0 + noise(p * 9.0) * 7.0; float seg = 0.60 + 0.40 * pow(0.5 + 0.5 * sin(segT), 1.6); vec3 wormCol = vec3(0.74, 0.68, 0.50) * seg; wormCol = mix(wormCol, vec3(0.45, 0.30, 0.18), smoothstep(0.55, 0.85, noise(p * 14.0)) * 0.65); col = mix(col, wormCol, para * 0.85); float wseg = 0.62 + 0.38 * pow(0.5 + 0.5 * sin((p.x + p.y + p.z * 1.4) * 60.0 + t * 8.0 * WIGGLE_SPEED), 1.5); col = mix(col, vec3(0.80, 0.62, 0.55) * wseg, wig * 0.9); vec3 rotCol = mix(vec3(0.05, 0.035, 0.04), vec3(0.46, 0.31, 0.26), mottle * 0.8); col = mix(col, rotCol, rot * min(0.9 * DISEASE, 1.0)); vec3 aoCol = mix(vec3(0.02, 0.0, 0.0), mix(vec3(0.45, 0.04, 0.04), vec3(1.0), smoothstep(0.35, 0.85, ao)), smoothstep(0.0, 0.30, ao)); col *= aoCol * (0.75 + 0.25 * ao); col *= 0.90 + 0.14 * noise(p * 42.0); col *= 1.0 - 0.18 * smoothstep(0.72, 0.90, noise(p * 27.0 + vec3(5.0, 5.0, 5.0))); vec3 ld = normalize(ro - p + vec3(0.0, 0.3, 0.0)); float diff = clamp(dot(n, ld) * 0.6 + 0.4, 0.0, 1.0); float drip = smoothstep(0.55, 0.8, noise(vec3(p.x * 6.0, p.y * 1.5 + t * 0.7, p.z * 6.0))); float gloss = clamp(fbm3(p * 1.7 + vec3(19.0, 3.0, 71.0)) * 1.5 - 0.25 + 0.35 * drip + 0.5 * head + 0.15 * fatZone - 0.55 * necro - 0.35 * rot * (1.0 - mottle), 0.0, 1.0); float sr = clamp(dot(reflect(-ld, n), -rd), 0.0, 1.0); float spec = pow(sr, mix(12.0, 85.0, gloss)) * (0.35 + 1.1 * gloss) + pow(sr, 8.0) * 0.22; float fres = pow(1.0 - clamp(dot(n, -rd), 0.0, 1.0), 3.0); float thin = 0.0; for (int i = 1; i <= 4; i++){ thin += step(0.0, map(p + rd * (float(i) * 0.15), t)); } thin *= 0.25; float slime = (0.6 + 0.6 * (1.0 - ao) + 0.4 * smoothstep(0.4, 0.7, sick) + 0.9 * drip + 0.5 * para + 0.6 * wig + 1.5 * head) * (1.0 - necro * 0.7); col *= diff * (1.1 + 0.35 * hb); col += spec * slime * vec3(0.9, 0.85, 0.7); col += smoothstep(0.82, 0.95, noise(p * 34.0)) * gloss * pow(sr, 6.0) * 0.4; vec3 l2 = normalize(vec3(0.35, 0.9, -0.2)); vec3 nA = normalize(n - fw * dot(n, fw) * 0.65); float spec2 = pow(clamp(dot(reflect(-l2, nA), -rd), 0.0, 1.0), 28.0); col += spec2 * slime * (0.25 + 0.75 * gloss) * 0.45 * vec3(1.0, 0.97, 0.9); col += thin * vec3(0.40, 0.07, 0.03) * (0.4 + 0.6 * diff); col += fres * vec3(0.25, 0.05, 0.04) * ao; col += film * (0.5 + 0.5 * cos(fres * 8.0 + vec3(0.0, 2.1, 4.2))) * 0.10; col += inflam * vec3(0.09, 0.005, 0.0) * (0.7 + 0.5 * hb); float fog = exp(-dist * 0.11); col = mix(vec3(0.04, 0.0, 0.005), col, fog); } col *= BRIGHTNESS; col = mix(vec3(dot(col, vec3(0.299, 0.587, 0.114))), col, SATURATION); col = hueShift(col, HUE_SHIFT); col = pow(col, vec3(0.85, 0.95, 1.0)); col = col / (1.0 + col); col = pow(col, vec3(0.4545)); vec2 vuv = gl_FragCoord.xy / RENDERSIZE; col *= 0.35 + 0.65 * pow(16.0 * vuv.x * vuv.y * (1.0 - vuv.x) * (1.0 - vuv.y), 0.25); col += vec3(0.05, 0.0, 0.0) * hb; gl_FragColor = vec4(col, 1.0); }
Raymarched flesh tunnel: Voronoi tumor lobes, pleated sphincter gates, veins (red/blue/capillary), parasites and wriggling surface worms, infection zones with near-black rot, heartbeat throb, black & red ambient occlusion, wet two-lobe specular. Every knob exposed.
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).