learn GLSL from zero
ToolsCrea con shadersShader MakerCrea shaders gratis en líneaToolkitObras de shaders listas para tu webSketcher LabPinta el hero de tu landing con shaders3D StudioEl editor Three.js en tu navegador
GamesJuega con shadersOnomatoShaderEscribe una palabra y explótalaThe WatcherUn ojo que te sigueAetherVidrio líquido con un ojo adentroBloomcoreUna palabra hace crecer un jardín de luzPyrokineAvienta fuego a la paredVoltaicLa pirámide lanza rayosSurfSurfea un océano de shader

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 shaperpow(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.
PruebaCambia 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.);
}
close