Lección 9 de 10 · Animación en shaders
Rhythm
El hexágono late. Pico y descanso. Corazón, no metrónomo.
Un sin() sube y baja parejo. Un pulso tiene un pico fuerte y luego descanso, como un latido.
pow(x, 8.), todo se aplasta excepto el peak. Pulso quirúrgico.
pow(sin(T) * 0.5 + 0.5, 8.), normalizas el seno a 0-1, lo elevas a una potencia alta. Los valores cercanos a 1 sobreviven. Los demás se aplastan.
pow() como shaper
pow(x, n) donde x va de 0 a 1: potencias altas (8., 16.) concentran toda la energía en el peak. Es el truco para convertir cualquier onda en un pulso rítmico.Cambia el
6. (potencia) a 2., pulso suave. A 20., flash brevísimo. Cambia el T * 1.8 a T * 4. y el corazón se acelera.El código
void main(){
vec2 p = (2.*gl_FragCoord.xy - R) / min(R.x, R.y);
float beat = pow(sin(T * 1.8) * 0.5 + 0.5, 6.);
float r = 0.25 + beat * 0.15;
vec2 ap = abs(p);
float d = max(ap.x * 0.866 + ap.y * 0.5, ap.y) - r;
float shape = smoothstep(0.02, -0.02, d);
vec2 sp = abs(p + vec2(.05, -.08));
float shadow = smoothstep(0.0, 0.25+beat*.15, max(sp.x*.866+sp.y*.5,sp.y)-r*1.1);
float glow = exp(-max(d,0.)*(4.-beat*2.)) * 0.5;
vec3 col = vec3(0.04, 0.02, 0.01) * shadow;
col += vec3(0.95, 0.75, 0.2) * shape;
col += vec3(0.9, 0.6, 0.1) * glow * (0.3 + beat * 0.7);
col = hueShift(col, 0.0);
gl_FragColor = vec4(col, 1.);
}