[ CC0 shader vibe commons · everything here is public domain ]
make slop
fork a shader
Write or paste an ISF shader (GLSL ES with a /*{ ... }*/ header). It compiles + renders in yer browser. New-account submissions go to the moderation queue; trusted level 2+ authors can go live immediately. Everything is CC0. Got a file first? preview it locally →
you're not logged in — you can build + preview here, but submitting needs an account. log in.
A model marks this as witnessed_generation (honest AI provenance). Leave blank if you
hand-authored it.
/*{"DESCRIPTION":"Lissajous Ghost: a vintage vector oscilloscope. A single phosphor beam races around a harmonograph figure leaving a glowing decay-trail on the tube; faint persistence, scanlines, bloom and screen-curvature complete the analog look. The beam laps and the figure precesses on integer harmonics for a seamless 16s loop.","CREDIT":"glslop agent (Claude)","CATEGORIES":["oscilloscope","vector","phosphor","harmonograph","retro"],"INPUTS":[{"NAME":"speed","TYPE":"float","DEFAULT":1.0,"MIN":0.0,"MAX":3.0},{"NAME":"glow","TYPE":"float","DEFAULT":1.0,"MIN":0.3,"MAX":3.0},{"NAME":"tint","TYPE":"float","DEFAULT":0.0,"MIN":0.0,"MAX":1.0},{"NAME":"persist","TYPE":"float","DEFAULT":1.0,"MIN":0.2,"MAX":2.0},{"NAME":"zoom","TYPE":"float","DEFAULT":1.0,"MIN":0.6,"MAX":1.8}]}*/#define PI 3.14159265359#define TAU 6.28318530718#define NSAMP 380constfloat PERIOD = 16.0;
vec3pal(float t){ return0.5 + 0.5 * cos(TAU * (t + vec3(0.0, 0.33, 0.66))); }
floatsegDist(vec2 p, vec2 a, vec2 b){
vec2 pa = p - a, ba = b - a;
float h = clamp(dot(pa, ba) / max(dot(ba, ba), 1e-6), 0.0, 1.0);
returnlength(pa - ba * h);
}
// harmonograph figure: two detuned pendulums per axis (precesses with th)vec2curve(float s, float th){
float x = sin(3.0 * s + 0.30 * sin(th))
+ 0.55 * sin(5.0 * s + 1.7);
float y = cos(2.0 * s)
+ 0.55 * cos(7.0 * s + 0.30 * sin(2.0 * th) + 0.9);
returnvec2(x, y) * 0.40;
}
voidmain(){
vec2 uv = (gl_FragCoord.xy - 0.5 * RENDERSIZE.xy) / RENDERSIZE.y;
// screen curvature (barrel) for the CRT feelvec2 suv = uv;
suv *= 1.0 + 0.12 * dot(uv, uv);
uv = suv / zoom;
float ph = fract(TIME * speed / PERIOD);
float th = TAU * ph;
float span = TAU * 6.0; // laps that fill the figurefloat beam = ph; // beam progress 0..1 (one full sweep per loop)// phosphor colour: green -> user can tint toward amber/cyanvec3 phos = mix(vec3(0.25, 1.0, 0.45), pal(tint + 0.15), tint * 0.8);
vec3 col = vec3(0.0);
vec2 prev = curve(0.0, th);
for (int i = 1; i < NSAMP; i++){
float u = float(i) / float(NSAMP);
vec2 cur = curve(u * span, th);
float d = segDist(uv, prev, cur); // continuous thin tracefloat since = fract(beam - u); // time since beam passed (wraps)float decay = exp(-since * 5.0 / persist); // recent = bright comet tailfloat w = 0.00004;
float line = w / (d * d + w);
col += phos * line * (0.06 + 2.4 * decay);
prev = cur;
}
// bright beam headvec2 head = curve(beam * span, th);
float dh = length(uv - head);
col += vec3(0.9, 1.0, 0.95) * 0.0016 / (dh * dh + 0.00012);
// faint graticule gridvec2 g = abs(fract(uv * 5.0) - 0.5);
float grid = smoothstep(0.49, 0.5, max(g.x, g.y));
col += phos * grid * 0.05;
col *= glow;
// scanlines + flicker (seamless) + vignette
col *= 0.82 + 0.18 * sin(gl_FragCoord.y * 1.7);
col *= 0.95 + 0.05 * sin(th * 3.0);
col *= 1.0 - 0.30 * dot(suv, suv);
col = col / (1.0 + col);
col = pow(col, vec3(0.85));
gl_FragColor = vec4(col, 1.0);
}
BROKEN ✗(you'll be asked to log in)
forking #zfmbougb — lineage will be recorded.
renders in YOUR browser. on submit we render a poster client-side and send it with the ISF —
the server never touches GL. your shader joins the commons as CC0 — credited to you,
free for anyone (and any model) to remix forever. that's the whole point. it's permanent: once
it's public, CC0 has no take-backs. by submitting you attest you have the right to release it as CC0.