Karena vendor driver GPU biasanya tidak repot-repot mengimplementasikannya noiseX
di GLSL, saya mencari seperangkat fungsi utilitas "pengacakan grafis swiss army knife" , sebaiknya dioptimalkan untuk digunakan dalam GPU shaders. Saya lebih suka GLSL, tetapi kode bahasa apa pun akan membantu saya, saya setuju menerjemahkannya sendiri ke GLSL.
Secara khusus, saya berharap:
a) Fungsi pseudo-acak - N-dimensional, distribusi seragam lebih dari [-1,1] atau lebih [0,1], dihitung dari benih M-dimensional (idealnya adalah nilai apa pun, tapi saya setuju dengan benih yang ditahan) untuk, katakanlah, 0..1 untuk distribusi hasil yang seragam). Sesuatu seperti:
float random (T seed);
vec2 random2 (T seed);
vec3 random3 (T seed);
vec4 random4 (T seed);
// T being either float, vec2, vec3, vec4 - ideally.
b) Derau terus menerus seperti Perlin Noise - lagi, distribusi N-dimensional, + - seragam, dengan himpunan nilai terbatas dan, well, terlihat bagus (beberapa opsi untuk mengonfigurasi tampilan seperti level Perlin bisa berguna juga). Saya berharap tanda tangan seperti:
float noise (T coord, TT seed);
vec2 noise2 (T coord, TT seed);
// ...
Saya tidak terlalu suka teori bilangan acak, jadi saya paling bersemangat mencari solusi yang sudah dibuat , tapi saya juga menghargai jawaban seperti "ini rand 1D yang sangat bagus, efisien (), dan biarkan saya jelaskan Anda bagaimana membuat rand N - dimensi yang baik () di atasnya ... " .
vec2 co
? apakah jangkauannya? benih?co.xy
digunakan, bukanco
?Terjadi pada saya bahwa Anda dapat menggunakan fungsi hash integer sederhana dan memasukkan hasilnya ke mantissa float. IIRC spesifikasi GLSL menjamin integer 32-bit unsigned dan representasi float IEEE binary32 sehingga harus portabel.
Saya mencoba ini sekarang. Hasilnya sangat bagus: sepertinya persis statis dengan setiap input yang saya coba, tidak ada pola yang terlihat sama sekali. Sebaliknya, potongan populer dosa / fraktur memiliki garis diagonal yang cukup menonjol pada GPU saya yang diberi input yang sama.
Salah satu kelemahannya adalah ia membutuhkan GLSL v3.30. Dan meskipun tampaknya cukup cepat, saya belum mengukur kinerjanya secara empiris. AMD Shader Analyzer mengklaim 13.33 piksel per jam untuk versi vec2 pada HD5870. Kontras dengan 16 piksel per jam untuk cuplikan dosa / fraktur. Jadi tentu sedikit lebih lambat.
Inilah implementasi saya. Saya meninggalkannya dalam berbagai permutasi ide untuk membuatnya lebih mudah untuk mendapatkan fungsi Anda sendiri.
Tangkapan layar:
Saya memeriksa tangkapan layar dalam program pengeditan gambar. Ada 256 warna dan nilai rata-rata adalah 127, artinya distribusinya seragam dan mencakup kisaran yang diharapkan.
sumber
Tidak, tidak sejak 2005. Hanya saja orang-orang bersikeras mengunduh versi lama. Versi yang ada di tautan yang Anda berikan hanya menggunakan tekstur 2D 8-bit.
Versi baru oleh Ian McEwan dari Ashima dan saya sendiri tidak menggunakan tekstur, tetapi berjalan sekitar setengah kecepatan pada platform desktop biasa dengan banyak bandwidth tekstur. Pada platform seluler, versi tanpa tekstur mungkin lebih cepat karena tekstur sering menjadi hambatan yang signifikan.
Repositori sumber kami yang dikelola secara aktif adalah:
https://github.com/ashima/webgl-noise
Koleksi versi kebisingan tanpa tekstur dan penggunaan tekstur ada di sini (hanya menggunakan tekstur 2D):
http://www.itn.liu.se/~stegu/simplexnoise/GLSL-noise-vs-noise.zip
Jika Anda memiliki pertanyaan spesifik, jangan sungkan untuk mengirim email langsung kepada saya (alamat email saya dapat ditemukan di
classicnoise*.glsl
sumbernya.)sumber
glBindTexture(GL_TEXTURE_1D, *texID);
dll. Tidak jelas apa yang Anda maksud dengan "tautan yang Anda berikan", karena Anda mengutip dari jawaban saya tetapi jawaban itu tidak terhubung ke implementasi Anda. Saya akan memperbarui jawaban saya untuk mengklarifikasi apa yang saya maksudkan dan mencerminkan informasi baru yang Anda berikan. Mengkarakterisasi orang sebagai "ngotot" mengunduh versi lama adalah distorsi yang tidak membuat Anda menghargai.Kebisingan Emas
Lihat Kebisingan Emas di browser Anda sekarang!
Fungsi ini telah meningkatkan distribusi acak di atas fungsi saat ini dalam jawaban @appas pada 9 September 2017:
Fungsi @appas juga tidak lengkap, mengingat tidak ada seed yang disediakan (uv bukan seed - sama untuk setiap frame), dan tidak bekerja dengan chipset berpresisi rendah. Gold Noise berjalan pada presisi rendah secara default (jauh lebih cepat).
sumber
Ada juga implementasi bagus yang dijelaskan di sini oleh McEwan dan @StefanGustavson yang terlihat seperti suara Perlin, tetapi "tidak memerlukan pengaturan apa pun, yaitu bukan tekstur atau array yang seragam. Cukup tambahkan ke kode sumber shader Anda dan panggil ke mana pun Anda inginkan".
Itu sangat berguna, terutama mengingat implementasi awal Gustavson, yang dikaitkan dengan @dep, menggunakan tekstur 1D, yang tidak didukung dalam GLSL ES (bahasa shader dari WebGL).
sumber
Gunakan ini:
Jangan gunakan ini:
Anda dapat menemukan penjelasan dalam Perbaikan untuk rSL (-satu baris GLSL) kanonik untuk OpenGL ES 2.0
sumber
mod
perkiraan pi?Baru saja menemukan versi derau 3d untuk GPU ini, ini adalah yang tercepat yang tersedia:
sumber
Versi lurus, bergerigi dari 1d Perlin, pada dasarnya adalah lfo zigzag acak.
Saya juga telah menemukan 1-2-3-4d kebisingan perlin di situs web shadertoy pemilik inigo quilez perlin tutorial, dan voronoi dan sebagainya, ia memiliki implementasi cepat dan kode untuk mereka.
sumber
hash: Saat ini webGL2.0 sudah ada sehingga bilangan bulat tersedia di (w) GLSL. -> untuk hash portabel berkualitas (dengan biaya yang sama dari hash float jelek) sekarang kita dapat menggunakan teknik hashing "serius". IQ menerapkan beberapa di https://www.shadertoy.com/view/XlXcW4 (dan banyak lagi)
Misalnya:
sumber
Silakan lihat di bawah ini contoh cara menambahkan white noise ke tekstur yang diberikan. Solusinya adalah dengan menggunakan dua tekstur: noise putih asli dan murni, seperti ini: white noise wiki
Fragmen yang dibagikan berisi parameter uNoiseFactor yang diperbarui pada setiap rendering oleh aplikasi utama:
sumber
Saya telah menerjemahkan salah satu implementasi Java Ken Perlin ke GLSL dan menggunakannya dalam beberapa proyek di ShaderToy.
Di bawah ini adalah interpretasi GLSL yang saya lakukan:
Saya menerjemahkannya dari Lampiran B dari Bab 2 dari Noise Hardware Ken Perlin di sumber ini:
https://www.csee.umbc.edu/~olano/s2002c36/ch02.pdf
Berikut ini adalah keteduhan publik yang saya lakukan pada Shader Toy yang menggunakan fungsi noise yang diposting:
https://www.shadertoy.com/view/3slXzM
Beberapa sumber bagus lain yang saya temukan tentang masalah kebisingan selama penelitian saya meliputi:
https://thebookofshaders.com/11/
https://mzucker.github.io/html/perlin-noise-math-faq.html
https://rmarcus.info/blog/2018/03/04/perlin-noise.html
http://flafla2.github.io/2014/08/09/perlinnoise.html
https://mrl.nyu.edu/~perlin/noise/
https://rmarcus.info/blog/assets/perlin/perlin_paper.pdf
https://developer.nvidia.com/gpugems/GPUGems/gpugems_ch05.html
Saya sangat merekomendasikan buku shader karena tidak hanya memberikan penjelasan interaktif yang hebat tentang kebisingan, tetapi juga konsep shader lainnya.
EDIT:
Mungkin dapat mengoptimalkan kode yang diterjemahkan dengan menggunakan beberapa fungsi akselerasi perangkat keras yang tersedia di GLSL. Akan memperbarui posting ini jika saya akhirnya melakukan ini.
sumber