Terkait:
Saya ingin menghasilkan suara Perlin tileable. Saya sedang bekerja dari fungsi Paul Bourke PerlinNoise*()
, yang seperti ini:
// alpha is the "division factor" (how much to damp subsequent octaves with (usually 2))
// beta is the factor that multiplies your "jump" into the noise (usually 2)
// n is the number of "octaves" to add in
double PerlinNoise2D(double x,double y,double alpha,double beta,int n)
{
int i;
double val,sum = 0;
double p[2],scale = 1;
p[0] = x;
p[1] = y;
for (i=0;i<n;i++) {
val = noise2(p);
sum += val / scale;
scale *= alpha;
p[0] *= beta;
p[1] *= beta;
}
return(sum);
}
Menggunakan kode seperti:
real val = PerlinNoise2D( x,y, 2, 2, 12 ) ; // test
return val*val*skyColor + 2*val*(1-val)*gray + (1-val)*(1-val)*cloudColor ;
Memberikan langit seperti
Yang tidak ubin.
Nilai piksel adalah 0-> 256 (lebar dan tinggi), dan piksel (0,0) menggunakan (x, y) = (0,0) dan piksel (256.256) menggunakan (x, y) = (1,1)
Bagaimana saya bisa membuatnya tileable?
tiles
perlin-noise
bobobobo
sumber
sumber
Jawaban:
Ada dua bagian untuk membuat suara fBm mulus tileable seperti ini. Pertama, Anda perlu membuat fungsi noise Perlin itu sendiri tileable. Berikut adalah beberapa kode Python untuk fungsi noise Perlin sederhana yang bekerja dengan periode hingga 256 (Anda dapat memperpanjangnya sesering mungkin dengan memodifikasi bagian pertama):
Perlin noise dihasilkan dari penjumlahan "surflets" kecil yang merupakan produk dari gradien berorientasi acak dan fungsi falloff polinomial yang dapat dipisahkan. Ini memberikan wilayah positif (kuning) dan wilayah negatif (biru)
Surflets memiliki luas 2x2 dan berpusat pada titik kisi integer, sehingga nilai kebisingan Perlin pada setiap titik dalam ruang dihasilkan dengan menjumlahkan surflets di sudut sel yang ditempati.
Jika Anda membuat arah gradien membungkus dengan beberapa periode, kebisingan itu sendiri kemudian akan membungkus dengan mulus dengan periode yang sama. Inilah sebabnya mengapa kode di atas mengambil modul koordinat kisi periode sebelum hashing melalui tabel permutasi.
Langkah lain, adalah ketika menjumlahkan oktaf Anda ingin skala periode dengan frekuensi oktaf. Pada dasarnya, Anda ingin setiap oktaf untuk memasang seluruh gambar hanya satu kali, daripada beberapa kali:
Gabungkan itu dan Anda mendapatkan sesuatu seperti ini:
Seperti yang Anda lihat, ini memang benar-benar sempurna:
Dengan beberapa penyesuaian kecil dan pemetaan warna, berikut ini adalah gambar cloud ubin 2x2:
Semoga ini membantu!
sumber
x*2**o
mengkonversi ke C? itu:x*pow(2,o)
ataupow(x*2,o)
?x*pow(2, o)
, karena eksponensial memiliki prioritas lebih tinggi daripada multiplikasi.a
nilai? dan saya tidak yakin bagaimana fungsinya dikonversi ke C ... saya mendapatkan garis lurus dalam output saja.im.putdata(data, 128, 128)
. (Bagi mereka yang tidak terbiasa dengan python atau PIL: yang mereka maksud adalah skala dan offset, bukan ukuran gambar.)Inilah satu cara yang agak cerdik yang menggunakan 4D Perlin noise.
Pada dasarnya, petakan koordinat X piksel Anda ke lingkaran 2D, dan koordinat Y piksel Anda ke lingkaran 2D kedua, dan tempatkan kedua lingkaran tersebut secara orthogonal satu sama lain dalam ruang 4D. Tekstur yang dihasilkan tileable, tidak memiliki distorsi yang jelas, dan tidak mengulangi dengan cara yang tekstur cermin akan lakukan.
Kode copy-paste dari artikel:
sumber
OK aku mengerti. Jawabannya adalah berjalan di torus dalam derau 3D, menghasilkan tekstur 2D darinya.
Kode:
Hasil:
Sekali:
Dan ubin:
sumber
Salah satu cara sederhana yang dapat saya pikirkan adalah mengambil output dari fungsi noise dan mem-mirror-nya menjadi gambar yang ukurannya dua kali lipat. Sulit untuk dijelaskan, jadi inilah gambarnya:
Sekarang, dalam hal ini, cukup jelas apa yang Anda lakukan ketika Anda melihat ini. Saya dapat memikirkan dua cara untuk (mungkin :-)) menyelesaikan ini:
Anda dapat mengambil gambar yang lebih besar dan kemudian menghasilkan lebih banyak suara di atasnya tetapi (dan saya tidak yakin apakah ini mungkin) fokus ke tengah (sehingga ujungnya tetap sama). Ini bisa menambah sedikit perbedaan yang akan membuat otak Anda berpikir itu bukan hanya gambar cermin.
(Saya juga tidak yakin apakah ini mungkin) Anda bisa mencoba mengutak-atik input ke fungsi noise untuk menghasilkan gambar awal yang berbeda. Anda harus melakukan ini dengan coba-coba, tetapi mencari fitur yang menarik perhatian Anda ketika Anda ubin / mirror dan kemudian mencoba dan membuatnya tidak menghasilkan itu.
Semoga ini membantu.
sumber
tex2d(abs(abs(uv.x)%2.0-1.0), abs(abs(uv.y)%2.0-1.0))
Versi pertama dari jawaban ini sebenarnya salah, saya telah memperbaruinya
Metode yang saya gunakan dengan sukses adalah membuat ubin domain kebisingan . Dengan kata lain, buat
noise2()
fungsi basis Anda secara berkala. Jikanoise2()
periodik danbeta
bilangan bulat, noise yang dihasilkan akan memiliki periode yang sama dengannoise2()
.Bagaimana kita bisa membuat
noise2()
secara berkala? Dalam sebagian besar implementasi, fungsi ini menggunakan beberapa jenis suara kisi. Artinya, ia mendapat angka acak pada koordinat bilangan bulat, dan menginterpolasinya. Sebagai contoh:Fungsi ini dapat secara sepele dimodifikasi menjadi periodik dengan periode integer. Cukup tambahkan satu baris:
sebelum menghitung
v1
danv2
. Dengan cara ini, nilai pada koordinat bilangan bulat akan mengulangi setiap unit Periode, dan interpolasi akan memastikan bahwa fungsi yang dihasilkan lancar.Perhatikan, bagaimanapun, bahwa ini hanya berfungsi ketika Periode lebih dari 1. Jadi, untuk benar-benar menggunakan ini dalam membuat tekstur mulus, Anda harus mengambil sampel Periode x Periode kuadrat, bukan 1x1.
sumber
noise2
periodik (dengan periode pendek seperti 1 unit)? Saya pikir itulah yang akhirnya ditanyakan. Noise Perlin standar bersifat periodik dengan periode 256 pada setiap sumbu tetapi Anda menginginkan noise yang dimodifikasi dengan periode yang lebih kecil.noise2
seperti yang disarankan, Anda akan mendapatkan hasil periodik, apakah fungsinya sendiri periodik atau tidak. Karena argumen membungkus setiap 1 unit.Alternatif lain adalah menghasilkan noise menggunakan libnoise libraries. Anda dapat menghasilkan noise melebihi jumlah ruang teoretis tak terbatas, mulus.
Lihatlah yang berikut ini: http://libnoise.sourceforge.net/tutorials/tutorial3.html#tile
Ada juga port XNA di atas di: http://bigblackblock.com/tools/libnoisexna
Jika Anda akhirnya menggunakan port XNA, Anda dapat melakukan sesuatu seperti ini:
GeneratePlanar adalah fungsi untuk memanggil untuk mendapatkan bagian di setiap arah yang akan terhubung dengan mulus dengan sisa tekstur.
Tentu saja, metode ini lebih mahal daripada hanya memiliki tekstur tunggal yang dapat digunakan di berbagai permukaan. Jika Anda ingin membuat beberapa tekstur tileable acak, ini mungkin sesuatu yang menarik bagi Anda.
sumber
Meskipun ada beberapa jawaban di sini yang akan berhasil, kebanyakan dari mereka rumit, lambat dan bermasalah.
Yang perlu Anda lakukan hanyalah menggunakan fungsi penghasil derau berkala . Itu dia!
Implementasi domain publik yang sangat baik berdasarkan algoritma noise "canggih" Perlin dapat ditemukan di sini . Fungsi yang Anda butuhkan adalah pnoise2. Kode ini ditulis oleh Stefan Gustavson, yang telah membuat komentar tajam di sini tentang masalah ini, dan bagaimana orang lain mengambil pendekatan yang salah. Dengarkan Gustavson, dia tahu apa yang dia bicarakan.
Mengenai berbagai proyeksi bola beberapa di sini telah menyarankan: baik, mereka pada dasarnya bekerja (perlahan), tetapi mereka juga menghasilkan tekstur 2D yang merupakan bola pipih, sehingga ujung-ujungnya akan lebih kental, kemungkinan menghasilkan efek yang tidak diinginkan. Tentu saja, jika Anda ingin tekstur 2D Anda diproyeksikan ke bola, itulah cara yang harus dilakukan, tetapi bukan itu yang diminta.
sumber
Berikut cara yang jauh lebih sederhana untuk melakukan noise ubin:
Anda menggunakan pembungkus modular untuk setiap skala kebisingan. Ini sesuai dengan tepi area tidak peduli skala frekuensi apa yang Anda gunakan. Jadi, Anda hanya perlu menggunakan noise 2D normal yang jauh lebih cepat. Berikut adalah kode WebGL langsung yang dapat ditemukan di ShaderToy: https://www.shadertoy.com/view/4dlGW2
Tiga fungsi teratas melakukan semua pekerjaan, dan fBM dilewatkan vektor x / y dalam kisaran 0,0 hingga 1,0.
sumber
Saya memiliki beberapa hasil tidak buruk interpolasi di dekat tepi ubin (tepi-terbungkus), tetapi itu tergantung pada efek apa yang Anda coba capai dan parameter kebisingan yang tepat. Bekerja sangat baik untuk kebisingan yang agak buram, tidak begitu baik dengan yang spikey / berbutir halus.
sumber
Saya sedang memeriksa utas ini dalam mencari jawaban untuk masalah yang sama, kemudian saya mendapat solusi yang bersih dan kompak dari pengembang kode python ini untuk menghasilkan fraktal noise dari perlin / simplex noise. Kode yang diperbarui disediakan dalam masalah ini (tertutup) dan dapat dilanjutkan dalam pengaturan gradien untuk sisi kanan "generator" sama dengan yang di sisi kiri (dan sama untuk atas dan bawah), seperti di
Sepertinya solusi yang elegan dan bersih, saya menghindari menyalin seluruh kode di sini (karena itu bukan solusi saya sendiri), tetapi tersedia di tautan yang diberikan di atas. Semoga ini bisa bermanfaat bagi seseorang yang ingin menghasilkan gambar 2d fraktal ubin seperti yang saya butuhkan, bebas dari artefak atau distorsi.
sumber