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