Bagaimana saya bisa menggabungkan fisika ke dalam dunia yang dihasilkan secara prosedural dari geometri shader?

10

Pada dasarnya saya ingin menghapus kebutuhan untuk menghasilkan suara yang koheren dari CPU ke GPU. Dari sana, saya juga ingin membuat medan untuk dunia tiga dimensi menggunakan kebisingan ini sebagai kepadatan di titik voxel. Setelah ini, saya ingin mengambil kepadatan tersebut dan membuat poligon (menghasilkan simpul) yang mewakili medan dunia.

Ini baik dan semuanya. Tapi, saya juga ingin mengubah dunia secara dinamis dalam waktu nyata. Setelah saya sampai pada titik ini, saya punya masalah mencoba mendapatkan simpul kembali ke CPU untuk melakukan hal-hal seperti deteksi tabrakan dan semua perhitungan game yang ingin saya libatkan pada CPU dan bukan pada GPU.

Jadi pertanyaannya adalah: bagaimana saya bisa mendapatkan subset dari simpul kembali ke CPU untuk berurusan dengan tabrakan antara lain?

Dan satu pertanyaan lagi: apakah ada cara mudah untuk mengambil satu set simpul dan menghasilkan indeks dari mereka di GPU?

Saya bingung juga untuk jenis shader apa yang harus saya gunakan untuk hal-hal yang berbeda ini. Saya mendengar orang menggunakan pixel shader untuk mengumpulkan kepadatan dan kemudian menggunakan shader geometri untuk berurusan dengan generasi medan dari simpul dan kemudian entah bagaimana menggabungkan vertex shader untuk melakukan deformasi dinamis.

Saya menggunakan C # 4.0, .NET 4.0, dan XNA Game Studio 4.0.

Michael J. Gray
sumber
1
Anda mengatakan Anda menggunakan geometri shader dalam judul, tetapi Anda juga mengatakan bahwa Anda menggunakan XNA4.0, sejauh yang saya tahu XNA 4.0 membutuhkan DirectX 10 (untuk membuatnya lebih mudah dikembangkan untuk platform yang lebih seragam) tetapi hanya mendukung fitur SM3.0, jadi tidak ada geometri shader. forums.create.msdn.com/forums/p/31369/178924.aspx
Roy T.
Dan sekarang saya tidak akan lagi menggunakan XNA atau mengerjakan ulang desain saya. Terima kasih telah menunjukkannya. Saya telah mencari ke dalamnya dan tidak menyadari keterbatasan ini (no SM 4). Saya kira pertanyaannya masih tetap, tanpa pertimbangan XNA. Jadi, dari perspektif DirectX saja, apakah ada cara untuk melakukan apa yang saya inginkan? Atau mungkin dengan shader vertex di XNA?
1
Yah XNA masih berlaku untuk digunakan, kecuali jika Anda punya test-case yang terbukti di mana melakukan deformasi dan generasi terlalu lambat. Dan Anda telah membuktikan dalam test-case lain bahwa GPU merusak generasi + dan kemudian mendapatkan data kembali ke CPU lebih cepat :)
Roy T.
Memang. Kami menemukan bahwa menggunakan XNA dan menjaga segala sesuatu pada CPU memberi kami sekitar 1 juta simpul dalam kira-kira tiga menit pada Core i7 dengan 8 core dan 8 thread yang memaralelkan beberapa bagian terrain per thread. Ketika mencoba melakukan itu secara real-time dan mudah-mudahan merender medan sebelum pemain bisa melihatnya, kami mencapai sekitar 20 frame per detik. Jadi, test case pasti sesuai dengan masing-masing metode.
Michael J. Gray

Jawaban:

3

Karena XNA tidak mendukung shader geometri, saya akan menjawabnya seolah-olah Anda menggunakan DX 10. Anda pada dasarnya memiliki tiga opsi.

Geometry shaders Geometry shaders sebenarnya dapat memodifikasi dan menambahkan simpul ke buffer verteks. Anda bisa membaca ini kembali ke CPU. Saya belum memeriksanya, tapi itu pasti mungkin.

Gunakan saja CPU Kedua, mengapa Anda tidak menghitungnya pada CPU saja? Fakta bahwa itu berjalan pada GPU di shader menunjukkan bahwa algoritma deformasi Anda dapat dilokalisasi, yaitu Anda dapat dengan mudah menghasilkan bagian yang relaven untuk pemeriksaan tabrakan Anda.

Sebagai contoh, saya membuat game berlayar beberapa waktu lalu. Lautan menggunakan vertex dan geometri shader untuk merusak air dengan gelombang. Saya menggunakan algoritma yang sama yang dihitung pada CPU hanya pada beberapa titik di bawah perahu untuk pergerakan kapal di ombak. Saya yakin Anda bisa melakukan hal serupa untuk peta voxel Anda.

Pixel shaders Opsi terakhir, Anda menyebutkan ini dalam pertanyaan Anda juga: menghasilkan kepadatan dalam pixel shader dan menulisnya ke tekstur 3D. Anda dapat mengakses ini dari CPU dan shader dengan aman. Pixel shader sangat cocok untuk tugas ini, tetapi metode ini memiliki banyak overhead. Rendering tekstur volume, serta pengambilan sampel dari dalam di vertex dan geo. shader, dan harus membaca tekstur ke CPU.

Saya tidak tahu secara spesifik proyek Anda, tetapi saya akan selalu menggunakan CPU untuk ini. Dengan segala cara, hitung juga kepadatan pada shader, tetapi tetap menggunakan kartu grafis untuk rendering.

Hannesh
sumber
Masalah utama yang kami miliki adalah penghalang GPU-CPU. Dalam arti, begitu kita menghasilkan dan membuat medan pada GPU, bagaimana kita mengetahui seperti apa medan di sisi CPU untuk melakukan tabrakan dan hal-hal lain. Saya kira pemikiran Anda tentang menyimpannya di CPU valid. Maksud saya, kita mungkin dapat sedikit mengoptimalkan algoritme dan menghasilkan medan yang lebih sedikit. Saya akan menandai respons Anda sebagai solusi dalam satu atau dua hari untuk melihat apakah ada orang lain yang merespons. Terima kasih telah memancing beberapa pemikiran alternatif.
Michael J. Gray
Dengan contoh pelayaran Anda, Anda tidak akan dapat dengan mudah menghubungkan hasil gelombang dari sebuah kapal yang memercikkan gelombang ke GPU, bukan?
decaviatedcaviar
1
Anda dapat mempertahankan sistem rendering yang sama, yaitu menghasilkan dan merender medan pada GPU, tetapi cerminkan bagian-bagian dari medan yang Anda butuhkan pada CPU. Dengan menggunakan algoritma dan parameter yang sama, Anda akan mendapatkan medan yang sama pada CPU seperti yang Anda lihat di layar.
Hannesh
@ Danielel Tidak dengan algoritma gelombang secara langsung, tetapi dimungkinkan untuk mengubah bentuk jala air sesuai dengan bangun perahu dengan tekstur perpindahan yang setiap perahu "tarik" di belakangnya.
Hannesh
Ah! Ide yang bagus :). Tapi itu mungkin tidak mendukung beberapa perahu dengan sangat baik.
decaviatedcaviar