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

Radial

La estrella que irradia. Lóbulos de fuego.

En Going polar usaste sin(ang) para hacer rebanadas. Ahora lo usas para deformar un círculo. Si el radio del círculo cambia según el ángulo, el círculo se convierte en forma.

El círculo deformado por su propio ángulo.

El truco: tomas length(p) como distancia al centro, y la comparas con un radio que oscila con el ángulo: 0.5 + 0.2 * sin(ang * N). Donde N es el número de lóbulos.

sin(ang * N)El ángulo recorre una vuelta completa. Si multiplicas por 5, el seno oscila 5 veces en esa vuelta, 5 picos, 5 valles, 5 lóbulos. Cambia N y cambia la forma.
PruebaCambia el 5. a 3., 3 brazos. A 8., 8 lóbulos. Prueba sumarle + T al ángulo para que gire. Pista: sin(ang * 5. + 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 dist = length(p);
  float r = 0.5 + 0.25 * sin(ang * 5.);
  float d = dist - r;
  float shape = smoothstep(.02, -.02, d);
  float r2 = 0.2 + 0.1 * sin(ang * 5. + 3.14);
  float inner = smoothstep(.02, -.02, dist - r2);
  float shadow = smoothstep(0.,.3, length(p+vec2(.05,-.07))-r);
  float glow = exp(-max(d,0.)*3.) * .5;
  float core = exp(-dist*3.) * .6;
  vec3 col = vec3(.04,.03,.08) * shadow;
  col += vec3(.95,.4,.7) * shape;
  col += vec3(.4,.1,.6) * inner;
  col += vec3(.9,.3,.5) * glow;
  col += vec3(.95,.8,.9) * core;
  gl_FragColor = vec4(col, 1.);
}
close