onomatoshader · toca para re-explotar
wogl.io
#version 300 es
in vec2 p; void main(){ gl_Position=vec4(p,0.,1.); }
#version 300 es
precision highp float;
out vec4 frag;
uniform vec2 uRes;
uniform float uTime, uPop, uShake;
uniform sampler2D uTex;
uniform vec3 uStar, uRay, uBg, uDot;
float hash(vec2 p){ p=fract(p*vec2(123.34,456.21)); p+=dot(p,p+45.32); return fract(p.x*p.y); }
mat2 rot(float a){ float c=cos(a),s=sin(a); return mat2(c,-s,s,c); }
vec3 wShoulder(vec3 c){
c = max(c, 0.0);
float p = max(c.r, max(c.g, c.b));
if (p <= 0.70) return c;
float s = 0.70 + 0.30 * (1.0 - exp(-(p - 0.70) / 0.30));
return c * (s / p);
}
void main(){
vec2 uv=gl_FragCoord.xy/uRes;
vec2 p=(gl_FragCoord.xy-0.5*uRes)/uRes.y;
float rad=length(p), ang=atan(p.y,p.x);
float sc=max(uPop,0.001);
// ── fondo cómic: color + medios tonos Ben-Day ──
vec3 col=mix(uBg*1.08, uBg*0.80, uv.y);
vec2 hp=p*20.0; float dd=length(fract(hp)-0.5);
col=mix(col, uDot, smoothstep(0.36,0.30,dd)*0.18);
// ── líneas de velocidad (radiales, sólo afuera) ──
float rays=smoothstep(0.5,0.95,abs(sin(ang*18.0)));
rays*=smoothstep(0.35,0.95,rad);
col=mix(col, uRay, rays*0.30);
// ── estrella de impacto (polígono con picos), aparece con el pop ──
vec2 sp=rot(uTime*0.12)*p/sc;
float sang=atan(sp.y,sp.x);
float spike=0.42+0.14*pow(abs(cos(sang*6.0)),0.5);
float sr=length(sp)/spike;
float starFill=smoothstep(1.01,0.99,sr);
float starLine=smoothstep(1.13,1.04,sr)-smoothstep(1.00,0.965,sr);
col=mix(col, uStar, starFill);
col=mix(col, vec3(0.04), starLine); // contorno de tinta
// ── LA PALABRA (textura) · pop + shake + wobble + aberración ──
float halfW=0.60;
float availHalf=(uRes.x/uRes.y)*0.5*0.92;
float fit=min(1.0, availHalf/halfW);
vec2 tp=p/sc + uShake*vec2(sin(uTime*90.0),cos(uTime*84.0));
tp += 0.004*vec2(sin(tp.y*16.0+uTime*3.0), cos(tp.x*16.0+uTime*3.0)); // vibración viva
vec2 tuv=vec2( tp.x/(1.2*fit) + 0.5, 0.5 - tp.y/(0.6*fit) );
// glow exterior (halo blanco alrededor de las letras)
float glow=0.0;
for(int i=0;i<6;i++){ float a=6.2831*float(i)/6.0; glow+=texture(uTex,tuv+vec2(cos(a),sin(a))*0.013).a; }
col=mix(col, vec3(1.0), clamp(glow/6.0,0.0,1.0)*0.45);
// aberración cromática (R y B desfasados)
float ca=0.005;
vec4 cr=texture(uTex,tuv+vec2(ca,0.0));
vec4 cg=texture(uTex,tuv);
vec4 cb=texture(uTex,tuv-vec2(ca,0.0));
vec3 tcol=vec3(cr.r,cg.g,cb.b);
float ta=max(cr.a,max(cg.a,cb.a));
col=mix(col, tcol, ta);
// ── marco cómic: viñeta + grano ──
col*=mix(0.72,1.0, smoothstep(1.35,0.3,rad));
col+=(hash(gl_FragCoord.xy+fract(uTime))-0.5)*0.03;
frag=vec4(wShoulder(col),1.0);
}