Tôi không theo dõi mã của bạn một cách chính xác, nhưng đây là một mô tả đơn giản về thuật toán sẽ đạt được hiệu quả gần như (dựa trên hình ảnh bạn đã đăng).
Giải thích sau đây không phải là phiên bản siêu tối ưu, nhưng là một phiên bản rõ ràng về mặt khái niệm (tôi hy vọng). Một khi bạn đã có nó chạy, bạn có thể tối ưu hóa nó (thực tế khá quyết liệt).
- Tạo n lớp nhiễu ngẫu nhiên đồng nhất (chỉ các pixel thang độ xám ngẫu nhiên).
- Bây giờ hãy lấy mẫu từng loại này bằng cách lấy mẫu từng pixel 1, 2, 4, 8, ... 2 ^ (n-1) và nội suy các pixel trung gian. Mỗi lớp mịn hơn lớp trước.
- Bây giờ tỷ lệ của các lớp này với hệ số 1, 2, 4, 8, v.v ... Mỗi lớp tối hơn lớp trước.
- Thêm tất cả những thứ này lại với nhau.
- Bình thường hóa bằng cách chia từng pixel với (1 + 2 + 4 + 8 + ... 2 ^ (n-1)).
Bước khó khăn là bước lấy mẫu và nội suy. Giả sử chúng ta đang trong lớp bỏ qua lấy mẫu mỗi pixel thứ m. Đây là ý tưởng cơ bản cho m> 1 (nếu m là 1, chúng tôi sử dụng hình ảnh như hiện tại):
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)
IT tiên boa:
- Kết quả của thuật toán ở trên có vẻ hơi bị rửa trôi. Bạn có thể giảm hiệu ứng này bằng cách sử dụng cùng một lớp nhiễu cho tất cả các lớp hoặc tương phản để tăng cường hình ảnh sau đó.
- Thuật toán trên sử dụng phép nội suy tuyến tính, nhưng phép nội suy cosine (thực hiện tìm kiếm) cho kết quả tốt hơn nhiều.
- Làm cho nó có thể xem xét các lớp của bạn một cách riêng biệt trong tất cả các phần của thuật toán. Điều này sẽ giúp bạn tuôn ra lỗi nhanh chóng.