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