No sigo su código exactamente, pero aquí hay una descripción simplificada del algoritmo que logrará aproximadamente el efecto (según la imagen que publicó).
La siguiente explicación no es la versión súper optimizada, pero es una que es conceptualmente clara (espero). Una vez que lo tienes funcionando, puedes optimizarlo (de hecho, bastante drástico).
- Genere n capas de ruido aleatorio uniforme (solo píxeles aleatorios en escala de grises).
- Ahora muestree cada uno de estos muestreando cada 1, 2, 4, 8, ... 2 ^ (n-1) píxeles e interpolando los píxeles intermedios. Cada capa es más suave que la anterior.
- Ahora escala de estos con un factor de 1, 2, 4, 8, etc. Cada capa es más oscura que la anterior.
- Agregue todos estos juntos.
- Normalice dividiendo cada píxel con (1 + 2 + 4 + 8 + ... 2 ^ (n-1)).
El paso difícil es el paso de muestreo e interpolación. Supongamos que estamos en el salto de capa de muestreo cada m-ésimo píxel. Aquí está la idea básica para m> 1 (si m es 1, usamos la imagen como está):
for each pixel x and y
left_sample_coord = m *(x / m) //(integer division, automatically truncated)
right_sample_coord = (left_sample_point + m) % image_width
top_sample_point = m*(y / m)
bottom_sample_coord = (top_sample_point + m) % image_height
horizontal_weight = (x - left_sample_point) / (m - 1)
vertical_weight = (y - top_sample_point) / (m - 1)
sample_top_left = image(left_sample_coord, top_sample_point)
//and the same for the other four corners
//now combine the top two points
top_interpolate = sample_top_left * horizontal_weight + sample_top_right * (1-horizontal_weight)
//now combine the bottom two points
bottom_interpolate = sample_bottom_left * horizontal_weight + sample_bottom_right * (1-horizontal_weight)
//and combine these two last obtained values
smooth_noise(x, y) = top_interpolate * vertical_weight + bottom_interpolate * (1 - vertical_weight)
Algunos consejos:
- El resultado del algoritmo anterior puede parecer un poco desvaído. Puede reducir este efecto mediante el uso de la misma capa de ruido para todas las capas, o mejorar el contraste de la imagen después.
- El algoritmo anterior usa interpolación lineal, pero la interpolación de coseno (hacer una búsqueda) da resultados mucho mejores.
- Haga posible mirar sus capas por separado durante todas las partes del algoritmo. Esto te ayudará a eliminar los errores rápidamente.