Lección 10 de 10 · Domain warping
Tu Patrón
Cada punto gobierna lo más cercano. Las guerras están en las fronteras.
El patrón final de Domain Warp es Voronoi animado: divides el espacio en celdas, cada celda pertenece al punto-semilla más cercano. Las fronteras aparecen donde dos puntos compiten.
El loop recorre las 9 celdas vecinas, calcula la distancia a cada semilla, que se mueve con sin(T*0.3), y guarda las dos más cercanas, d1 y d2. La diferencia d2 - d1 es la distancia a la frontera. Donde es pequeña, el borde brilla.
Antes del Voronoi, el espacio pasa por un domain warp con T. Las celdas no son cuadradas, flotan, se retuercen, se sienten orgánicas.
Voronoi animado con warp. Cada técnica que aprendiste vive aquí.
d1, d2 y la frontera
d1 es la distancia a la semilla más cercana. d2 a la segunda más cercana. d2 - d1 es la distancia a la frontera entre ambas. exp(-(d2-d1)*15.) enciende esa frontera con un brillo cálido.Cambia el
5.0 en uv (zoom) a 2.0 para celdas enormes. A 10.0 para celdas chicas. Cambia el 15. de exp(-edge*15.) a 40. para fronteras finas como cuchillo. A 5. para fronteras gordas y suaves. Cambia los colores arriba para tu firma. Fírmalo.El código
void main(){
vec2 uv = gl_FragCoord.xy / R * 5.0;
float warp = fb(uv * 0.4 + T * 0.03) * 0.8;
vec2 p = uv + warp;
vec2 g = floor(p);
float d1 = 10., d2 = 10.;
float cid = 0.;
for(int y=-1;y<=1;y++){
for(int x=-1;x<=1;x++){
vec2 nb = vec2(float(x),float(y));
vec2 cp = g + nb;
vec2 seed = vec2(h2(cp), h2(cp+99.));
seed = 0.5+0.4*sin(T*0.3+6.2831*seed);
float d = length(nb+seed-fract(p));
if(d<d1){d2=d1;d1=d;cid=h2(cp+50.);}
else if(d<d2){d2=d;}
}
}
float edge = d2-d1;
float border = exp(-edge*15.);
vec3 col = vec3(0.02, 0.01, 0.03);
col += mix(vec3(0.15,0.04,0.08), vec3(0.08,0.03,0.15), cid) * smoothstep(0.4,0.0,d1);
col += vec3(0.9,0.7,0.2) * border * 0.7;
col += vec3(1.,0.9,0.5) * pow(border,4.) * 0.4;
col += vec3(0.4,0.15,0.05) * exp(-d1*3.) * 0.3;
col *= 1.0 - length(gl_FragCoord.xy/R-0.5)*0.6;
col = hueShift(col, 0.0);
gl_FragColor = vec4(col, 1.0);
}