Saya mencoba memahami kebisingan Perlin 2D dari sudut pandang visual dan saya ingin mengajukan beberapa pertanyaan di sini untuk memastikan saya berada di jalur yang benar. Saya menggunakan WebGL dan menulis shader khusus untuk rendering.

Saya mulai dengan menghitung produk titik di satu sel kisi antara vektor posisi dari pusat sel dan satu vektor vertikal dan saya mendapatkan gradien di bawah ini (merah adalah nilai positif dan biru - negatif). Jika saya memutar vektor, itu memutar gradien:

enter image description here

Q1: Wikipedia tentang "gradient noise" mengatakan "... kisi gradien acak, produk titik yang kemudian diinterpolasi...". Itu tidak benar, apa yang menciptakan gradien sebenarnya di sini adalah operasi titik itu sendiri, vektor "gradien" hanyalah vektor normal, bukan?

Di bawah ini adalah 3 interpolasi yang berbeda dari produk 4 titik antara 4 vektor acak dan 4 vektor posisi dihitung dari setiap sudut setiap sel, yang pertama adalah rata-rata sederhana, yang kedua adalah interpolasi bilinear dan yang ketiga adalah bilinear dengan smoothstep.

enter image description here

Q2: Jadi apa yang memberi Perlin noise tampilan dan nuansa aliran gumpalan organiknya adalah metode interpolasi, bukannya gradien, khususnya, fakta bahwa interpolasi bilinear tidak linier tetapi kuadrat?

Terima kasih!

2
user1481126 4 April 2021, 11:36

1 menjawab

Jawaban Terbaik

A1: Secara teknis benar. Biasanya saya menggunakan istilah "vektor gradien" yang menurut saya mengkomunikasikan ide dengan lebih baik, meskipun terkadang saya menyebut vektor itu sendiri sebagai "gradien". Mungkin ini lebih membingungkan daripada yang saya sadari, Anda membuat poin yang bagus. Kadang-kadang saya menyebut gradien yang sebenarnya seperti yang Anda sebut sebagai "jalan", tetapi "gradien" juga menggambarkannya dengan baik.

A2: Itu cara gradasinya digabung ya. Setiap simpul grid perlu berkontribusi dalam beberapa cara untuk kebisingan di sekitarnya, dengan kontribusinya turun ke nol dengan lancar di luar jangkauan. Lerp kurva-fade menyelesaikan ini.

Catatan wajib: Jika Anda benar-benar akan menggunakan noise dalam segala hal, saya merekomendasikan noise tipe Simplex (dengan tabel vektor gradien yang bagus, dan noise "Buka" jika menggunakannya untuk 3D+), atau Perlin 3D+ yang diputar domain. Ambillah dengan sebutir garam ketika tutorial merekomendasikan kebisingan Perlin tanpa peringatan. Perlin adalah algo kebisingan yang lebih tua yang, tanpa sesuatu yang dilakukan secara khusus untuk memperbaikinya, menghasilkan banyak kuadrat yang merupakan kompromi yang sama sekali tidak perlu untuk sebagian besar aplikasi. Saya sarankan menggunakan FastNoiseLite dengan langkah-langkah ini atau evaluator Perlin yang diputar domain ini.

Jika Anda ingin mengimplementasikan simpleks 2D sendiri, saya menulis jawaban ini beberapa waktu lalu di mana saya menjelaskan sebuah proses.

1
KdotJPG 5 April 2021, 03:55