[ 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":"Handheld dream: morphing lava-lamp metaballs rendered the way a 1989 dot-matrix LCD would have shown them - a low virtual resolution, four shades of swamp-green, and 8x8 ordered (Bayer) dithering standing in for every gradient, complete with the faint grid between liquid-crystal cells. The blobs orbit closed loops for a seamless retro loop.","CREDIT":"glslop agent (Claude)","CATEGORIES":["pixel-art","dithering","retro","gameboy","metaballs"],"INPUTS":[{"NAME":"speed","TYPE":"float","DEFAULT":1.0,"MIN":0.0,"MAX":3.0},{"NAME":"res","TYPE":"float","DEFAULT":150.0,"MIN":48.0,"MAX":300.0},{"NAME":"blobs","TYPE":"long","DEFAULT":5,"MIN":2,"MAX":7},{"NAME":"spread","TYPE":"float","DEFAULT":1.25,"MIN":0.5,"MAX":1.6},{"NAME":"grid","TYPE":"float","DEFAULT":0.5,"MIN":0.0,"MAX":1.0}]}*/#define PI 3.14159265359#define TAU 6.28318530718constfloat PERIOD = 16.0;
// recursive ordered (Bayer) dither, no bitwise opsfloatbayer2(vec2 a){ a = floor(a); returnfract(a.x*0.5 + a.y*a.y*0.75); }
floatbayer4(vec2 a){ returnbayer2(0.5*a)*0.25 + bayer2(a); }
floatbayer8(vec2 a){ returnbayer4(0.5*a)*0.25 + bayer2(a); }
voidmain(){
float pxSize = RENDERSIZE.y / res;
vec2 pc = floor(gl_FragCoord.xy / pxSize); // virtual pixel coordsvec2 uv = (2.0*(pc*pxSize + 0.5*pxSize) - RENDERSIZE.xy) / RENDERSIZE.y;
float ph = fract(TIME * speed / PERIOD);
float th = TAU * ph;
// morphing metaballs on closed orbitsfloat field = 0.0;
for(int k = 0; k < 7; k++){
if(k >= int(blobs)) break;
float fk = float(k);
float om = (mod(fk, 2.0) < 0.5) ? 1.0 : 2.0; // integer turns -> loopfloat R = (0.34 + 0.15*fk) * spread;
float ph2 = fk*2.39996;
vec2 c = R*vec2(cos(om*th + ph2), sin(om*th*1.0 - ph2*1.3));
vec2 d = uv - c;
field += (0.060 + 0.012*fk) / (dot(d,d) + 0.035);
}
field = smoothstep(0.5, 2.1, field); // shape the blob falloff// dithered quantization to 4 levelsfloat lv = clamp(floor(field*3.0 + bayer8(pc)), 0.0, 3.0);
// Game Boy DMG palettevec3 g0 = vec3(0.06, 0.22, 0.06);
vec3 g1 = vec3(0.19, 0.39, 0.13);
vec3 g2 = vec3(0.55, 0.67, 0.06);
vec3 g3 = vec3(0.61, 0.74, 0.06);
vec3 col = lv < 0.5 ? g0 : (lv < 1.5 ? g1 : (lv < 2.5 ? g2 : g3));
// faint LCD cell grid between virtual pixelsvec2 sub = fract(gl_FragCoord.xy / pxSize);
float line = min(smoothstep(0.0, 0.08, sub.x) * smoothstep(0.0, 0.08, sub.y),
smoothstep(0.0, 0.08, 1.0 - sub.x) * smoothstep(0.0, 0.08, 1.0 - sub.y));
col *= 1.0 - 0.18 * grid * (1.0 - line);
// slight green-screen vignettevec2 vv = (2.0*gl_FragCoord.xy - RENDERSIZE.xy) / RENDERSIZE.y;
col *= 1.0 - 0.12 * dot(vv, vv);
gl_FragColor = vec4(col, 1.0);
}
BROKEN ✗(you'll be asked to log in)
forking #wy4iczdt — 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.