Source-colored spiral arms taper into fine curling tips, with smaller branching filaments. Curl tightens the coils; branching adds offshoots. Try Liquid Islands before it and a color treatment after.
Defaults as a layer
{ "effectId": "inkTendrils", "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, "curl": 0.55, "width": 0.018, "branching": 0.5 } }
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 radius=length(p); float theta=atan(p.y,p.x); float taper=1.0-smoothstep(0.12,0.43,radius); float bestAngle=0.0; for(int i=0;i<6;i++) { float k=float(i); float phase=k*1.0472+(0.5+uCurl*7.0)*radius+t*0.2*uMotion; phase+=sin(radius*18.0-t+k)*0.25*uMotion; phase+=uOrganicShape*uOrganicRoughness*(sin(k*7.3+uOrganicSeed)*0.45+sin(radius*9.0+k*2.3)*0.3); float delta=atan(sin(theta-phase),cos(theta-phase)); float d=abs(delta)*max(radius,0.02); float width=uWidth*(0.1+0.9*taper); float m=(1.0-smoothstep(width,width+aa,d))*taper; float branchPhase=phase+sin(radius*14.0+k)*0.7; float bd=abs(atan(sin(theta-branchPhase),cos(theta-branchPhase)))*max(radius,0.02); float branch=(1.0-smoothstep(width*0.28,width*0.28+aa,bd))*smoothstep(0.09,0.18,radius)*taper*uBranching; m=max(m,branch)*(1.0-smoothstep(uCoverage*6.0,uCoverage*6.0+1.0,k)); if(m>coverage) bestAngle=phase; coverage=max(coverage,m); } vec2 uv=origin+vec2(cos(bestAngle-radius*3.0),sin(bestAngle-radius*3.0))*radius*uSize/aspect; art=texture2D(uTex,clamp(uv,0.0,1.0)); art.rgb*=0.72+0.4*taper; gl_FragColor = floatingResult(base, art, coverage * smoothstep(0.0, 0.06, uCoverage)); }