Dalam XNA (dan Direct3D pada AFAIK umum), daripada membuat vertex individu dan shader fragmen, Anda menggabungkan banyak potensi shader terkait ke 'Efek'. Ketika Anda datang untuk menggunakan efek Anda memilih 'teknik' (atau beralih melalui semuanya) dan kemudian masing-masing 'teknik' memiliki sejumlah 'melewati'. Anda loop melalui setiap pass itu memilih vertex dan fragmen shader yang relevan dan Anda menggambar geometri.
Yang saya ingin tahu adalah untuk apa Anda akan memerlukan banyak pass? Saya mengerti di awal-awal 3d Anda hanya memiliki satu unit tekstur dan kemudian Anda punya 2 dan itu sering masih tidak cukup jika Anda juga ingin melakukan pemetaan lingkungan. Tetapi pada perangkat modern, bahkan di kelas seluler, Anda dapat mencicipi 8 tekstur atau lebih dan melakukan perhitungan pencahayaan sebanyak yang Anda inginkan dalam satu shader.
Bisakah yang lebih berpengalaman di sini menawarkan contoh-contoh praktis di mana rendering multi-pass masih diperlukan, atau apakah ini hanya rekayasa berlebihan pada pihak XNA / Direct3d?
Seperti yang ditunjukkan dalam balasan lain, rendering multi-pass (menggambar mesh tunggal beberapa kali dengan shader / parameter yang berbeda), seperti yang disarankan dalam balasan lain, pasti masih digunakan, terutama untuk pencahayaan dan efek khusus
Pass D3DX Effect dapat digunakan untuk hal semacam ini. Tetapi bisa juga diimplementasikan dengan lebih dari satu shader / efek.
Tujuan asli dari operan adalah untuk membantu mengimplementasikan shader kompleks pada perangkat keras kelas bawah (pra-shader-2.0), di mana pembatasan jumlah tahapan tekstur dan instruksi shader per pass cukup terbatas.
Dalam contoh pencahayaan multi-pass, apakah ada keuntungan kinerja signifikan yang bisa didapat dengan menggunakan pass alih-alih efek switching?
sumber
Selain hal pencahayaan yang semua orang sebutkan, penggunaan utama lainnya adalah kabur . Horisontal dan vertikal dilakukan dalam lintasan yang terpisah (sehingga untuk mendapatkan blur 9x9, hanya 18 piksel yang perlu disampel untuk setiap piksel keluaran, bukan 81). Ini digunakan untuk bloom / HDR, kedalaman bidang, cahaya, dll
sumber
Contoh di situs web pembuat XNA menggunakan beberapa lintasan untuk menghitung pencahayaan dari banyak (ratusan) sumber cahaya.
sumber
Seperti yang dikatakan Ranieri, Anda dapat menggunakan beberapa lintasan untuk beberapa lampu, misalnya dengan satu bahan Anda mungkin memiliki lintasan 'ambient', lintasan lintasan aditif per titik, lintasan lintasan aditif lain per sorotan dan kemudian lintasan stiker untuk berkembang biak di difusi tekstur (Saya telah menggunakan pengaturan seperti ini di masa lalu dan ini tentang cara paling fleksibel menangani shader pencahayaan yang pernah saya lihat tanpa masuk ke shading yang ditangguhkan).
Juga, saya percaya sebagian besar shader bulu menggunakan banyak pass.
sumber
Peta bayangan untuk membuat bayangan dapat dilakukan menggunakan multi-pass. Sekedar catatan, beberapa efek multi-pass dapat dilakukan dalam satu pass jika kartu video mendukung jumlah unit tekstur yang sama dengan jumlah pass. Jadi, jika Anda tidak memiliki unit tekstur yang cukup, maka Anda harus menggunakan beberapa lintasan. Satu platform perangkat keras tetap (seperti konsol game), Anda mungkin dapat membuat kode hanya menggunakan multi-tekstur karena Anda tahu jumlah unit tekstur. Tetapi untuk PC, ada banyak konfigurasi perangkat keras. Jika Anda ingin memiliki jangkauan luas ke konsumen, Anda mungkin ingin memecah beberapa efek Anda yang lebih kompleks menjadi beberapa lintasan sehingga pengguna dengan perangkat keras kelas rendah (yaitu tidak memiliki banyak unit tekstur pada GPU) masih dapat lihat efeknya. Secara singkat, bayangan peta dibuat dengan terlebih dahulu membuat peta bayangan pemandangan dari perspektif cahaya dalam satu lintasan. Kemudian tekstur peta bayangan dicampur ke dalam adegan dengan tekstur adegan lainnya.
sumber