Lección 9 de 10 · Patrones en shaders
Chladni
Vibración geométrica. La placa de Chladni.
Ernst Chladni ponía arena sobre una placa de metal y la hacía vibrar. La arena se movía hacia los puntos quietos y formaba patrones geométricos. Cada frecuencia produce un patrón diferente.
Dos ondas se multiplican. La interferencia dibuja sola.
La fórmula es dos senos multiplicados: sin(n * p.x) * sin(m * p.y). Los números n y m son los modos de vibración, cuántos nodos hay en cada dirección. Cuando sumas dos términos con n y m intercambiados, aparecen los patrones clásicos.
n y mNúmeros enteros que definen la identidad del patrón.
2, 3 = circuito complejo. 5, 7 = laberinto. 8, 8 = grilla simétrica. Cuando n y m son primos entre sí, la complejidad es máxima.Cambia
5. y 3. a 8., 8., patrón perfecto. A 2., 3., pocas celdas. A 7., 11., máxima complejidad. Pista: suma + T * 0.5 a los dos para que mute lentamente.El código
void main(){
vec2 p = (2.*gl_FragCoord.xy - R) / min(R.x, R.y);
float n = 5., m = 3.;
float z = sin(n*3.14*p.x)*sin(m*3.14*p.y)
+ sin(m*3.14*p.x)*sin(n*3.14*p.y);
float zx = sin(n*3.14*(p.x+.015))*sin(m*3.14*p.y)
+ sin(m*3.14*(p.x+.015))*sin(n*3.14*p.y);
float zy = sin(n*3.14*p.x)*sin(m*3.14*(p.y-.02))
+ sin(m*3.14*p.x)*sin(n*3.14*(p.y-.02));
float v = abs(z);
float emboss = ((z-zx)+(z-zy))*.5;
float hard = step(0.3, v);
vec3 a = vec3(0.92, 0.9, 0.85);
vec3 b = vec3(0.06, 0.04, 0.12);
vec3 col = mix(b, a, hard);
col += vec3(.2,.18,.12) * clamp(emboss,0.,1.) * hard;
col -= vec3(.15,.12,.1) * clamp(-emboss,0.,1.);
col *= .85 + .15 * exp(-length(p)*.4);
gl_FragColor = vec4(col, 1.);
}