Bagaimana Anda menghasilkan angka acak di HLSL?
Saya bertanya karena saya ingin mencoba penelusuran gpu ray . Anda perlu membuat arah acak dalam shader piksel. Jadi saya ingin randFloat()
, di mana hasilnya adalah angka acak antara -1 dan +1.
Juga, apa masalahnya dengan instruksi kebisingan hlsl ? Dokumen mengatakan itu dihapus dari HLSL 2.0 dan lebih tinggi. Mengapa ?
Saya membaca tentang pendekatan di mana Anda mengisi tekstur dengan nilai acak, kemudian memiliki koordinat tekstur di setiap titik yang memiliki indeks ke dalam tekstur itu. Tapi itu per vertex , saya butuh instruksi yang bisa saya panggil dalam pixel shader. Plus pendekatan ini membutuhkan "reseeding" texcoords per-vertex jika Anda ingin nilai yang berbeda setiap frame, dan yang memerlukan buffer vertex memperbarui setiap frame (yang bisa mahal!)
Dengan detail, bagaimana Anda bisa dengan murah menghasilkan angka acak pada GPU?
Jawaban:
Angka acak semu dalam pixel shader tidak mudah diperoleh. Generator angka acak semu pada CPU akan memiliki beberapa status yang dibaca dan ditulis, pada setiap panggilan ke fungsi. Anda tidak dapat melakukannya dalam pixel shader.
Berikut beberapa opsi:
Gunakan compute shader dan bukan pixel shader - mereka mendukung akses baca-tulis ke buffer, sehingga Anda dapat mengimplementasikan PRNG standar apa pun.
Sampel dari satu atau lebih tekstur yang berisi data acak, berdasarkan parameter seperti posisi ruang layar. Anda juga dapat melakukan beberapa matematika pada posisi sebelum menggunakannya untuk melihat ke dalam tekstur, yang seharusnya memungkinkan Anda menggunakan kembali tekstur jika matematika melibatkan konstanta shader acak-per-gambar-panggilan.
Temukan beberapa fungsi matematika dari posisi ruang layar, yang memberikan hasil yang 'cukup acak'.
Pencarian google cepat menemukan halaman ini dengan fungsi-fungsi ini:
sumber
Inilah cara saya menghasilkan angka acak semu untuk efek partikel saya dengan penghitung komputasi. Tidak yakin seberapa benar acak kode ini, tetapi berfungsi cukup baik untuk tujuan saya.
Kunci untuk memberikan setiap kernel GPU urutan acak itu sendiri adalah untuk memberi makan penghitung benih awal acak dari CPU. Setiap kernel kemudian menggunakan seed ini untuk memutus generator nomor menggunakan id utas itu sebagai hitungan. Dari sana, setiap utas harus memiliki benih uniknya sendiri untuk menghasilkan nilai unik.
sumber