Graphics at the speed of typing. Explainers, charts, product motion, cinematic scenes. Each loop is a live WebGPU embed, an MP4 and a poster. Type a prompt or POST one.
now playing · 6s loop
A cinematic macro of teal ink and liquid gold, fine marbled veins catching soft studio light.
plasma · 1 credit
{"scene":{"format":1,"duration_s":6,"fps":30,"loop":true,"size":[640,360],"seed":0,"params":{}},"wgsl":"\nfn ink_field(p: vec2f, phase: f32) -> f32 {\n let drift = vec2f(cos(phase), sin(phase)) * 0.32;\n let warp = vec2f(fbm(p * 2.5 + drift, 4), fbm(p * 2.5 + vec2f(7.2, 3.8) - drift, 4));\n return fbm(p * 3.0 + warp * 3.4 + drift, 5);\n}\n@fragment fn fs_main(@location(0) uv: vec2f) -> @location(0) vec4f {\n let p = centered(uv, u.aspect);\n let phase = u.phase * TAU;\n let n = ink_field(p, phase);\n let contour = sin(n * 35.0 + p.x * 3.0);\n let gradient = vec2f(ink_field(p + vec2f(0.003, 0.0), phase) - n, ink_field(p + vec2f(0.0, 0.003), phase) - n) / 0.003;\n let normal = normalize(vec3f(-gradient * 0.16, 1.0));\n let light = normalize(vec3f(-0.4, 0.7, 1.2));\n let diffuse = 0.4 + 0.6 * max(dot(normal, light), 0.0);\n var color = mix(vec3f(0.008, 0.027, 0.038), vec3f(0.06, 0.25, 0.28), smoothstep(0.28, 0.56, n));\n color = mix(color, vec3f(0.67, 0.27, 0.09), smoothstep(0.48, 0.65, n));\n let gold = pow(0.5 + 0.5 * contour, 12.0) * smoothstep(0.38, 0.60, n);\n color = mix(color, vec3f(0.88, 0.61, 0.25), gold * 0.9);\n color *= diffuse;\n color += vec3f(1.0, 0.83, 0.52) * pow(max(dot(normal, normalize(light + vec3f(0.0, 0.0, 1.0))), 0.0), 48.0) * gold * 0.7;\n color *= 1.0 - 0.28 * dot(p, p);\n return vec4f(pow(max(color, vec3f(0.0)), vec3f(0.85)), 1.0);\n}\n"} {"scene":{"format":1,"duration_s":6,"fps":30,"loop":true,"size":[640,360],"seed":0.0625,"params":{}},"wgsl":"\nfn stroke(d: f32, width: f32) -> f32 { return 1.0 - smoothstep(width - 0.0015, width + 0.0015, d); }\n@fragment fn fs_main(@location(0) uv: vec2f) -> @location(0) vec4f {\n let p = centered(uv, u.aspect);\n let a = u.phase * TAU;\n let center = vec2f(-0.43, 0.025);\n let r = 0.28;\n let tip = center + r * vec2f(cos(a), sin(a));\n var color = vec3f(0.96, 0.935, 0.87) - 0.045 * length(p);\n let grid = min(abs(fract((p.x + 0.02) * 20.0 + 0.5) - 0.5), abs(fract(p.y * 20.0 + 0.5) - 0.5));\n color -= vec3f(0.065, 0.07, 0.07) * (1.0 - smoothstep(0.012, 0.022, grid));\n let circle = stroke(abs(length(p - center) - r), 0.0025);\n color = mix(color, vec3f(0.12, 0.22, 0.26), circle);\n let horizontal = stroke(abs(p.y - center.y), 0.0015) * step(-0.78, p.x) * step(p.x, 0.72);\n let vertical = stroke(abs(p.x - center.x), 0.0015) * step(-0.34, p.y) * step(p.y, 0.36);\n color = mix(color, vec3f(0.23, 0.32, 0.33), max(horizontal, vertical) * 0.8);\n let q = tip - center;\n let line = length((p - center) - q * clamp(dot(p - center, q) / dot(q, q), 0.0, 1.0));\n color = mix(color, vec3f(0.85, 0.30, 0.20), stroke(line, 0.004));\n let x = (p.x - 0.02) / 0.66;\n let window = step(0.0, x) * step(x, 1.0);\n // A standard trace: the value at the left edge is now, and older samples move right.\n let sine = 0.28 * sin(a - TAU * x) + 0.025;\n let cosine = 0.15 * cos(a - TAU * x) - 0.21;\n color = mix(color, vec3f(0.90, 0.30, 0.22), stroke(abs(p.y - sine), 0.003) * window);\n color = mix(color, vec3f(0.17, 0.42, 0.68), stroke(abs(p.y - cosine), 0.003) * window);\n let guide = stroke(abs(p.y - tip.y), 0.001) * step(tip.x, p.x) * step(p.x, 0.02);\n color = mix(color, vec3f(0.85, 0.30, 0.20), guide * 0.45);\n let dot = 1.0 - smoothstep(0.008, 0.013, length(p - tip));\n color = mix(color, vec3f(0.95, 0.28, 0.18), dot);\n let waveDot = 1.0 - smoothstep(0.007, 0.012, length(p - vec2f(0.02, sine)));\n color = mix(color, vec3f(0.95, 0.28, 0.18), waveDot);\n return vec4f(color, 1.0);\n}\n"} {"scene":{"format":1,"duration_s":6,"fps":30,"loop":true,"size":[640,360],"seed":0.125,"params":{}},"wgsl":"\n@fragment fn fs_main(@location(0) uv: vec2f) -> @location(0) vec4f {\n let p = centered(uv, u.aspect);\n let phase = u.phase * TAU;\n let radius = length(p);\n let angle = atan2(p.y, p.x);\n let tube = 0.022;\n let ringRadius = 0.18;\n let d = radius - ringRadius;\n let aa = 1.5 / u.resolution.y;\n var color = vec3f(0.88, 0.86, 0.83);\n color += vec3f(0.07) * exp(-dot(p - vec2f(-0.3, 0.3), p - vec2f(-0.3, 0.3)) * 2.0);\n let shadow = exp(-pow((length(p + vec2f(0.0, 0.018)) - ringRadius) / 0.031, 2.0));\n color *= 1.0 - shadow * 0.15;\n let z = sqrt(max(0.0, tube * tube - d * d));\n let normal = normalize(vec3f(p / max(radius, 0.0001) * d, z + 0.0001));\n let diffuse = max(dot(normal, normalize(vec3f(-0.5, 0.7, 1.0))), 0.0);\n let specular = pow(max(dot(normal, normalize(vec3f(-0.3, 0.45, 1.0))), 0.0), 32.0);\n let sweep = pow(0.5 + 0.5 * cos(angle - phase), 5.0);\n let material = mix(vec3f(0.58, 0.56, 0.54), vec3f(0.39, 0.22, 0.66), sweep);\n let surface = material * (0.50 + 0.50 * diffuse) + vec3f(0.7, 0.66, 0.61) * specular;\n color = mix(color, surface, 1.0 - smoothstep(tube - aa, tube + aa, abs(d)));\n let center = vec2f(cos(phase), sin(phase)) * ringRadius;\n let q = p - center;\n let beadRadius = 0.030;\n let beadZ = sqrt(max(0.0, beadRadius * beadRadius - dot(q, q)));\n let beadNormal = normalize(vec3f(q, beadZ + 0.0001));\n let beadLight = max(dot(beadNormal, normalize(vec3f(-0.5, 0.7, 1.0))), 0.0);\n let beadSpecular = pow(max(dot(beadNormal, normalize(vec3f(-0.3, 0.45, 1.0))), 0.0), 26.0);\n let beadColor = vec3f(0.42, 0.24, 0.68) * (0.45 + beadLight * 0.55) + vec3f(0.8, 0.72, 0.92) * beadSpecular;\n color = mix(color, beadColor, 1.0 - smoothstep(beadRadius - aa, beadRadius + aa, length(q)));\n return vec4f(color, 1.0);\n}\n"} {"scene":{"format":1,"duration_s":6,"fps":30,"loop":true,"size":[640,360],"seed":0.1875,"params":{}},"wgsl":"\nfn jelly(p: vec2f, phase: f32, scale: f32) -> vec3f {\n let q = p / scale;\n let pulse = 1.0 + 0.055 * sin(phase);\n let x = q.x / pulse;\n let dome = length(vec2f(x, (q.y - 0.025) * 1.45));\n let edge = exp(-abs(dome - 0.205) * 180.0) * smoothstep(-0.02, 0.015, q.y);\n let inside = (1.0 - smoothstep(0.198, 0.208, dome)) * smoothstep(-0.025, 0.015, q.y);\n let z = sqrt(max(0.0, 0.205 * 0.205 - x * x - pow((q.y - 0.025) * 1.45, 2.0)));\n let angle = atan2(x, z + 0.012);\n let ribs = pow(0.5 + 0.5 * cos(angle * 18.0), 18.0);\n var light = vec3f(0.36, 0.24, 0.85) * inside * (0.12 + 0.32 * ribs);\n let tissue = fbm(vec2f(angle * 9.0, q.y * 85.0 + 0.25 * sin(phase)), 3);\n light += vec3f(0.32, 0.38, 0.70) * inside * tissue * tissue * 0.55;\n light += vec3f(0.43, 0.66, 1.0) * edge * 0.60;\n let rimY = -0.004 + 0.012 * cos(x * 46.0);\n let rim = exp(-abs(q.y - rimY) * 260.0) * (1.0 - smoothstep(0.18, 0.205, abs(x)));\n light += vec3f(0.65, 0.42, 1.0) * rim;\n let organs = exp(-pow(x * 17.0, 2.0) - pow((q.y - 0.045) * 22.0, 2.0));\n light += vec3f(0.85, 0.29, 0.55) * organs * (0.28 + 0.08 * sin(phase));\n for (var i = 0; i \u003c 18; i++) {\n let f = f32(i);\n let start = (f / 17.0 - 0.5) * 0.35;\n let depth = max(-q.y, 0.0);\n let wave = sin(depth * 19.0 - phase + f * 0.71) * depth * 0.11;\n let curl = sin(depth * 37.0 + phase + f) * depth * 0.025;\n let tx = start * exp(-depth * 0.9) + wave + curl;\n let len = 0.25 + 0.13 * hash2i(vec2i(i, 9));\n let fade = smoothstep(0.0, 0.022, depth) * (1.0 - smoothstep(len * 0.55, len, depth));\n let filament = exp(-abs(q.x - tx) * (650.0 - f * 8.0));\n light += mix(vec3f(0.12, 0.34, 0.8), vec3f(0.63, 0.24, 0.58), f / 18.0) * filament * fade * 0.7;\n }\n for (var arm = 0; arm \u003c 4; arm++) {\n let f = f32(arm);\n let depth = max(-q.y, 0.0);\n let cx = (f - 1.5) * 0.028 + sin(depth * 23.0 - phase + f * 1.7) * depth * 0.13;\n let width = 0.010 + 0.009 * pow(0.5 + 0.5 * sin(depth * 80.0 + f * 3.0 + phase), 2.0);\n let body = exp(-pow((q.x - cx) / width, 2.0));\n let frill = 0.45 + 0.55 * pow(0.5 + 0.5 * sin(depth * 210.0 + q.x * 100.0 + f), 3.0);\n let fade = smoothstep(0.0, 0.035, depth) * (1.0 - smoothstep(0.12, 0.29, depth));\n light += vec3f(0.49, 0.27, 0.52) * body * frill * fade * 0.4;\n }\n return light;\n}\n@fragment fn fs_main(@location(0) uv: vec2f) -> @location(0) vec4f {\n let p = centered(uv, u.aspect);\n let phase = u.phase * TAU;\n var color = vec3f(0.008, 0.006, 0.028) + vec3f(0.018, 0.024, 0.068) * exp(-dot(p - vec2f(0.0, 0.35), p - vec2f(0.0, 0.35)) * 3.0);\n let rays = pow(0.5 + 0.5 * sin(p.x * 16.0 + p.y * 3.0 + 0.3 * sin(phase)), 8.0);\n color += vec3f(0.020, 0.027, 0.06) * rays * smoothstep(-0.5, 0.6, p.y);\n color += jelly(rot2(-0.18) * (p - vec2f(-0.43, 0.15 + 0.025 * sin(phase + 2.0))), phase + 2.0, 0.62) * 0.50;\n color += jelly(rot2(0.16) * (p - vec2f(0.43, -0.015 + 0.03 * sin(phase + 4.0))), phase + 4.0, 0.78) * 0.65;\n color += jelly(rot2(-0.08 + 0.04 * sin(phase)) * (p - vec2f(-0.02, 0.11 + 0.035 * sin(phase))), phase, 1.35);\n let grid = (p + vec2f(0.004 * cos(phase), 0.007 * sin(phase))) * 65.0;\n let cell = vec2i(floor(grid));\n let point = fract(grid) - vec2f(0.5);\n color += vec3f(0.18, 0.23, 0.40) * exp(-dot(point, point) * 85.0) * step(0.985, hash2i(cell));\n return vec4f(pow(max(color, vec3f(0.0)), vec3f(0.85)), 1.0);\n}\n"} {"scene":{"format":1,"duration_s":6,"fps":30,"loop":true,"size":[640,360],"seed":0.25,"params":{}},"wgsl":"\nfn boundary(x: f32, phase: f32, i: f32) -> f32 {\n let motion = sin(x * (3.0 + i * 0.5) + phase + i * 1.6);\n let detail = sin(x * 9.0 - phase + i * 2.2);\n return 0.025 * motion + 0.010 * detail;\n}\n@fragment fn fs_main(@location(0) uv: vec2f) -> @location(0) vec4f {\n let p = centered(uv, u.aspect);\n let phase = u.phase * TAU;\n let x = p.x;\n var color = vec3f(0.95, 0.91, 0.85) - vec3f(0.07, 0.07, 0.06) * abs(p.y);\n let grid = min(abs(fract((p.x + 0.03) * 10.0 + 0.5) - 0.5), abs(fract(p.y * 10.0 + 0.5) - 0.5));\n color -= vec3f(0.06) * (1.0 - smoothstep(0.008, 0.022, grid));\n let base = -0.31 + 0.025 * sin(x * 4.0 + phase);\n let top1 = base + 0.12 + boundary(x, phase, 0.0);\n let top2 = top1 + 0.14 + boundary(x, phase, 1.0);\n let top3 = top2 + 0.13 + boundary(x, phase, 2.0);\n let top4 = top3 + 0.12 + boundary(x, phase, 3.0);\n let top5 = top4 + 0.11 + boundary(x, phase, 4.0);\n let window = smoothstep(-0.77, -0.74, x) * (1.0 - smoothstep(0.74, 0.77, x));\n if (p.y > base && p.y \u003c top5) {\n var band = vec3f(0.11, 0.31, 0.42);\n var edge = abs(p.y - top1);\n if (p.y > top1) { band = vec3f(0.34, 0.62, 0.56); edge = abs(p.y - top2); }\n if (p.y > top2) { band = vec3f(0.92, 0.69, 0.40); edge = abs(p.y - top3); }\n if (p.y > top3) { band = vec3f(0.83, 0.39, 0.37); edge = abs(p.y - top4); }\n if (p.y > top4) { band = vec3f(0.45, 0.30, 0.52); edge = abs(p.y - top5); }\n let shade = 0.78 + 0.22 * smoothstep(0.0, 0.10, edge);\n color = mix(color, band * shade, window);\n }\n let guide = 1.0 - smoothstep(0.001, 0.003, abs(p.y - top5));\n color = mix(color, vec3f(0.22, 0.23, 0.23), guide * window * 0.7);\n return vec4f(color, 1.0);\n}\n"} {"scene":{"format":1,"duration_s":6,"fps":30,"loop":true,"size":[640,360],"seed":0.3125,"params":{}},"wgsl":"\nfn segment_distance(p: vec2f, a: vec2f, b: vec2f) -> f32 {\n let v = b - a;\n return length(p - a - v * clamp(dot(p - a, v) / max(dot(v, v), 0.00001), 0.0, 1.0));\n}\n@fragment fn fs_main(@location(0) uv: vec2f) -> @location(0) vec4f {\n let p = centered(uv, u.aspect);\n let t = u.phase * TAU;\n var color = vec3f(0.050, 0.034, 0.077) + vec3f(0.068, 0.038, 0.090) * exp(-length(p) * 2.2);\n let grid = min(abs(fract(p.x * 14.0 + 0.5) - 0.5), abs(fract(p.y * 14.0 + 0.5) - 0.5));\n color += vec3f(0.035, 0.031, 0.058) * (1.0 - smoothstep(0.012, 0.028, grid));\n var origin = vec2f(-0.43, 0.01);\n for (var i = 0; i \u003c 4; i++) {\n let fi = f32(i);\n let radius = 0.235 / (fi * 2.0 + 1.0);\n let angle = (fi * 2.0 + 1.0) * t;\n let next = origin + radius * vec2f(cos(angle), sin(angle));\n let ring = abs(length(p - origin) - radius);\n color += vec3f(0.35, 0.25, 0.52) * exp(-ring * 115.0) * 0.24;\n color = mix(color, vec3f(0.52, 0.38, 0.68), 1.0 - smoothstep(0.002, 0.005, ring));\n let spoke = segment_distance(p, origin, next);\n color = mix(color, vec3f(0.95, 0.63, 0.43), 1.0 - smoothstep(0.003, 0.006, spoke));\n let hub = length(p - origin);\n color = mix(color, vec3f(0.84, 0.67, 0.74), 1.0 - smoothstep(0.005, 0.010, hub));\n origin = next;\n }\n let point = origin;\n let start = -0.025;\n let guide = segment_distance(p, point, vec2f(start, point.y));\n color += vec3f(0.58, 0.38, 0.67) * exp(-guide * 120.0) * 0.20;\n color = mix(color, vec3f(0.81, 0.64, 0.81), (1.0 - smoothstep(0.002, 0.004, guide)) * 0.85);\n let x = (p.x - start) / 0.75;\n let window = step(0.0, x) * step(x, 1.0);\n let angle = t - x * TAU;\n // The first four terms of the square wave's Fourier series, in phase with the epicycles.\n let curve = 0.01 + 0.235 * sin(angle) + (0.235 / 3.0) * sin(3.0 * angle) + (0.235 / 5.0) * sin(5.0 * angle) + (0.235 / 7.0) * sin(7.0 * angle);\n let d = abs(p.y - curve);\n color += vec3f(0.93, 0.38, 0.53) * exp(-d * 80.0) * window * 0.43;\n color = mix(color, vec3f(1.0, 0.75, 0.55), (1.0 - smoothstep(0.0025, 0.005, d)) * window);\n let tip = length(p - point);\n color += vec3f(1.0, 0.46, 0.31) * exp(-tip * 58.0) * 0.62;\n color = mix(color, vec3f(1.0, 0.91, 0.72), 1.0 - smoothstep(0.007, 0.013, tip));\n return vec4f(color, 1.0);\n}\n"} {"scene":{"format":1,"duration_s":6,"fps":30,"loop":true,"size":[640,360],"seed":0.375,"params":{}},"wgsl":"\nfn water_cells(p: vec2f, phase: f32) -> f32 {\n let cell = vec2i(floor(p));\n let local = fract(p);\n var nearest = 8.0;\n var second = 8.0;\n for (var y = -1; y \u003c= 1; y++) {\n for (var x = -1; x \u003c= 1; x++) {\n let offset = vec2i(x, y);\n let h = vec2f(hash2i(cell + offset), hash2i(cell + offset + vec2i(37, 81)));\n let point = vec2f(offset) + 0.5 + 0.30 * sin(h * TAU + vec2f(phase, phase + 1.6)) - local;\n let d = dot(point, point);\n second = min(second, max(nearest, d));\n nearest = min(nearest, d);\n }\n }\n return sqrt(second) - sqrt(nearest);\n}\n@fragment fn fs_main(@location(0) uv: vec2f) -> @location(0) vec4f {\n let p = centered(uv, u.aspect);\n let phase = u.phase * TAU;\n let q = rot2(0.28) * p;\n let warp = vec2f(sin(q.y * 10.0 + phase) + 0.45 * sin(q.x * 17.0 - q.y * 8.0 - phase), cos(q.x * 9.0 - phase) + 0.45 * cos(q.y * 16.0 + q.x * 7.0 + phase)) * 0.42;\n let world = q * 6.0 + warp;\n let cells = water_cells(world, phase);\n let fine = water_cells(world * 1.48 + vec2f(13.0, 8.0), -phase);\n let caustic = exp(-cells * 25.0) + 0.4 * exp(-fine * 32.0);\n let pool = smoothstep(-0.9, 0.8, q.x + q.y * 0.55);\n var color = mix(vec3f(0.035, 0.27, 0.32), vec3f(0.21, 0.69, 0.68), pool);\n let sand = fbm(q * 70.0, 3);\n let sandRidges = 0.5 + 0.5 * sin(q.y * 120.0 + 4.0 * vnoise(q * 5.0));\n color *= 0.76 + 0.22 * sand + 0.045 * sandRidges;\n color += vec3f(0.55, 0.94, 0.73) * caustic * (0.24 + 0.38 * pool);\n let sun = exp(-dot(p - vec2f(0.65, 0.36), p - vec2f(0.65, 0.36)) * 2.4);\n color += vec3f(0.20, 0.21, 0.10) * sun;\n color *= 1.0 - 0.13 * dot(p, p);\n return vec4f(pow(max(color, vec3f(0.0)), vec3f(0.85)), 1.0);\n}\n"} {"scene":{"format":1,"duration_s":6,"fps":30,"loop":true,"size":[640,360],"seed":0.4375,"params":{}},"wgsl":"\n@fragment fn fs_main(@location(0) uv: vec2f) -> @location(0) vec4f {\n let p = centered(uv, u.aspect);\n let phase = u.phase * TAU;\n var color = vec3f(0.955, 0.947, 0.960);\n let bloom = exp(-dot((p - vec2f(0.60, -0.15)) * vec2f(1.25, 1.0), (p - vec2f(0.60, -0.15)) * vec2f(1.25, 1.0)) * 2.8);\n color = mix(color, vec3f(0.64, 0.58, 0.82), bloom * 0.75);\n // The folds gain depth toward the right, leaving the heading area quiet.\n let envelope = smoothstep(-0.45, 0.65, p.x);\n let sweepCenter = 0.38 + 0.32 * sin(phase);\n let sweep = exp(-pow(abs((p.x - sweepCenter) * 3.2), 2.0));\n for (var i = 0; i \u003c 5; i++) {\n let f = f32(i);\n let bend = -0.40 + f * 0.12 + 0.13 * sin(p.x * 2.4 + f * 0.24 + 0.30 * sin(phase));\n let curve = bend + 0.29 * pow(abs(p.x - 0.05), 2.0);\n let d = p.y - curve;\n let shade = exp(-pow(abs((d + 0.034) / 0.047), 2.0));\n let ridge = exp(-pow(abs(d / 0.014), 2.0));\n let tint = mix(vec3f(0.25, 0.19, 0.48), vec3f(0.45, 0.34, 0.63), f / 4.0);\n color = mix(color, tint, shade * envelope * 0.75);\n color = mix(color, vec3f(0.93, 0.88, 1.0), ridge * envelope * (0.48 + 0.42 * sweep));\n color += vec3f(0.030, 0.023, 0.055) * exp(-abs(d) * 26.0) * sweep * envelope;\n }\n let grain = (hash_cell(uv * u.resolution) - 0.5) / 600.0;\n return vec4f(clamp(color + grain, vec3f(0.0), vec3f(1.0)), 1.0);\n}\n"} {"scene":{"format":1,"duration_s":6,"fps":30,"loop":true,"size":[640,360],"seed":0.5,"params":{}},"wgsl":"\nfn segment_distance(p: vec2f, a: vec2f, b: vec2f) -> f32 {\n let v = b - a;\n return length(p - a - v * clamp(dot(p - a, v) / max(dot(v, v), 0.00001), 0.0, 1.0));\n}\nfn eccentric_anomaly(mean: f32, eccentricity: f32) -> f32 {\n // Newton's method on Kepler's equation M = E - e sin E, from a start that converges for e \u003c 0.9.\n var anomaly = mean + eccentricity * sin(mean);\n for (var i = 0; i \u003c 8; i++) { anomaly -= (anomaly - eccentricity * sin(anomaly) - mean) / (1.0 - eccentricity * cos(anomaly)); }\n return anomaly;\n}\n@fragment fn fs_main(@location(0) uv: vec2f) -> @location(0) vec4f {\n let p = centered(uv, u.aspect);\n let phase = u.phase * TAU;\n // The sun sits at the focus c = sqrt(a^2 - b^2) on the +x side, where E = 0 puts periapsis.\n let center = vec2f(0.04, 0.0);\n let semi = vec2f(0.56, 0.34);\n let focal = sqrt(semi.x * semi.x - semi.y * semi.y);\n let eccentricity = focal / semi.x;\n let focus = vec2f(center.x + focal, 0.0);\n let anomaly = eccentric_anomaly(phase, eccentricity);\n let planet = center + semi * vec2f(cos(anomaly), sin(anomaly));\n let old = eccentric_anomaly(phase - 0.24, eccentricity);\n let oldPlanet = center + semi * vec2f(cos(old), sin(old));\n var color = mix(vec3f(0.025, 0.043, 0.095), vec3f(0.12, 0.07, 0.12), smoothstep(-0.4, 0.4, p.y));\n let stars = hash_cell(uv * u.resolution * 0.22);\n color += vec3f(0.45, 0.50, 0.70) * step(0.997, stars) * 0.45;\n let radius = length((p - center) / semi);\n // The wedge is swept about the sun, counterclockwise from the old radius to the current one.\n // Near periapsis it can span more than half a turn, so angles are unwrapped into [0, TAU).\n let polar = atan2(p.y - focus.y, p.x - focus.x);\n let nowPolar = atan2(planet.y - focus.y, planet.x - focus.x);\n let oldPolar = atan2(oldPlanet.y - focus.y, oldPlanet.x - focus.x);\n let sweepWidth = fract((nowPolar - oldPolar) / TAU) * TAU;\n let relative = fract((polar - oldPolar) / TAU) * TAU;\n let swept = step(relative, sweepWidth) * step(radius, 1.0);\n color = mix(color, vec3f(0.31, 0.20, 0.20), swept * 0.48);\n let ellipse = abs(radius - 1.0) * 0.34;\n color += vec3f(0.35, 0.45, 0.67) * exp(-ellipse * 46.0) * 0.45;\n color = mix(color, vec3f(0.63, 0.67, 0.78), 1.0 - smoothstep(0.002, 0.0045, ellipse));\n let radiusLine = segment_distance(p, focus, planet);\n color = mix(color, vec3f(0.99, 0.55, 0.33), (1.0 - smoothstep(0.0015, 0.004, radiusLine)) * 0.75);\n let oldLine = segment_distance(p, focus, oldPlanet);\n color = mix(color, vec3f(0.8, 0.42, 0.38), (1.0 - smoothstep(0.001, 0.003, oldLine)) * 0.4);\n let sunDistance = length(p - focus);\n color += vec3f(0.85, 0.35, 0.11) * exp(-sunDistance * 20.0) * 0.35;\n color = mix(color, vec3f(1.0, 0.73, 0.31), 1.0 - smoothstep(0.025, 0.033, sunDistance));\n let planetDistance = length(p - planet);\n color += vec3f(0.20, 0.62, 1.0) * exp(-planetDistance * 36.0) * 0.65;\n color = mix(color, vec3f(0.62, 0.85, 1.0), 1.0 - smoothstep(0.012, 0.019, planetDistance));\n return vec4f(color, 1.0);\n}\n"} {"scene":{"format":1,"duration_s":6,"fps":30,"loop":true,"size":[640,360],"seed":0.5625,"params":{}},"wgsl":"\nfn accretion(p: vec2f, phase: f32) -> vec3f {\n let radius = length(p);\n let angle = atan2(p.y, p.x);\n let band = exp(-pow((radius - 0.33) / 0.09, 2.0)) * smoothstep(0.20, 0.24, radius);\n let eddies = sin(angle * 3.0 - phase) + 0.5 * sin(angle * 7.0 + phase);\n let dust = fbm(vec2f(radius * 120.0 + eddies * 0.6, 3.0 * sin(angle - phase) + cos(angle * 4.0 + phase)), 3);\n let filaments = 0.32 + 0.28 * sin(radius * 250.0 + eddies * 1.8) + 0.65 * dust;\n let turbulence = 0.7 + 0.3 * sin(angle * 9.0 - phase + radius * 40.0);\n let doppler = 0.5 + 0.5 * smoothstep(-0.45, 0.40, -p.x);\n let tint = mix(vec3f(1.0, 0.18, 0.025), vec3f(1.0, 0.88, 0.63), exp(-abs(radius - 0.27) * 10.0));\n return tint * band * max(filaments, 0.0) * turbulence * doppler;\n}\n@fragment fn fs_main(@location(0) uv: vec2f) -> @location(0) vec4f {\n let p = rot2(-0.12) * centered(uv, u.aspect);\n let phase = u.phase * TAU;\n let radius = length(p);\n let lens = p * (1.0 + 0.025 / max(dot(p, p), 0.018));\n let grid = lens * 135.0;\n let star = exp(-dot(fract(grid) - 0.5, fract(grid) - 0.5) * 160.0) * step(0.992, hash_cell(grid));\n var color = vec3f(0.006, 0.008, 0.018) + vec3f(0.27, 0.32, 0.43) * star;\n color += vec3f(0.24, 0.055, 0.012) * exp(-radius * 5.0) * 0.4;\n // The upper image is the back of the disk bent around the event horizon.\n let back = vec2f(p.x, (p.y - 0.015) * 1.13);\n let backMask = smoothstep(-0.03, 0.06, p.y);\n color += accretion(back, phase) * backMask * 1.55;\n color += vec3f(0.26, 0.075, 0.017) * exp(-pow((length(back) - 0.30) / 0.12, 2.0)) * backMask * 0.5;\n let lower = vec2f(p.x, (p.y + 0.025) * 1.50);\n color += accretion(lower, phase) * (1.0 - smoothstep(-0.08, 0.0, p.y)) * 0.13;\n color *= smoothstep(0.191, 0.198, radius);\n let photon = exp(-abs(radius - 0.200) * 540.0);\n color += vec3f(1.0, 0.61, 0.24) * photon * 0.65;\n let front = accretion(vec2f(p.x * 0.80, p.y * 5.8), phase);\n let foreground = 1.0 - smoothstep(-0.005, 0.018, p.y);\n color = color * (1.0 - clamp(length(front) * foreground, 0.0, 0.90)) + front * foreground * 1.7;\n color += vec3f(0.42, 0.13, 0.024) * exp(-abs(p.y) * 65.0) * exp(-p.x * p.x * 2.0) * 0.25;\n return vec4f(pow(vec3f(1.0) - exp(-color * 1.5), vec3f(0.85)), 1.0);\n}\n"} {"scene":{"format":1,"duration_s":6,"fps":30,"loop":true,"size":[640,360],"seed":0.625,"params":{}},"wgsl":"\nfn bar_value(i: f32, phase: f32) -> f32 {\n return 0.48 + 0.25 * sin(phase + i * 0.91) + 0.07 * cos(phase * 2.0 - i * 1.3);\n}\n@fragment fn fs_main(@location(0) uv: vec2f) -> @location(0) vec4f {\n let p = centered(uv, u.aspect);\n let phase = u.phase * TAU + 5.7;\n let values = array\u003cf32, 7>(bar_value(0.0, phase), bar_value(1.0, phase), bar_value(2.0, phase), bar_value(3.0, phase), bar_value(4.0, phase), bar_value(5.0, phase), bar_value(6.0, phase));\n var color = vec3f(0.078, 0.038, 0.046) + vec3f(0.060, 0.025, 0.020) * exp(-length(p) * 2.0);\n for (var i = 0; i \u003c 7; i++) {\n let value = values[i];\n var rank = 0.0;\n for (var j = 0; j \u003c 7; j++) {\n if (j != i) { rank += smoothstep(-0.018, 0.018, values[j] - value); }\n }\n let y = 0.30 - rank * 0.10;\n let left = -0.52;\n let right = left + 1.18 * value;\n let inside = smoothstep(left - 0.003, left + 0.003, p.x) * (1.0 - smoothstep(right - 0.003, right + 0.003, p.x));\n let row = 1.0 - smoothstep(0.030, 0.034, abs(p.y - y));\n let mask = inside * row;\n let tint = f32(i) / 6.0;\n let bar = mix(vec3f(0.95, 0.36, 0.25), vec3f(0.98, 0.75, 0.37), tint);\n let sheen = 0.82 + 0.18 * smoothstep(-0.034, 0.032, p.y - y);\n color = mix(color, bar * sheen, mask);\n let cap = exp(-length((p - vec2f(right, y)) * vec2f(1.0, 1.8)) * 72.0);\n color += bar * cap * 0.20;\n let dot = 1.0 - smoothstep(0.009, 0.014, length(p - vec2f(-0.58, y)));\n color = mix(color, bar, dot);\n }\n let axis = 1.0 - smoothstep(0.001, 0.004, abs(p.x + 0.52));\n color = mix(color, vec3f(0.61, 0.37, 0.29), axis * step(-0.37, p.y) * step(p.y, 0.37) * 0.55);\n return vec4f(color, 1.0);\n}\n"} {"scene":{"format":1,"duration_s":6,"fps":30,"loop":true,"size":[640,360],"seed":0.6875,"params":{}},"wgsl":"\n@fragment fn fs_main(@location(0) uv: vec2f) -> @location(0) vec4f {\n let p = centered(uv, u.aspect);\n let phase = u.phase * TAU;\n let a = vec2f(-0.20, 0.0);\n let b = vec2f(0.20, 0.0);\n let d1 = length(p - a);\n let d2 = length(p - b);\n let w1 = cos(d1 * 81.0 - phase);\n let w2 = cos(d2 * 81.0 - phase);\n let wave = (w1 + w2) * 0.5;\n let envelope = abs(cos((d1 - d2) * 40.5));\n // Intensity is the square of the summed wave, so it is exactly zero on the nodal lines.\n let glow = wave * wave;\n var color = mix(vec3f(0.055, 0.074, 0.18), vec3f(0.23, 0.64, 0.74), glow);\n color = mix(color, vec3f(0.96, 0.67, 0.36), pow(glow, 4.0) * envelope * 0.75);\n let fade = 1.0 - 0.38 * smoothstep(0.52, 0.95, length(p));\n color *= fade;\n for (var i = 0; i \u003c 2; i++) {\n let source = select(b, a, i == 0);\n let d = length(p - source);\n color += vec3f(1.0, 0.68, 0.28) * exp(-d * 50.0) * 0.75;\n color = mix(color, vec3f(1.0, 0.94, 0.72), 1.0 - smoothstep(0.008, 0.014, d));\n }\n return vec4f(color, 1.0);\n}\n"} {"scene":{"format":1,"duration_s":6,"fps":30,"loop":true,"size":[640,360],"seed":0.75,"params":{}},"wgsl":"\nfn ocean_slope(p: vec2f, phase: f32) -> vec2f {\n var slope = vec2f(0.0);\n var frequency = 1.8;\n var amplitude = 0.17;\n for (var i = 0; i \u003c 5; i++) {\n let fi = f32(i);\n let direction = vec2f(cos(fi * 2.4), sin(fi * 2.4));\n slope += direction * cos(dot(p, direction) * frequency + phase * (1.0 + f32(i % 2))) * amplitude;\n frequency *= 1.9;\n amplitude *= 0.57;\n }\n return slope;\n}\nfn dusk_sky(y: f32) -> vec3f {\n let horizon = vec3f(0.86, 0.43, 0.31);\n let zenith = vec3f(0.14, 0.18, 0.34);\n return mix(horizon, zenith, smoothstep(0.0, 0.65, y));\n}\n@fragment fn fs_main(@location(0) uv: vec2f) -> @location(0) vec4f {\n let p = centered(uv, u.aspect);\n let phase = u.phase * TAU;\n let horizon = 0.065;\n let sunPos = vec2f(0.29, 0.125);\n let sunDistance = length(p - sunPos);\n var color = dusk_sky(p.y - horizon);\n color += vec3f(0.22, 0.075, 0.015) * exp(-sunDistance * 6.0);\n color = mix(color, vec3f(1.0, 0.82, 0.53), 1.0 - smoothstep(0.025, 0.028, sunDistance));\n let wisps = fbm(vec2f(p.x * 3.0 + 0.025 * cos(phase), p.y * 20.0 + 0.025 * sin(phase)), 3);\n color = mix(color, vec3f(0.62, 0.35, 0.39), smoothstep(0.48, 0.75, wisps) * smoothstep(0.12, 0.4, p.y) * 0.38);\n if (p.y \u003c horizon) {\n let depth = horizon - p.y;\n let distance = 0.85 / (depth + 0.025);\n let world = vec2f(p.x * distance, distance);\n let slope = ocean_slope(world, phase);\n let normal = normalize(vec3f(-slope.x, 1.0, -slope.y));\n let view = normalize(vec3f(p.x, p.y - horizon, -1.0));\n let reflected = reflect(view, normal);\n let fresnel = pow(1.0 - max(dot(-view, normal), 0.0), 4.0);\n color = mix(vec3f(0.035, 0.065, 0.12), dusk_sky(max(reflected.y, 0.0)), 0.42 + 0.5 * fresnel);\n let sunRay = normalize(vec3f(0.29, 0.065, -1.0));\n let glint = pow(max(dot(reflected, sunRay), 0.0), 350.0);\n color += vec3f(1.0, 0.57, 0.25) * glint * 1.6;\n let shimmer = exp(-pow((p.x - 0.29 + slope.x * 0.20) / (0.025 + depth * 0.18), 2.0));\n color += vec3f(0.65, 0.25, 0.10) * shimmer * pow(max(0.0, 0.5 + slope.y * 2.0), 4.0) * exp(-depth * 2.0);\n color = mix(color, vec3f(0.64, 0.36, 0.34), exp(-depth * 70.0) * 0.55);\n }\n color *= 1.0 - 0.15 * dot(p, p);\n return vec4f(pow(max(color, vec3f(0.0)), vec3f(0.9)), 1.0);\n}\n"} {"scene":{"format":1,"duration_s":6,"fps":30,"loop":true,"size":[640,360],"seed":0.8125,"params":{}},"wgsl":"\nfn segment_distance(p: vec2f, a: vec2f, b: vec2f) -> f32 {\n let v = b - a;\n return length(p - a - v * clamp(dot(p - a, v) / max(dot(v, v), 0.00001), 0.0, 1.0));\n}\nfn tube_color(base: vec3f, offset: f32, radius: f32, depth: f32) -> vec3f {\n let cross = clamp(offset / radius, -1.0, 1.0);\n let bulge = sqrt(max(0.0, 1.0 - cross * cross));\n let light = max(0.0, 0.88 * bulge + 0.45 * cross);\n let specular = pow(light, 22.0);\n return base * (0.18 + 0.72 * bulge) * (0.26 + 0.74 * depth) + vec3f(0.93, 0.96, 0.95) * specular * depth * 0.70;\n}\n@fragment fn fs_main(@location(0) uv: vec2f) -> @location(0) vec4f {\n let p = centered(uv, u.aspect);\n let q = rot2(-0.085) * p;\n let phase = u.phase * TAU;\n let frequency = 9.0;\n let depthShift = 0.055;\n let radius = 0.295 * (1.0 - 0.12 * q.x);\n var firstX = q.x;\n var secondX = q.x;\n for (var k = 0; k \u003c 4; k++) {\n let t1 = firstX * frequency + phase;\n let t2 = secondX * frequency + phase;\n firstX -= (firstX + depthShift * sin(t1) - q.x) / (1.0 + depthShift * frequency * cos(t1));\n secondX -= (secondX - depthShift * sin(t2) - q.x) / (1.0 - depthShift * frequency * cos(t2));\n }\n let theta1 = firstX * frequency + phase;\n let theta2 = secondX * frequency + phase;\n let y1 = radius * cos(theta1);\n let y2 = -radius * cos(theta2);\n let z1 = sin(theta1);\n let z2 = -sin(theta2);\n let tube1 = 0.020 + 0.007 * (0.5 + 0.5 * z1);\n let tube2 = 0.020 + 0.007 * (0.5 + 0.5 * z2);\n let mask1 = 1.0 - smoothstep(tube1 - 0.002, tube1 + 0.002, abs(q.y - y1));\n let mask2 = 1.0 - smoothstep(tube2 - 0.002, tube2 + 0.002, abs(q.y - y2));\n let window = smoothstep(-0.83, -0.76, q.x) * (1.0 - smoothstep(0.76, 0.83, q.x));\n var color = vec3f(0.026, 0.032, 0.065) + vec3f(0.038, 0.034, 0.075) * exp(-length(q * vec2f(0.7, 1.3)) * 2.4);\n color += vec3f(0.055, 0.071, 0.080) * exp(-abs(q.y) * 13.0) * window;\n let firstSurface = tube_color(vec3f(0.12, 0.73, 0.68), q.y - y1, tube1, z1 * 0.5 + 0.5);\n let secondSurface = tube_color(vec3f(0.91, 0.34, 0.30), q.y - y2, tube2, z2 * 0.5 + 0.5);\n if (z1 \u003c 0.0) { color = mix(color, firstSurface, mask1 * window); }\n if (z2 \u003c 0.0) { color = mix(color, secondSurface, mask2 * window); }\n for (var i = 0; i \u003c 21; i++) {\n let cycle = -0.75 + f32(i) * 0.075;\n let angle = cycle * frequency + phase;\n let width = 0.295 * (1.0 - 0.12 * cycle);\n let spread = depthShift * sin(angle);\n let a = vec2f(cycle + spread, width * cos(angle));\n let b = vec2f(cycle - spread, -width * cos(angle));\n let d = segment_distance(q, a, b);\n let rung = (1.0 - smoothstep(0.008, 0.012, d)) * window;\n let tone = f32(i % 4) / 3.0;\n let base = mix(vec3f(0.52, 0.61, 0.67), vec3f(0.90, 0.72, 0.45), tone);\n let bulge = sqrt(max(0.0, 1.0 - pow(d / 0.012, 2.0)));\n color = mix(color, base * (0.38 + 0.56 * bulge) + vec3f(0.93, 0.89, 0.76) * pow(bulge, 8.0) * 0.18, rung);\n }\n if (z1 >= 0.0) {\n color *= 1.0 - 0.13 * exp(-abs(q.y - y1) * 65.0) * window;\n color = mix(color, firstSurface, mask1 * window);\n }\n if (z2 >= 0.0) {\n color *= 1.0 - 0.13 * exp(-abs(q.y - y2) * 65.0) * window;\n color = mix(color, secondSurface, mask2 * window);\n }\n color *= 1.0 - 0.20 * dot(p, p);\n return vec4f(pow(max(color, vec3f(0.0)), vec3f(0.87)), 1.0);\n}\n"} {"scene":{"format":1,"duration_s":6,"fps":30,"loop":true,"size":[640,360],"seed":0.875,"params":{}},"wgsl":"\nfn chrome_union(a: f32, b: f32) -> f32 {\n let h = max(0.28 - abs(a - b), 0.0) / 0.28;\n return min(a, b) - h * h * h * (0.28 / 6.0);\n}\nfn chrome_shape(p: vec3f, phase: f32) -> f32 {\n let a = length(p - vec3f(-0.24, 0.07 + 0.045 * sin(phase), 0.0)) - 0.27;\n let b = length(p - vec3f(0.18, -0.06, 0.06 * cos(phase))) - 0.24;\n let c = length(p - vec3f(0.06 + 0.06 * cos(phase), 0.25, -0.01)) - 0.18;\n return chrome_union(chrome_union(a, b), c);\n}\nfn chrome_studio(r: vec3f) -> vec3f {\n let sky = smoothstep(-0.32, 0.65, r.y);\n var radiance = mix(vec3f(0.035, 0.041, 0.052), vec3f(0.52, 0.57, 0.65), sky);\n let keyAxis = normalize(vec3f(-0.6, 0.8, 0.8));\n let keySide = normalize(cross(keyAxis, vec3f(0.0, 1.0, 0.0)));\n let keyUp = cross(keySide, keyAxis);\n let boxFacing = smoothstep(0.0, 0.5, dot(r, keyAxis));\n let key = exp(-pow(abs(dot(r, keySide) / 0.75), 4.0) - pow(abs(dot(r, keyUp) / 0.32), 2.0)) * boxFacing;\n let core = exp(-pow(abs(dot(r, keySide)) / 0.70, 6.0) - pow(abs(dot(r, keyUp) / 0.09), 4.0)) * boxFacing;\n let fillAxis = normalize(vec3f(0.9, 0.15, 0.7));\n let fill = pow(max(dot(r, fillAxis), 0.0), 18.0);\n let rim = pow(max(dot(r, normalize(vec3f(0.7, 0.25, -0.6))), 0.0), 6.0);\n radiance += vec3f(1.4, 1.3, 1.2) * key + vec3f(4.2, 4.1, 4.0) * core;\n radiance += vec3f(1.7, 1.9, 2.2) * fill;\n radiance += vec3f(0.12, 0.30, 0.55) * rim;\n radiance += vec3f(0.12, 0.13, 0.15) * exp(-pow(abs((r.y + 0.70) / 0.28), 2.0));\n return radiance;\n}\n@fragment fn fs_main(@location(0) uv: vec2f) -> @location(0) vec4f {\n let p = centered(uv, u.aspect);\n let phase = u.phase * TAU;\n let q = rot2(0.07 * sin(phase)) * p;\n var color = mix(vec3f(0.13, 0.15, 0.18), vec3f(0.035, 0.043, 0.060), smoothstep(-0.5, 0.5, p.y));\n let shadow = exp(-pow(abs((p.x - 0.04) * 3.3), 2.0) - pow(abs((p.y + 0.255) * 19.0), 2.0));\n let contact = exp(-pow(abs((p.x - 0.13) * 6.0), 2.0) - pow(abs((p.y + 0.231) * 52.0), 2.0));\n color *= (1.0 - shadow * 0.55) * (1.0 - contact * 0.35);\n let background = color;\n let origin = vec3f(q * 1.4, 2.0);\n let ray = vec3f(0.0, 0.0, -1.0);\n var travel = 0.0;\n var distance = 1.0;\n for (var i = 0; i \u003c 64; i++) {\n distance = chrome_shape(origin + ray * travel, phase);\n if (distance \u003c 0.0003 || travel > 3.0) { break; }\n travel += distance;\n }\n if (distance \u003c 0.0003) {\n let hit = origin + ray * travel;\n // A wider central difference softens the normal transition at the droplet necks.\n let e = 0.007;\n let n = normalize(vec3f(\n chrome_shape(hit + vec3f(e, 0.0, 0.0), phase) - chrome_shape(hit - vec3f(e, 0.0, 0.0), phase),\n chrome_shape(hit + vec3f(0.0, e, 0.0), phase) - chrome_shape(hit - vec3f(0.0, e, 0.0), phase),\n chrome_shape(hit + vec3f(0.0, 0.0, e), phase) - chrome_shape(hit - vec3f(0.0, 0.0, e), phase)));\n let r = reflect(ray, n);\n let fresnel = vec3f(0.88, 0.90, 0.93) + vec3f(0.12, 0.10, 0.07) * pow(clamp(1.0 - n.z, 0.0, 1.0), 5.0);\n let occlusion = clamp(chrome_shape(hit + n * 0.12, phase) / 0.12, 0.72, 1.0);\n color = chrome_studio(r) * fresnel * occlusion;\n color += vec3f(0.13, 0.19, 0.29) * pow(clamp(1.0 - n.z, 0.0, 1.0), 3.0);\n color = mix(background, color, smoothstep(0.0, 0.075, n.z));\n }\n color *= 1.0 - 0.12 * dot(p, p);\n // Preserve the HDR softbox gradients instead of clipping them into white patches.\n return vec4f(pow(color / (color + vec3f(0.65)), vec3f(0.85)), 1.0);\n}\n"} from your code POST /v1/renders {"prompt": "A cinematic macro of teal ink and liquid gol…" } GET /v1/renders/r_8f3k2a0b1c2d3e4f ready <script type="module" src= "cdn.text2shader.com/v1/r_8f3k2a0b1c2d3e4f.js" > docs →