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 .
sumber
Jawaban:
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:
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):
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.
sumber