Contoh bagus efek multi-pass?

9

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?

U62
sumber

Jawaban:

5

Setiap kali Anda melakukan efek pasca-proses pada set buffer yang ditangkap akan menjadi waktu yang masuk akal untuk menggunakan efek multi-pass, yaitu garis besar toon, gerakan kabur, SSAO, mekar. Gagasannya adalah bahwa pass pertama adalah tempat Anda akan memberikan semuanya kepada buffer yang sesuai, dan setiap pass berikutnya akan menangani setiap efek pasca-proses.

Seperti yang disebutkan Ranieri tentang contoh XNACC, mereka menggunakan banyak lintasan untuk membuat sejumlah besar lampu. Meskipun dalam contoh itu, mereka mengeksekusi pass yang sama, hanya sekali untuk setiap cahaya.

Ingatlah bahwa Shader Model 2 dan sebelumnya tidak dapat menangani memiliki instruksi mendekati sebanyak Shader Model 3 atau 4 di setiap shader, namun alasan lain untuk membagi efek menjadi beberapa lintasan - untuk mendukung perangkat keras yang lebih lama.

brett
sumber
Bisakah Anda memberikan contoh di mana objek Efek XNA di mana Anda mengulangi EffectPasses memiliki lebih dari satu lintasan dibandingkan dengan menggunakan efek yang berbeda dan mengapa?
Jason Goemaat
4

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?

bluescrn
sumber
3

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

Robert Fraser
sumber
Mungkin, tetapi sebagian besar saya pikir implementasi blur akan menggunakan shader yang sama untuk lintasan horizontal dan vertikal - dan hanya meneruskan dalam offset sampling (sebagai konstanta shader atau data per-vertex)?
bluescrn
1
@bluescrn - Bloom biasanya dianggap sebagai efek 4-pass: satu untuk mengekstraksi area terang & turun, satu untuk mengabur secara horizontal, satu untuk mengabur secara vertikal, satu untuk menggabungkan / meningkatkan gambar buram dengan yang asli. Sementara parameter shader dapat digunakan untuk mengontrol ini, percabangan akan diperlukan untuk membedakan semua kecuali dua blur pass
Robert Fraser
1

Contoh di situs web pembuat XNA menggunakan beberapa lintasan untuk menghitung pencahayaan dari banyak (ratusan) sumber cahaya.

drxzcl
sumber
1

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.

Riley Adams
sumber
0

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.

zooropa
sumber