Apa itu rendering yang ditangguhkan?

54

Saya telah mendengar tentang rendering yang ditangguhkan dan bagaimana menggunakannya dapat memungkinkan "banyak" lampu dalam sebuah adegan tanpa hit performa yang besar, tetapi apa itu dan (dari tingkat tinggi) bagaimana penerapannya?

Tetrad
sumber

Jawaban:

55

Karakteristik yang menentukan dari rendering yang ditangguhkan adalah bahwa ia pada dasarnya mengubah kompleksitas adegan rendering dari O (geometri * lampu) ke O (geometri + lampu).

Ini dicapai dengan rendering adegan pertama menggunakan shader yang dirancang untuk menampilkan atribut dasar seperti (minimal) posisi *, normal, dan warna difus. Atribut lain mungkin termasuk nilai specular per-pixel dan properti material lainnya. Ini disimpan dalam target render layar penuh, secara kolektif dikenal sebagai G-buffer.

(*: Patut dicatat bahwa pengembang akan lebih umum memilih untuk menyimpan kedalaman, dan menggunakannya untuk merekonstruksi posisi, karena memiliki kedalaman tersedia berguna untuk banyak efek lainnya. )

Setelah buffer-G dihasilkan, dimungkinkan untuk menghitung hasil yang menyala sepenuhnya untuk piksel apa pun di layar dengan memecahkan BRDF tepat satu kali per piksel per cahaya. Dengan kata lain, jika Anda memiliki 20 jerat yang masing-masing dipengaruhi oleh 20 lampu, render tradisional ("maju") akan meminta Anda merender ulang setiap jala beberapa kali untuk mengakumulasikan hasil dari setiap cahaya yang memengaruhinya. Dalam kasus terburuk, ini akan menjadi satu panggilan draw per mesh per lampu, atau 400 total draw draw! Untuk masing-masing panggilan undian ini, Anda secara berlebihan mengubah simpul dari mesh. Ada juga peluang bagus bahwa Anda akan mengarsir piksel yang tidak benar-benar terpengaruh oleh cahaya, atau tidak akan terlihat di hasil akhir (karena mereka akan tersumbat oleh geometri lain di tempat kejadian). Masing-masing menghasilkan sumber daya GPU yang terbuang.

Bandingkan dengan rendering yang ditangguhkan: Anda hanya perlu membuat jerat satu kali untuk mengisi buffer-G. Setelah itu, untuk setiap cahaya, Anda membuat bentuk pembatas yang mewakili luasan pengaruh cahaya. Untuk titik cahaya, ini bisa menjadi bola kecil, atau untuk cahaya terarah, itu akan menjadi quad layar penuh, karena seluruh adegan terpengaruh.

Kemudian, ketika Anda mengeksekusi pixel / fragmen shader untuk volume pembatas cahaya itu, Anda membaca atribut geometri dari posisi yang sesuai dalam tekstur buffer-G, dan menggunakan nilai-nilai itu untuk menentukan hasil pencahayaan. Hanya piksel pemandangan yang terlihat dalam hasil akhir yang diarsir, dan mereka diarsir tepat sekali per cahaya. Ini merupakan potensi penghematan yang sangat besar.

Namun, ini bukan tanpa kekurangan. Ini adalah paradigma yang sangat sulit diperluas untuk menangani geometri transparan (lihat: peeling mendalam). Begitu sulit, pada kenyataannya, bahwa hampir semua implementasi rendering yang ditunda kembali ke rendering maju untuk bagian-bagian transparan dari adegan. Rendering yang ditangguhkan juga mengkonsumsi sejumlah besar VRAM dan bingkai bandwidth buffer, yang menyebabkan pengembang berusaha keras untuk mengemas dan mengkompresi atribut G-buffer ke dalam komponen terkecil / sesedikit mungkin.

Neverender
sumber
8

Juga disebut sebagai Deferred Shading, Deferred Rendering mengacu pada serangkaian jalur render yang memungkinkan yang menyimpan hasil antara ke dalam tekstur, kemudian menyelesaikan persamaan rendering kemudian dengan mengambil sampel data antara.

Buffer geometri adalah contoh awal, di mana adegan dirender menjadi serangkaian buffer yang berisi misalnya posisi, normal, dan tekstur dasar geometri buram. Pencahayaan belum diterapkan, dan warna akhir tidak diketahui. Pada lintasan-lintasan selanjutnya lampu diberikan, dan buffer geometri disampel. Ini berarti bahwa sejumlah besar lampu dapat dirender dengan biaya tetap sejumlah lampu yang mungkin terlihat pada piksel layar. Render tradisional akan mengevaluasi semua sumber cahaya untuk permukaan yang tersumbat dan tidak pernah terlihat di layar.

Banyak variasi ada, termasuk memberikan informasi cahaya terlebih dahulu misalnya.

Lihat untuk informasi lebih lanjut: http://en.wikipedia.org/wiki/Deferred_shading http://delicious.com/aancsiid/deferred-shading

Vincent Scheib
sumber
-3

Render ditangguhkan adalah pemrosesan di mana geomtry sebelum melakukan pass kedua untuk menaungi semuanya. Ini berguna karena mengubah coplexity ke O (piksel * sumber cahaya), memungkinkan Anda untuk menggunakan adegan kompleks dengan hanya sedikit hit untuk kinerja.

Menerapkannya agak sederhana. Lulus pertama membutuhkan rendering, minimal, jarak, normal, dan warna. Anda dapat menambahkan lebih banyak tekstur ke render seperti specular, dan posisi, dengan biaya memori.

Setelah Anda merendernya, Anda kemudian membuat beberapa bidang, di mana sumber cahaya unik berada di tengah masing-masing, tambahkan cahaya bersama-sama, pangkas semuanya ke geometri dalam adegan Anda, dan akhirnya, terapkan falloff.

hellol11
sumber
Saya tidak berpikir ini menambahkan sesuatu yang baru ke jawabannya. Itu hanya tampak seperti bagian diulang dari jawaban Neverender.
HolyBlackCat
@HolyBlackCat Ada beberapa perbedaan penting. Pertama ada persamaan kompleksitas yang benar, dan kedua, itu jauh lebih ringkas, sambil masih menjelaskan bagaimana sebenarnya menerapkannya.
hellol11
there's the correct complexity equationBenar. Tapi saya akan mengatakan itu detail kecil. Anda dapat menyarankan itu sebagai edit untuk jawaban yang lain, atau tinggalkan komentar tentang hal itu setelah Anda memiliki reputasi yang cukup. Membuat jawaban baru karena itu agak berlebihan. it's much more conciseSecara pribadi saya tidak berpikir itu bagus. Perincian yang lebih bermanfaat dari sebuah jawaban, semakin baik, bukan?
HolyBlackCat
1
@HolyBlackCat Terus terang, ya. Secara pribadi, saya tidak suka harus melalui dinding teks hanya untuk menjawab pertanyaan sederhana.
hellol11