Grafik Adegan untuk Mesin Rendering Ditangguhkan

10

Sebagai latihan pembelajaran saya telah menulis mesin rendering yang ditangguhkan. Sekarang saya ingin menambahkan grafik adegan ke mesin ini, tetapi saya agak bingung bagaimana melakukan ini.

Pada normal (mesin rendering maju) saya hanya akan menambahkan semua item (Semua menerapkan IDrawable dan IUpdateAble) ke grafik adegan saya, daripada melakukan perjalanan adegan-grafik lebih dulu dan memanggil Draw () di mana-mana.

Namun dalam mesin rendering yang ditangguhkan saya harus memisahkan panggilan imbang. Pertama saya harus menggambar geometri, lalu kastor bayangan dan kemudian lampu (semua untuk target render berbeda), sebelum saya menggabungkan semuanya. Jadi dalam hal ini saya tidak bisa hanya bepergian grafik adegan dan hanya memanggil menggambar. Cara saya melihatnya, saya juga harus melakukan perjalanan di seluruh grafik adegan 3 kali, memeriksa apa jenis objek yang harus ditarik, atau saya harus membuat 3 grafik adegan terpisah yang entah bagaimana terhubung satu sama lain. Kedua solusi ini tampaknya buruk, saya ingin menangani objek pemandangan lebih transparan.

Satu solusi lain yang saya pikirkan adalah bepergian melalui grafik adegan seperti biasa dan menambahkan item ke 3 daftar terpisah, memisahkan geometri, kastor bayangan dan lampu, dan kemudian mengulangi daftar ini untuk menggambar barang yang benar, apakah ini lebih baik, dan apakah itu bijaksana untuk mengisi kembali 3 daftar setiap frame?

Roy T.
sumber

Jawaban:

6

Pendekatan yang saya gunakan dalam proyek C ++ adalah bahwa adegan-grafik (yang memiliki indeks spasial) mengisi std :: terlihat 'vektor hits berdasarkan pada frustum melihat saat ini. Daftar yang terlihat ini dikelola oleh grafik adegan sehingga hanya dihitung ulang ketika kamera bergerak - objek bergerak dalam grafik dipindahkan dalam daftar ini dan menggunakan batu nisan dan daftar perubahan yang tidak disortir yang disortir dan digabungkan kembali sesuai kebutuhan.

Daftar item yang terlihat disortir berdasarkan shader-ID terlebih dahulu dan dalam setiap jenis berdasarkan jarak dari kamera. ID shader ditugaskan sedemikian rupa sehingga medan mengurutkan pertama dan kemudian bangunan dan kemudian unit dan kemudian proyektil dan kemudian partikel dan sebagainya - itu menjadi RTS. Beberapa model memiliki lebih dari satu shader, tetapi mereka hanya mengiklankan shader utama mereka. Ketika mereka diminta untuk menggambar, mereka yang membutuhkan bit yang ditarik dengan shader lain juga menambahkan diri mereka ke daftar single-pass single-pass berikutnya.

Jadi, menggambar melewati array yang terlihat dalam satu lintasan, dan di lintasan yang satu itu daftar barang-barang yang terhubung untuk ditinjau kembali dibuat, dan mereka ditarik lintasan kedua dan seterusnya.

Menggambar dari depan ke belakang dan buram kemudian transparan membantu menjaga semuanya tetap waras.

Ini mungkin tidak meminimalkan jumlah perubahan shader dll, tetapi cukup bisa diterapkan dan langsung diterapkan.

Saya tidak tahu tentang XNA dan bagaimana ini berlaku dan seberapa banyak hal-hal tingkat rendah yang Anda buat, saya khawatir. Akan sangat menarik untuk mengetahui apa pendapat para veteran tentang pendekatan ini untuk C ++ RTSes.

Akan
sumber
Hei Will, saya sangat suka jawaban ini, terutama karena sama sekali berbeda dari apa yang saya pikirkan sejauh ini. Metode Anda tampaknya sangat waras, terutama ketika juga memikirkan objek semi-transparan (yang saya hindari sejauh ini). Membuat daftar (ditautkan) dari grafik adegan Anda untuk objek yang akan dikunjungi sepertinya ide yang sangat bagus. Dan ya di XNA kita harus melakukan semua hal tingkat rendah ini juga :).
Roy T.
3

Saran saya adalah pendekatan 2 langkah yang disesuaikan dengan kebutuhan spesifik Anda, mirip dengan apa yang Anda gambarkan sendiri. Anda memerlukan grafik adegan dan "koleksi render" untuk setiap langkah render, dalam bayangan kasus Anda, geometri, lampu (mungkin yang keempat adalah objek transparan?)

Grafik adegan dapat didasarkan pada semua jenis hubungan, tetapi preferensi pribadi saya akan didasarkan pada hubungan spasial di mana setiap node dapat berisi node lain untuk memfasilitasi pemusnahan cepat.

Koleksi render dapat berupa semua jenis struktur data yang disesuaikan dengan langkah spesifik. Misalnya, koleksi bayangan bisa berupa daftar atau pohon yang diurutkan berdasarkan kedalaman untuk memaksimalkan penolakan awal-z. Koleksi geometri dapat diurutkan berdasarkan penggunaan shader untuk meminimalkan perubahan shader (status). Koleksi cahaya bisa berupa daftar atau struktur pohon yang diurutkan berdasarkan jarak, ukuran, atau kombinasi dari mereka sehingga Anda dapat membatasi rendering cahaya hanya pada lampu yang paling efektif jika performa menjadi masalah.

Apa pun struktur data yang Anda pilih, pastikan operasi penyisipan cepat dan pastikan menggunakan pengumpulan dan teknik lain untuk menghilangkan alokasi / penghancuran data karena Anda akan membersihkan dan mengisi daftar ini setiap frame.

Sekarang mengikat semuanya bersama itu mudah. Cukup berjalan melalui grafik adegan dan tambahkan setiap item ke koleksi render yang relevan. Ini membantu jika struktur data Anda secara otomatis mengurutkan / menyusun entri baru berdasarkan persyaratan. Setelah selesai, buka koleksi render dalam urutan yang diperlukan dan render.

Karena struktur data Anda memiliki penyisipan cepat dan tidak menghasilkan sampah, tidak ada penalti untuk penghitungan ulang daftar seperti yang Anda sebutkan.

Pasar
sumber