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