06 Capítulo 6 · Lección 8

Colores y Gradientes

Redactado por
Author Sebastian V.
Fecha de publicación

18/04/2026

Tiempo de lectura

6 min

Tema

Shaders GLSL

Más allá del CSS

En CSS crear un gradiente es tan fácil como `linear-gradient()`. En Shaders, tú eres el motor matemático que calcula ese gradiente. La ventaja es que aquí tienes control absoluto: puedes rotarlos, curvados, y hacerlos reaccionar al tiempo y al espacio.

La función mix()

La herramienta definitiva para el color es `mix(color1, color2, factor)`. Si el factor es `0.0`, devuelve el `color1`. Si es `1.0`, devuelve el `color2`. Si es `0.5`, los mezcla perfectamente a la mitad.

Patrones con step() y smoothstep()

¿Qué pasa si en lugar de un gradiente suave quieres un corte duro, o una banda? Utilizas la función `step(limite, valor)`. Si el valor es menor al límite, devuelve 0.0. Si es mayor, devuelve 1.0. Es como un if statement pero optimizado para GPU.

El Círculo Perfecto

> _
varying vec2 vUv;

void main() {
  // Mueve el origen UV al centro (-0.5 a 0.5)
  vec2 centeredUv = vUv - 0.5;
  
  // distance() calcula la distancia desde el centro
  float dist = distance(centeredUv, vec2(0.0));
  
  // smoothstep(min, max, value) crea un borde suavizado
  // Si dist < 0.2 -> 0.0
  // Si dist > 0.25 -> 1.0
  float mask = smoothstep(0.2, 0.25, dist);

  // Mezclamos Colores
  vec3 colorFondo = vec3(0.1);
  vec3 colorCirculo = vec3(0.98, 0.36, 0.49); // Rosa

  vec3 colorFinal = mix(colorCirculo, colorFondo, mask);

  gl_FragColor = vec4(colorFinal, 1.0);
}
> _

Dibujando formas geométricas puras calculando distancias matemáticas.

Errores comunes

01
El círculo se vuelve óvalo Calculaste la distancia sin compensar el aspect ratio. Un canvas de 400x200 estirará el círculo horizontalmente. Corrígelo multiplicando vUv.x por (ancho/alto) antes de calcular la distancia.
02
El color no mezcla bien Usaste mix(A, B, valor) con un valor mayor a 1.0 o menor a 0.0. El resultado será un color extrapolado fuera del rango normal. Usa clamp(valor, 0.0, 1.0) para mantenerlo en rango.

Practica lo aprendido

Domina el mix() y el smoothstep().

01 Usa mix(colorA, colorB, vUv.x) para un gradiente lineal.
02 Calcula la distancia al centro con distance().
03 Usa smoothstep() para endurecer o difuminar los bordes del círculo.