Lección 5 de 10 · Patrones en shaders
Polar
HAL te ve. Sectores de una iris.
Hasta ahora todo era horizontal y vertical, p.x y p.y. Pero hay otra forma de describir una posición: ¿a qué ángulo estás? y ¿qué tan lejos del centro?
Eso son las coordenadas polares. En vez de izquierda-derecha y arriba-abajo, piensas en giro y distancia. Como un reloj: cada punto tiene una hora (ángulo) y una distancia al centro.
Mismo espacio. Otra forma de recorrerlo.
atan(p.y, p.x)Te da el ángulo del frag respecto al centro. Va de -3.14 a 3.14 (una vuelta completa). Arriba es 1.57, a la derecha es 0, abajo es -1.57. Con esto puedes hacer cualquier cosa circular.
Cambia el
3. a 6., más rebanadas. A 1., solo un gradiente que gira. Prueba sumarle + T al ángulo para que todo rote lentamente. Pista: sin(ang * 3. + T)El código
void main(){
vec2 p = (2.*gl_FragCoord.xy - R) / min(R.x, R.y);
float ang = atan(p.y, p.x);
float d = length(p);
float v = sin(ang * 3.) * .5 + .5;
float rings = smoothstep(.03,.0, abs(fract(d*4.)-.5)-.2);
float eye = smoothstep(0.25, 0.23, d);
float pupil = smoothstep(0.12, 0.1, d);
float shadow = smoothstep(0.0,.3, length(p+vec2(.05,-.07))-.8);
vec3 col = vec3(0.04,0.03,0.06) * shadow;
col += vec3(.2,.15,.1) * rings * (1.-eye);
col += vec3(.3,.12,.08) * v * (1.-eye) * .3;
col = mix(col, vec3(0.9,0.15,0.05), eye);
col = mix(col, vec3(0.95,0.85,0.2), pupil*.8);
col += vec3(.9,.2,.1) * exp(-d*2.) * .5;
col = hueShift(col, 0.0);
gl_FragColor = vec4(col, 1.);
}