Los shaders eran una de las partes de Unity que más me costaba entender. Llevaba años usando el motor, incluso para Oso Sigiloso, pero había trabajado poco directamente con la GPU.
Los videos de Sebastian Lague, Richard Lord y Arsiliath me dieron ganas de probar. Pasé dos fines de semana haciendo experimentos de boids y reacción-difusión con compute shaders.
Boids
El modelo de boids de Craig Reynolds le da tres reglas a cada agente: no amontonarse con los vecinos, seguir su dirección y mantenerse cerca del grupo. La bandada aparece a partir de esas interacciones locales.
Compartí este video corto del experimento en Unity en enero de 2026. El texto en pantalla introduce las bandadas y el comportamiento emergente.
Boids en Unity47 segundos · texto en español · subtítulos en inglés disponibles
Código del diagrama
flowchart LR
N[Por cada vecino] --> S{¿Muy cerca?}
S -- Sí --> A1[Alejarse]
S -- No --> A2[Acumular dirección]
A2 --> A3[Acumular posición]
A1 --> R[Ajustar velocidad]
A3 --> R
R --> NSeparación, alineamiento, cohesión. Lo demás (los remolinos, las divisiones, las formas orgánicas) es emergente.

Mi versión corre cientos de miles de agentes. Como el 1% son depredadores (los rojos/naranjos), el resto presas (cian). Las presas siguen las tres reglas clásicas más una: si ves un depredador, arranca. Los depredadores no siguen reglas de bandada. Solo persiguen.

Las presas forman grupos densos. Cuando un depredador atraviesa uno, el grupo se divide y vuelve a juntarse detrás de él. No programé una regla aparte para dividirse y reagruparse; eso sale de las reglas locales.

Para reducir el trabajo de buscar vecinos, una grilla de hash espacial divide el espacio 3D en cajas. Cada agente solo revisa su caja y las 26 vecinas (3x3x3), evitando comparar todos los pares. La mejora depende de cuántos agentes se acumulan en esas cajas. El renderizado usa instanciado en GPU (una sola draw call), con el vertex shader estirando los meshes según la velocidad para un efecto de estela bioluminiscente.

Reacción-Difusión
Los sistemas de reacción-difusión combinan reacciones locales con sustancias que se propagan por el espacio. Pueden formar manchas, rayas y ramificaciones. Para este experimento usé el modelo Gray-Scott.
Este fragmento de la grabación original de Unity muestra los patrones que cambian y las regiones de colores en la escena completa. Más abajo está la versión para navegador.
Experimentos de reacción-difusión12 segundos · grabación original de Unity sin audio

El modelo Gray-Scott: dos sustancias, A y B, en una grilla 2D. A se esparce rápido, B se esparce lento. Donde se juntan, A se consume y B crece. A se repone (tasa de alimentación f), B decae (tasa de eliminación k). Dos ecuaciones, todos los patrones salen de acá:
dA/dt = Da*nabla^2*A - AB^2 + f(1-A)
dB/dt = Db*nabla^2*B + AB^2 - (k+f)BCambias f y k y aparecen manchas que se dividen como células, rayas tipo huellas dactilares, espirales, manchas que pulsan, ramas de coral. Misma ecuación, distintas perillas.
Le agregué tres especies compitiendo, cada una con su propio inhibidor, todas alimentándose del mismo A, suprimiéndose entre sí al contacto. Las especies forman regiones separadas, se encuentran en los bordes y a veces una reemplaza a otra.

Agregué difusión anisotrópica ponderada por un campo de ruido rotante para que los patrones fluyan como corrientes, ruido Perlin modulando las tasas de alimentación/eliminación por la grilla, e iluminación falsa con bump mapping que hace que la simulación 2D plana se vea tridimensional.


Probarlo en el navegador
Me gustó poder cambiar unas pocas reglas locales y ver cómo respondía la simulación.
Terminé construyendo una versión para navegador de estos algoritmos para que puedan jugar con ellos.
Leer el texto del video de boids
Hoy experimento programando boids, una simulación de vida artificial que imita a las bandadas de aves. Es un perfecto ejemplo de comportamiento emergente. Un punto donde se unen el arte, las matemáticas y la biología. Estos los hice usando compute shaders en Unity.



