Lección 1 de 10 · Domain warping
Giraffe
La distorsión es haute couture.
Ya sabes hacer noise y FBM. Ahora vas a aprender a conectarlos diferente, usar la salida de un noise como entrada de otro. Eso es domain warp: el noise se dobla a sí mismo.
Para convertir ese campo en materiales reconocibles necesitas herramientas de corte y forma. Estas son las nuevas:
- →
step(edge, x)corte duro, 0 o 1, sin transición - →
smoothstep(a, b, x)corte suave, transición gradual entre a y b - →
sin(field * N)convierte un campo en ondas, vetas, anillos, bandas - →
fract(p * N)repite el espacio en celdas, escamas, mosaicos - →
length(p)distancia al centro, todo lo radial
Con estas herramientas + domain warp vas a fabricar: camuflaje, piel de vaca, leopardo, madera, tie-dye, escamas, mármol, y una lava lamp.
El código de abajo es tu primer domain warp. fb(p + fb(p)), una línea que cambia todo.
fb(p + fb(p)). El noise se distorsiona a sí mismo.
fb(p + fb(p))Evalúas
fb() una vez para obtener un desplazamiento. Lo sumas a las coordenadas. Evalúas fb() otra vez. El noise se distorsiona a sí mismo = formas fluidas.Cambia el
0.8 (amplitud del warp) a 0.1, apenas se dobla. A 2.0, se come a sí mismo. Ese número es tu perilla principal.El código
void main(){
vec2 p = gl_FragCoord.xy / R * 4.0;
float warp = fb(p);
float f = fb(p + warp * 0.8);
float patch = smoothstep(0.40, 0.48, f);
float crack = 1.0 - smoothstep(0.36, 0.40, f);
float edge = smoothstep(0.40,0.42,f)*(1.-smoothstep(0.46,0.48,f));
vec3 hide = vec3(0.92, 0.65, 0.28);
vec3 dark = vec3(0.04, 0.02, 0.005);
vec3 col = mix(dark, hide, patch);
col *= 0.7 + 0.3 * f;
col -= vec3(0.1, 0.05, 0.01) * crack;
col += vec3(.08,.04,.01) * edge;
col += vec3(.18,.12,.04) * pow(patch, 3.) * 0.6;
gl_FragColor = vec4(col, 1.0);
}