Kodunuzu tam olarak takip etmiyorum, ancak burada kabaca efekti elde edecek algoritmanın basitleştirilmiş bir açıklaması (yayınladığınız görüntüye dayanarak).
Aşağıdaki açıklama süper optimize versiyonu değil, kavramsal olarak net olanıdır (umarım). Çalıştırdıktan sonra, optimize edebilirsiniz (oldukça büyük ölçüde).
- Düzgün rastgele gürültü (sadece rastgele gri tonlamalı pikseller) n katmanları oluşturun.
- Şimdi bunların her birini her 1, 2, 4, 8, ... 2 ^ (n-1) pikseli örnekleyerek ve ara pikselleri enterpolasyonlayarak örnekleyin. Her katman bir öncekinden daha pürüzsüzdür.
- Şimdi bunları 1, 2, 4, 8 vb. Faktörlerle ölçeklendirin. Her katman bir öncekinden daha koyudur.
- Tüm bunları bir araya getirin.
- Her pikseli (1 + 2 + 4 + 8 + ... 2 ^ (n-1)) ile bölerek normalleştirin.
Zor adım örnekleme ve enterpolasyon aşamasıdır. Her bir mth pikselden örnek atlama katmanında olduğumuzu varsayalım. İşte m> 1 için temel fikir (m 1 ise, görüntüyü olduğu gibi kullanırız):
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)
Birkaç ipucu:
- Yukarıdaki algoritmanın sonucu biraz soluk görünebilir. Tüm katmanlar için aynı gürültü katmanını kullanarak bu efekti azaltabilir veya sonrasında kontrastı artırabilirsiniz.
- Yukarıdaki algoritma doğrusal enterpolasyon kullanır, ancak kosinüs enterpolasyonu (bir arama yapın) çok daha iyi sonuçlar verir.
- Algoritmanın tüm bölümleri sırasında katmanlarınıza ayrı ayrı bakmayı mümkün kılın. Bu, hataları hızlı bir şekilde temizlemenize yardımcı olacaktır.