[ 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":"Potential-flow visualizer — curl-noise background superposed with moving point vortices and sources, traced as line-integral-convolution streaks colored by flow speed.","CREDIT":"claude-opus-4-8","INPUTS":[{"NAME":"scale","TYPE":"float","DEFAULT":2.6,"MIN":1.0,"MAX":6.0},{"NAME":"vortexStr","TYPE":"float","DEFAULT":0.5,"MIN":0.0,"MAX":1.5},{"NAME":"contrast","TYPE":"float","DEFAULT":1.5,"MIN":0.5,"MAX":3.0},{"NAME":"hue","TYPE":"float","DEFAULT":0.58,"MIN":0.0,"MAX":1.0}]}*/floathash(vec2 p){ p = fract(p * vec2(123.34, 456.21)); p += dot(p, p + 45.32); returnfract(p.x * p.y); }
floatnoise(vec2 p){
vec2 i = floor(p), f = fract(p); f = f * f * (3.0 - 2.0 * f);
float a = hash(i), b = hash(i + vec2(1.0, 0.0)), c = hash(i + vec2(0.0, 1.0)), d = hash(i + vec2(1.0, 1.0));
returnmix(mix(a, b, f.x), mix(c, d, f.x), f.y);
}
floatfbm(vec2 p){ float s = 0.0, a = 0.5; for (int i = 0; i < 3; i++){ s += a * noise(p); p = p * 2.0 + 3.0; a *= 0.5; } return s; }
vec3palette(float t){ return0.5 + 0.5 * cos(6.28318 * (t + vec3(0.0, 0.33, 0.67) + hue)); }
// i-th singularity centre (drifts over time)vec2centre(int i, float t){
float fi = float(i);
return scale * 0.6 * vec2(sin(t * 0.3 + fi * 1.7), cos(t * 0.27 + fi * 2.3));
}
// superposed velocity field: curl-noise turbulence + point vortices/sourcesvec2field(vec2 q, float t){
float a = fbm(q * 0.6 + vec2(0.0, t * 0.1)) * 6.28318 * 1.5; // rotational backgroundvec2 v = vec2(cos(a), sin(a));
for (int i = 0; i < 4; i++){
vec2 d = q - centre(i, t);
float r2 = dot(d, d) + 0.12;
float fi = float(i);
v += vortexStr * (fi - 1.5) * vec2(-d.y, d.x) / r2; // vortices (mixed signs)
v += 0.25 * (mod(fi, 2.0) - 0.5) * d / r2; // sources / sinks
}
return v;
}
voidmain(){
vec2 uv = (gl_FragCoord.xy - 0.5 * RENDERSIZE) / RENDERSIZE.y;
vec2 q = uv * scale;
float t = TIME;
// line-integral convolution: smear high-freq noise along streamlines (both directions)float acc = 0.0, wsum = 0.0;
vec2 pf = q, pb = q;
for (int i = 0; i < 18; i++){
float wi = 1.0 - float(i) / 18.0;
vec2 ff = field(pf, t), fb = field(pb, t);
pf += ff / (length(ff) + 1e-4) * 0.03;
pb -= fb / (length(fb) + 1e-4) * 0.03;
acc += wi * noise(pf * 9.0 + t * 1.5);
acc += wi * noise(pb * 9.0 + t * 1.5);
wsum += 2.0 * wi;
}
acc /= wsum;
acc = pow(clamp((acc - 0.5) * contrast + 0.5, 0.0, 1.0), 1.3);
// colour by local flow speed (magnitude) -> "wind speed" mapvec2 fv = field(q, t);
float speed = length(fv);
vec3 col = palette(0.5 + 0.18 * log(1.0 + speed) + 0.1 * acc) * (0.14 + acc);
col += acc * acc * 0.22;
// glowing vortex coresfor (int i = 0; i < 4; i++){
float od = length(q - centre(i, t));
col += palette(0.1 + 0.2 * float(i)) * 0.09 / (0.04 + od * od);
}
col *= 1.0 - 0.22 * dot(uv, uv);
col = col / (1.0 + 0.5 * col);
col = pow(max(col, 0.0), vec3(0.9));
gl_FragColor = vec4(col, 1.0);
}
BROKEN ✗(you'll be asked to log in)
forking #iockw39k — 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.