Bagaimana saya bisa menghasilkan suara prosedural pada sebuah bola?

15

Saya ingin menghasilkan suara prosedural pada permukaan bola (mis. Untuk secara prosedural menghasilkan planet atau bola bertekstur marmer). Tentu saja, saya hanya bisa mengambil algoritma noise standar dan memetakannya ke bola, tetapi ini memiliki semua masalah memproyeksikan pesawat ke bola, seperti distorsi pada kutub atau di tempat lain.

Saya kira saya dapat menghasilkan volume suara dan "memotong" bola, tetapi ini tampaknya tidak efisien - dan jika kebisingan memiliki beberapa artefak berbasis grid, ini masih tidak akan muncul secara seragam di bola. Selain itu, setidaknya dalam kasus noise Simplex, memotong irisan 2D dari noise 3D umumnya terlihat berbeda daripada menghasilkan noise 2D segera.

Apakah ada cara untuk menghindari masalah ini, mis. Dengan menghasilkan suara secara asli di bola? Kebisingan harus memiliki setidaknya kualitas kebisingan Perlin , idealnya kebisingan Simplex .

Martin Ender
sumber
Mungkin proyeksi triplanar, seperti yang terlihat pada GPU Permata 3 ? Pertanyaannya adalah apakah suara itu akan terlihat buram atau tidak diinginkan ketika dicampur di antara berbagai proyeksi.
Nathan Reed
Saya menambahkan metode lain yang mungkin ke posting saya. Mungkin perlu mengklarifikasi pertanyaan Anda dengan persyaratan yang lebih rinci. yaitu mengapa sepotong 2D noise 3D tidak memenuhi persyaratan visual Anda? Apa persyaratan kinerja Anda?
John Calsbeek
@JohnCalsbeek Jujur, saya tidak memiliki persyaratan sulit. Ini hanya pertanyaan yang saya ingin tahu tentang yang saya pikir saya akan mencoba untuk beta pribadi. Tentu saja, memotong irisan 2D dari noise 3D akan cukup untuk banyak aplikasi, tapi saya yakin itu akan memiliki dampak kinerja dan anisotropi (yang mungkin atau mungkin tidak terlihat). "Memotong bola dari noise 3D adalah pilihan terbaik Anda, karena ..." jelas merupakan jawaban yang valid.
Martin Ender
Anda dapat memeriksa shadertoy ini yang mengeluarkan noise di bola: shadertoy.com/view/4sfGzS
Alan Wolfe

Jawaban:

15

Saya akan mempertimbangkan hanya dengan noise 3D dan mengevaluasinya pada permukaan bola.

Untuk kebisingan gradien yang secara alami berada dalam domain permukaan bola, Anda memerlukan pola titik sampel yang teratur pada permukaan yang memiliki informasi konektivitas alami, dengan luas yang kira-kira sama di setiap sel, sehingga Anda dapat menginterpolasi atau menjumlahkan nilai yang berdekatan. Saya ingin tahu apakah sesuatu seperti kibor Fibonacci mungkin berfungsi:

Fibonacci grid di permukaan sphere

Saya belum mengunyah matematika untuk menentukan berapa banyak pekerjaan yang harus dilakukan untuk mengetahui indeks dan jarak ke empat tetangga Anda (saya bahkan tidak tahu jika Anda akhirnya memiliki empat tetangga yang terdefinisi dengan baik dalam semua kasus), dan saya menduga itu mungkin kurang efisien daripada hanya menggunakan noise 3D.

Sunting: Orang lain telah mengunyah matematika! Lihat makalah baru ini tentang Pemetaan Fibonacci Bulat . Tampaknya akan mudah untuk menyesuaikannya dengan sphere noise.


Jika Anda merender bola, tidak hanya mengevaluasi kebisingan pada permukaan bola, dan tidak masalah dengan men-tellell bola Anda dengan resolusi kisi kebisingan Anda, Anda dapat membuat grid geodesik pada permukaan bola (icosahedron yang terbagi, biasanya):

Bola geodesik

Setiap verteks bola dapat memiliki gradien yang dihasilkan secara acak untuk kebisingan gradien. Untuk mendapatkan informasi ini ke pixel shader (kecuali jika Anda ingin interpolasi langsung seperti noise nilai), Anda mungkin memerlukan teknik seperti rendering bingkai gambar artikel ini dengan koordinat barycentric : lakukan rendering tidak indeks, dengan setiap vertex berisi koordinat barycentric dari vertex pada segitiga. . Anda kemudian dapat membaca dari SV_PrimitiveID(atau yang setara dengan OpenGL) dalam pixel shader, membaca tiga gradien noise dari simpul berdasarkan pada segitiga apa Anda berada, dan menggunakan perhitungan kebisingan apa pun yang Anda suka menggunakan koordinat barycentric yang diinterpolasi.

Saya pikir bagian paling sulit dari metode ini datang dengan skema untuk memetakan ID segitiga Anda ke tiga sampel untuk mencari nilai-nilai kebisingan di setiap titik.

Jika Anda memerlukan beberapa oktaf derau atau derau pada resolusi yang lebih halus daripada model bola Anda, Anda mungkin dapat melakukan kisi geodesik kasar dengan simpul dan melakukan beberapa tingkat pembagian dalam shader piksel. yaitu dari koordinat barycentric, cari tahu segitiga terbagi Anda akan berada di mana jika mesh lebih lanjut tessellated, dan kemudian mencari tahu apa ID primitif dan koordinat barycentric akan untuk segitiga itu.

John Calsbeek
sumber
2
Saya belum pernah mendengar tentang Fibonacci grid sebelumnya; itu keren!
Nathan Reed
Itu kertas yang menarik. Sepertinya Anda dapat menyesuaikan parameter untuk memberikan lebih dekat ke kisi persegi atau kisi heksagonal, yang akan memungkinkan pendekatan yang berbeda untuk menghasilkan noise.
trichoplax
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.