Manipulasi mesh pada GPU vs CPU

9

Hanya sedikit penasaran - di mana Anda melakukan manipulasi mesh, pada CPU atau di shader? Saya telah melakukan segalanya pada CPU dan seorang teman menyarankan untuk memindahkan beberapa hal ke sisi GPU.

Jika Anda melakukan hal-hal seperti animasi tulang ... pada GPU, bagaimana Anda mendapatkan kembali jala? (Karena saya sedang melakukan deteksi tabrakan ...)

AnonAnon
sumber

Jawaban:

13

Ini biasa terjadi pada GPU, tetapi ada trade off untuk keduanya dan terserah Anda untuk memutuskan mana yang terbaik untuk Anda.

Melakukan manipulasi pada GPU berarti Anda hanya perlu mengirim data mesh sekali, maka Anda hanya dapat mengirim transformasi matriks untuk merusaknya. Ini bagus karena sangat mengurangi bandwidth yang diperlukan antara CPU-> GPU. Ini juga berarti Anda dapat mengunggah satu saja salinan mesh ke GPU dan menerapkan transformasi untuk banyak contoh mesh yang berbeda. Namun, lebih sulit untuk memiliki tabrakan "jala akurat". Karena transformasi dilakukan pada GPU, Anda tidak memilikinya untuk diuji dengan menggunakan CPU.

Melakukan manipulasi pada CPU berarti Anda memiliki akses ke mesh yang diubah. Anda dapat mengakses semua yang perlu Anda ketahui tentang hal itu. Namun, itu berarti Anda harus mengunggah seluruh jala ke setiap frame GPU. Ini juga berarti Anda harus mengunggah mesh yang diubah untuk setiap instance dari mesh itu. Singkatnya, inilah daftar pro dan kontra yang lengkap.

  • Pro untuk GPU

    • Unggah data mesh satu kali
    • Mengubahnya untuk beberapa contoh
    • Hanya perlu mengirim transformasi matriks
    • GPU sangat bagus dalam memparalelkan hal-hal semacam ini
  • Kontra untuk GPU

    • Jaring yang diubah tidak tersedia untuk pengujian pada CPU
  • Pros untuk CPU

    • Jerat yang ditransformasikan tersedia untuk uji tabrakan dan apa pun yang dibutuhkan.
  • Kontra untuk CPU

    • Perlu mengunggah seluruh mesh yang diubah setiap frame
    • Perlu mengunggah seluruh jala untuk setiap instance jala

Namun ada beberapa cara untuk menyiasati kekurangan GPU.

  • Tidak memiliki tumbukan akurat jala . Gunakan sesuatu "cukup dekat" seperti kotak pembatas untuk seluruh jala atau memiliki kotak pembatas untuk setiap tulang jaring. Di bawah ini digunakan transformasi GPU untuk mesh, dan pada transformasi CPU untuk kotak bounded aligned axis yang mewakili mesh. Anda bisa mendapatkan batasan yang lebih akurat dengan menggunakan non-AABB.

tulang goblin

  • Ubah salinan mesh pada CPU jika dan hanya jika mesh collision akurat diperlukan . Setelah tabrakan kotak pembalikan telah kembali benar, ubah mesh untuk mencocokkan transformasi pada GPU, kemudian periksa tabrakan dengan itu untuk mendapatkan data tabrakan yang lebih akurat.

All-in-all Saya berasumsi Anda dapat melihat mengapa lebih umum untuk mengubah GPU

MichaelHouse
sumber
1
Karena penasaran, apakah benar-benar praktis untuk jerat diubah pada CPU ketika mempertimbangkan kompleksitas jerat dalam game modern, kekuatan dan kemampuan multi-core dari CPU modern dan tugas-tugas lain yang harus dilakukan CPU? Juga, apakah mengunggah ke GPU begitu lambat sehingga ide ini bahkan tidak akan hilang?
R4D4
Itu akan tergantung pada gim, tetapi biasanya tidak praktis untuk gim di atas kompleksitas moderat. Ketika ada pilihan yang mudah untuk melakukan transformasi pada GPU, sulit untuk menemukan alasan untuk membenarkan persyaratan sumber daya tambahan untuk melakukan transformasi pada CPU. Masalahnya lebih pada pengiriman mesh yang diubah ke setiap frame GPU, yang menjadi cepat mahal. Seperti yang sering terjadi dengan perangkat lunak, tergantung pada pengembang untuk membuat keputusan antara kompleksitas dan kinerja.
MichaelHouse