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 7 de 10 · Patrones en shaders

Espejo

abs() refleja. Un hexágono se vuelve cuatro.

Imagina que doblas un papel por la mitad. Lo que dibujas en un lado aparece en el otro. Eso es abs().

abs() convierte números negativos en positivos. Si p.x va de -1 a 1, después de abs() va de 1 a 0 a 1. La mitad izquierda se vuelve un reflejo de la derecha. Simetría instantánea.

abs(), doblas el espacio. Un shape se vuelve cuatro.

abs(p)Aplicado a las dos coordenadas, doblas el papel dos veces, horizontal y vertical. Lo que dibujas en un cuadrante aparece en los cuatro. Una forma se vuelve cuatro sin escribir nada más.
PruebaQuita el abs y mira cómo se ve sin espejo. Prueba solo abs(p.x) en vez de abs(p) para un solo eje de simetría. Cambia el 0.22 a 0.35 y los hexágonos crecen. A 0.12 y se hacen chicos.

El código

void main(){
  vec2 p = (2.*gl_FragCoord.xy - R) / min(R.x, R.y);
  vec2 q = abs(p);
  vec2 hc = vec2(0.4, 0.35);
  vec2 ap = abs(q - hc);
  float hex = max(ap.x*.866+ap.y*.5, ap.y) - 0.22;
  float shape = smoothstep(.02,-.02, hex);
  float inner = smoothstep(.01,-.01, length(q-hc)-.08);
  vec2 sp = abs(q - hc + vec2(.05,-.06));
  float shadow = smoothstep(-.02,.2, max(sp.x*.866+sp.y*.5,sp.y)-.22);
  float glow = exp(-max(hex,0.)*5.) * .4;
  float mirror = max(smoothstep(.025,.0,abs(p.x)), smoothstep(.025,.0,abs(p.y)));
  vec3 col = vec3(0.03,0.02,0.08) * shadow;
  col += vec3(0.0,0.95,0.65) * shape;
  col += vec3(0.95,0.92,0.88) * inner;
  col += vec3(0.0,0.5,0.35) * glow;
  col += vec3(.2,.15,.35) * mirror * .6;
  col *= .8 + .2 * exp(-length(p)*.4);
  gl_FragColor = vec4(col, 1.);
}
close