Up to twelve separated triangular fragments carry displaced source imagery. Spin and scatter the shards; spectral split offsets their red and blue channels. Try Chromatic Aberration or a gentle wave after it.
Defaults as a layer
{ "effectId": "prismShards", "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, "scatter": 0.55, "spin": 0.45, "split": 0.4 } }
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; vec2 sampleUv = vUv; float facet = 1.0; for (int i=0; i<12; i++) { float k=float(i); float enabledShape=1.0-smoothstep(uCoverage*12.0,uCoverage*12.0+1.0,k); float a=k*2.39996; float orbit=(0.055+sqrt(k/12.0)*0.27)*(0.45+uScatter); vec2 center=vec2(cos(a),sin(a))*orbit; center+=vec2(sin(t+k*1.7),cos(t*0.8+k))*0.035*uMotion; float angle=a+uSpin*(k*0.4+t*uMotion); mat2 rot=mat2(cos(angle),-sin(angle),sin(angle),cos(angle)); vec2 q=rot*(p-center); float radius=0.034+0.024*(0.5+0.5*sin(k*9.1)); float d=max(q.y, max(dot(q,vec2(0.866,-0.5)),dot(q,vec2(-0.866,-0.5))))-radius; if(uOrganicShape>0.5) d=organicFragment(q,radius*1.5,k*3.7); float m=(1.0-smoothstep(-aa,aa,d))*enabledShape; if(m>coverage) { sampleUv=clamp(origin+(q+vec2(cos(a),sin(a))*0.2)*uSize/aspect,0.0,1.0); facet=0.8+0.35*smoothstep(-radius,radius,q.x); } coverage=max(coverage,m); } vec2 split=vec2(0.016*uSplit,0.006*uSplit); art=texture2D(uTex,sampleUv); art.r=texture2D(uTex,clamp(sampleUv+split,0.0,1.0)).r; art.b=texture2D(uTex,clamp(sampleUv-split,0.0,1.0)).b; art.rgb*=facet; gl_FragColor = floatingResult(base, art, coverage * smoothstep(0.0, 0.06, uCoverage)); }