Apa itu Perlin noise?
Kebisingan Perlin ditemukan pada tahun 1983 oleh Ken Perlin (yang menerima penghargaan dari Akademi Seni dan Ilmu Gambar bergerak Amerika untuk pencapaian ini). Anda tahu, pada masa itu semua orang berjuang untuk fotorealisme, tetapi selalu kurang. Ken Perlin menemukan algoritma kebisingan ini untuk menghilangkan penampilan "komputer" model 3D yang menyedihkan. Noise adalah penghasil angka acak dalam grafik komputer. Ini adalah pola acak dan tidak terstruktur, dan berguna ketika Anda membutuhkan sumber bagian terperinci yang kurang dalam struktur yang jelas
1 . Perlin noise adalah algoritma multidimensi yang digunakan dalam generasi prosedural, tekstur, generasi elevasi, generasi peta, generasi permukaan, generasi verteks, dan sebagainya dan seterusnya.
Tabel di bawah
2 menunjukkan batas kemungkinan kebisingan Perlin:
Dimensi | Kebisingan Mentah (Skala Abu-abu) | Aplikasi |
1 | | Objek vektor terlihat digambar tangan
|
2 | | Objek seperti tekstur dan api prosedural |
3 | | Perlin Noise Digunakan dalam Bantuan Minecraft |
Perlin memberikan definisi kebisingan sebagai berikut: kebisingan adalah perkiraan terhadap white noise, terbatas pada kisaran satu oktaf
3 . Definisi
formal kebisingan adalah sebagai berikut:
Dimana
- fungsi kebisingan. Kebisingan Perlin adalah kebisingan
prosedural . “
Prosedural kata sifat digunakan dalam ilmu komputer untuk memisahkan entitas yang dijelaskan oleh kode program dari yang dijelaskan oleh struktur data.”
4 Artinya, sesuatu yang
dihasilkan , dan tidak diatur keras. Apa yang baik untuk menggunakan noise prosedural alih-alih, misalnya, membuat noise secara manual? Suara proseduralnya
kompak , mis. Membutuhkan lebih sedikit ruang. Itu
tidak bisa dipisahkan , yaitu,
aperiodik . Ini
parametrik , dapat diakses
secara acak ; ia juga memiliki banyak keuntungan lain yang menyederhanakan kehidupan artis ... Tapi bukankah ini tujuan utama kita - untuk melayani artis? Kemarin saya membuat plug-in untuk After Effects, yang bisa dilihat di posting saya sebelumnya. Saya tidak memperhitungkan kepentingan artis dalam dirinya, hanya kepentingan ego saya, jadi tidak ada yang mengunduhnya. Saya mengerti pelajaran: Melayani artis, bukan diri Anda sendiri.
Sebelum Perlin, kebisingan gradien kisi-kisi muncul. Mereka dihasilkan oleh interpolasi antara nilai acak, dan dalam kebisingan Perlin,
kisi kubik digunakan untuk setiap titik, dan kemudian interpolasi
spline dilakukan. "Sebuah gradien pseudo-acak diperoleh dengan hashing titik kisi dan menggunakan hasilnya untuk memilih gradien."
5 Hash ini berubah menjadi 12 vektor dan diinterpolasi dari pusat ke tepi menggunakan polinomial derajat kelima. Sulit membayangkan, bukan? Jangan khawatir. Saya akan menunjukkan ini dalam gambar
6 dan pseudo-code
7 .
"... diinterpolasi dari pusat ke tepi menggunakan polinomial tingkat lima"Dan di sini adalah pseudocode Perlin klasik tanpa fungsi hash:
Perlu juga diketahui bahwa “semua fungsi kebisingan, kecuali untuk kebisingan Perlin dan kebisingan konvolusi yang dijernihkan, kira-kira mirip strip. Suara Perlin hanyalah pita lemah, yang dapat menyebabkan masalah dengan distorsi dan hilangnya detail. ”
8 Selain itu, Perlin noise tidak memiliki distribusi amplitudo Gaussian. Yaitu, titik-titik kebisingan tidak tersebar berdasarkan fungsi Gaussian, yang tidak akan kami pertimbangkan dalam artikel ini. Ada banyak hal di mana Perlin sangat nyaman, tetapi ada hal-hal di mana dia sangat lemah. Pada tabel di bawah
9 Anda dapat melihatnya sendiri.
Perlin noise dalam praktiknya: implementasi GLSL
Jadi, mari kita bicara tentang kebisingan Perlin di GLSL. Perlin noise dapat digunakan sebagai gelombang, sebagai warna difus, sebagai bahan difus, sebagai cahaya yang berkedip, atau sebagai bintik pada tekstur. Secara pribadi, saya menggunakannya dalam contoh ini sebagai secercah warna.
Saat saya menulis artikel ini, saya berpikir tentang membuat plug-in untuk After Effects yang menambahkan fungsionalitas kebisingan Perlin.
Perlin's noise paling sederhana dapat dibuat
10 sebagai berikut:
float rand(vec2 c){ return fract(sin(dot(c.xy ,vec2(12.9898,78.233))) * 43758.5453); } float noise(vec2 p, float freq ){ float unit = screenWidth/freq; vec2 ij = floor(p/unit); vec2 xy = mod(p,unit)/unit;
#define M_PI 3.14159265358979323846 float rand(vec2 co){return fract(sin(dot(co.xy ,vec2(12.9898,78.233))) * 43758.5453);} float rand (vec2 co, float l) {return rand(vec2(rand(co), l));} float rand (vec2 co, float l, float t) {return rand(vec2(rand(co, l), t));} float perlin(vec2 p, float dim, float time) { vec2 pos = floor(p * dim); vec2 posx = pos + vec2(1.0, 0.0); vec2 posy = pos + vec2(0.0, 1.0); vec2 posxy = pos + vec2(1.0); float c = rand(pos, dim, time); float cx = rand(posx, dim, time); float cy = rand(posy, dim, time); float cxy = rand(posxy, dim, time); vec2 d = fract(p * dim); d = -0.5 * cos(d * M_PI) + 0.5; float ccx = mix(c, cx, dx); float cycxy = mix(cy, cxy, dx); float center = mix(ccx, cycxy, dy); return center * 2.0 - 1.0; }
Namun, ini adalah versi redone dari kebisingan Perlin, yang dibuat pada tahun 2002. Pergi ke Gist untuk melihat bagaimana kebisingan klasik Perlin direalisasikan.
Yah, itu saja untuk hari ini. Sebuah posting pendek, saya tahu, dan tidak memiliki konten asli, tetapi sejauh ini saya kehabisan ide, karena saya belum membaca
Real-Time Rendering . Buku ini penuh dengan konsep dan ide untuk belajar dan belajar. Aku mencintainya!
Secara paralel, saya membaca buku lain -
Fundamentals of Computer Graphics . Saya sedikit terjebak pada topik Kurva Tersirat, tetapi saya akan meminta kerabat saya dengan gelar PhD dalam matematika untuk membantu saya.
Referensi
- Sebuah Survei Fungsi Kebisingan Prosedural, Forum Grafik Komputer, Volume 29 (2010), Nomor 8, pp 2379-2600
- Kebisingan Komputasi yang Efisien, Jurnal Alat Grafik Volume 16, No. 2: 85-94
- Sebuah Survei, dkk
- flafla2.imtqy.com/2014/08/09/perlinnoise.html
- A. Lagaue et al
- A. Lagae, dkk
- A. Lagae, dkk
- Dari flafla2.imtqy.com/2014/08/09/perlinnoise.html
- Dari Wikipedia
- A. Lagae, dkk
- Diadaptasi dari A. Lagae, et al
- gist.github.com/patriciogonzalezvivo/670c22f3966e662d2f83