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