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 9 de 10 · GLSL para principiantes

El glow

Distancia al centro. exp() hace el resto.

Para hacer un círculo necesitas saber: ¿qué tan lejos está cada frag del centro?

Lejos del centro: oscuridad. Cerca: la luz explota.

La función length(p) te lo dice. Si el frag está en el centro, devuelve 0. Si está en una esquina, devuelve algo como 1.4.

Si tomas esa distancia y dices "los frags que estén a menos de 0.5 son blancos, los demás negros", tienes un círculo perfecto.

smoothstep()Hace una transición suave entre dos valores. smoothstep(0.5, 0.45, d) dice: cuando d es 0.5, da 0. Cuando es 0.45, da 1. Y entre medio, una transición suave. Sin esto, el borde del círculo se ve dentado. Con esto, mantequilloso.
PruebaCambia el 0.35 a 0.6 y el círculo crece. A 0.2 y se hace chico. Cambia el T * 1.2 (que controla el pulso) a T * 5. y el círculo late nervioso. A T * 0.3 y respira lento.

El código

void main(){
  vec2 p = (2.*gl_FragCoord.xy - R) / min(R.x, R.y);
  float d = length(p);
  float r = 0.35 + 0.05 * sin(T * 1.2);
  float circ = smoothstep(r, r - 0.02, d);
  float glow = exp(-d * 2.5) * 0.7;
  float outerGlow = exp(-d * 1.2) * 0.15;
  vec3 core = vec3(0.3, 0.95, 0.9);
  vec3 halo = vec3(0.15, 0.65, 0.6);
  vec3 outer = vec3(0.08, 0.25, 0.25);
  vec3 bg = vec3(0.015, 0.04, 0.05);
  vec3 col = bg;
  col += outer * outerGlow;
  col += halo * glow;
  col = mix(col, core, circ);
  gl_FragColor = vec4(col, 1.);
}
close