Small source tiles scatter into an open cloud of rotating squares and slivers. Tile size controls the grid; scatter spreads each fragment and tumble animates rotation. Try Posterize before it for bold colored pieces.
Defaults as a layer
{ "effectId": "pixelConfetti", "params": { "amount": 0.8, "speed": 0.45, "motion": 0.55, "size": 0.85, "coverage": 0.65, "softness": 0.15, "centerX": 0.5, "centerY": 0.5, "tileSize": 0.45, "scatter": 0.6, "tumble": 0.7 } }
GLSL fragment shader
The effect's own code. The uniforms and helpers above it — uTex, uFeedback, the depth proxy, the frame ring, depthAt(), timeAt() — are the same header every Ether-MOSH shader opens with, and are documented once on the registry rather than reprinted on all 143 pages.
void main(){ vec4 base = texture2D(uTex, vUv); vec2 aspect = vec2(uResolution.x / max(uResolution.y, 1.0), 1.0); vec2 origin = vec2(uCenterX, uCenterY); if(uOrganicShape>0.5) origin=vec2(0.5)+(origin-0.5)*0.35/vec2(max(aspect.x,1.0),max(1.0/aspect.x,1.0)); vec2 p = (vUv - origin) * aspect / max(uSize, 0.01); float t = uTime * uSpeed; float aa = max(1.25 / max(uResolution.y * uSize, 1.0), 0.001) + uSoftness * 0.025; float coverage = 0.0; vec4 art = base; float cell=0.045+uTileSize*0.10; vec2 grid=floor(p/cell); vec2 sampleUv=vUv; // Neighbour lookup lets fragments move across cell boundaries without clipping. for(int y=-1;y<=1;y++) for(int x=-1;x<=1;x++) { vec2 id=grid+vec2(float(x),float(y)); float seed=fract(sin(dot(id,vec2(127.1,311.7)))*43758.5453); float seed2=fract(sin(dot(id,vec2(269.5,183.3)))*43758.5453); vec2 center=(id+0.5)*cell; float reach=1.0-smoothstep(0.24,0.42,length(center)); float enabledShape=1.0-smoothstep(uCoverage*0.9,uCoverage*0.9+0.08,seed); vec2 shift=vec2(sin(seed*6.283+t*uMotion),cos(seed2*6.283+t*0.7*uMotion))*cell*0.42*uScatter; float angle=seed*6.283+t*uTumble*uMotion*(seed2-0.5)*3.0; mat2 rot=mat2(cos(angle),-sin(angle),sin(angle),cos(angle)); vec2 q=rot*(p-center-shift); vec2 halfSize=cell*vec2(0.16+seed*0.12,0.08+seed2*0.20); float d=max(abs(q.x)-halfSize.x,abs(q.y)-halfSize.y); if(uOrganicShape>0.5) d=organicFragment(q/halfSize,1.15,seed*27.0)*min(halfSize.x,halfSize.y); float m=(1.0-smoothstep(-aa,aa,d))*reach*enabledShape; if(m>coverage) sampleUv=clamp(origin+(center+q)*uSize/aspect,0.0,1.0); coverage=max(coverage,m); } art=texture2D(uTex,sampleUv); gl_FragColor = floatingResult(base, art, coverage * smoothstep(0.0, 0.06, uCoverage)); }