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.
Quita 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.);
}