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 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 fronterad1 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.
PruebaCambia 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);
}
close