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?
sumber
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.
sumber