Mengapa dua kali lebih mahal untuk membuat fungsi kebisingan yang bisa digubah?

13

Saya telah melihat di beberapa tempat yang membuat perlin noise loop mulus membutuhkan penghitungan dua kali dengan cara yang sedikit berbeda, dan menjumlahkan dua hasil.

FAQ matematika bising Perlin ini memberikan rumus:

Floop(x,y,z)=(tz)F(x,y,z)+zF(x,y,zt)t

untuk membuat fungsi noise loop ke arah z . Hal ini juga menyebutkan bahwa memperluas ini, untuk loop dalam 2 dimensi akan mengambil 4 evaluasi dari F dan untuk loop dalam 3 dimensi akan mengambil 8 evaluasi F .FzFF

Saya mengerti bahwa ini memberikan sambungan mulus antara ubin yang tidak hanya kontinu tetapi terus menerus dapat dibedakan, tetapi saya secara intuitif berharap bahwa jika kasus kebisingan hanya dievaluasi sekali dengan titik-titik grid dikurangi modulo ukuran ubin yang diperlukan. Jika fungsi noise hanya didasarkan pada titik-titik grid di sekitarnya (4 untuk noise 2D, 8 untuk noise 3D) maka tentunya hanya menggunakan titik grid paling kiri ketika titik untuk menghitung melewati tepi kanan ubin akan memberikan kualitas suara yang sama seperti antara titik-titik grid lainnya?

Karena saya telah melihat pendekatan perhitungan berganda ini di beberapa tempat, saya menganggap itu pasti memiliki beberapa keuntungan, tetapi saya berjuang untuk melihat kelemahannya dengan hanya membungkus poin grid kembali ke awal ketika mereka menjadi terlalu besar. Apa yang saya lewatkan?

trichoplax
sumber

Jawaban:

19

Sangat disayangkan bahwa orang umumnya merekomendasikan ini. Memadukan dua salinan (atau empat, dll.) Yang diterjemahkan dari fungsi noise dengan cara itu adalah ide yang sangat buruk. Tidak hanya mahal, bahkan tidak menghasilkan hasil yang benar!

Perlin noise Kebisingan Perlin dicampur

Di sebelah kiri ada suara Perlin. Di sebelah kanan adalah dua contoh kebisingan Perlin, ditumpuk dan dicampur dari kiri ke kanan.

Perbedaannya agak halus, tetapi Anda dapat melihat bahwa gambar kedua memiliki kontras yang lebih rendah dalam kolom vertikal di tengah. Di situlah perpaduan 50% antara dua contoh fungsi noise yang berbeda. Campuran seperti itu tidak terlihat seperti fungsi kebisingan asli: itu hanya terlihat seperti kekacauan berlumpur.

OK, jadi tidak cukup bahwa buruk hanya melihat suara mentah ... tapi jika Anda kemudian melakukan transformasi nonlinear pada gambar, kontras seragam dapat menyebabkan masalah. Sebagai contoh, berikut adalah gambar-gambar yang di-threshold pada 60%. (Pikirkan menghasilkan pulau di laut, misalnya.)

Perlin kebisingan Ambang batas Ambang batas dicampur kebisingan Perlin

Sekarang Anda dapat dengan jelas melihat bagaimana gambar di sebelah kanan memiliki lebih sedikit, area putih yang lebih kecil di tengah.

Seperti yang Anda sebutkan, untuk kebisingan berbasis grid seperti Perlin, cara yang lebih baik adalah dengan memasang gradien pseudorandom pada titik-titik grid. Itu mudah dan murah untuk dilakukan, dan kemudian Anda dapat menerapkan algoritma interpolasi ke gradien seperti biasa (seperti interpolasi bilinear dari tekstur ubin). Ini menghasilkan kebisingan ubin tanpa artefak aneh, karena bekerja dengan algoritma kebisingan yang mendasarinya dan bukan di atasnya. Anda dapat menggunakan strategi yang sama dengan derau Worley (derau seluler) dengan memasang titik fitur acak yang digunakan sebagai basis.

Namun, dengan beberapa oktaf suara tidak selalu mudah. Jika skala relatif antara oktaf (alias "lacunaritas") bukan bilangan bulat atau bilangan rasional sederhana, maka Anda mungkin tidak dapat menemukan titik ubin nyaman di mana semua kotak oktaf cocok. Anda dapat memasang setiap oktaf secara independen, tetapi suara keseluruhan masih tidak dapat dimiringkan dalam kasus itu.

Nathan Reed
sumber
4
Gambar berdampingan benar - benar membuat perbedaan untuk mendapatkan nuansa intuitif untuk penjelasannya. Saya akan mengingat ini untuk jawaban saya sendiri.
trichoplax