Apa kompromi kinerja antara penyerahan ke depan dan yang ditangguhkan?

9

Forward rendering adalah proses penghitungan nilai cahaya untuk sebuah fragmen permukaan langsung dari input geometri dan informasi pencahayaan. Pembagian rendering yang ditangguhkan memroses menjadi dua langkah: pertama menghasilkan buffer layar-ruang yang berisi properti material (buffer geometri, atau buffer-G) yang dibangun dengan rasterisasi input geometri, dan kedua menghasilkan nilai cahaya untuk setiap piksel dengan menggabungkan G- penyangga dengan informasi pencahayaan.

Render yang ditangguhkan sering disajikan sebagai optimisasi render maju. Salah satu penjelasannya adalah bahwa pencahayaan cukup mahal dan jika Anda memiliki overdraw apa pun maka Anda adalah piksel pencahayaan yang tidak akan pernah terlihat di layar, sedangkan jika Anda menyimpan properti material ke dalam buffer-G dan cahaya setelahnya, Anda hanya menyalakan piksel yang akan sebenarnya muncul di layar. Apakah ini sebenarnya keuntungan dari ditangguhkan, mengingat bahwa Anda juga dapat melakukan pra-lintasan kedalaman dan kemudian melakukan lintasan render maju dengan uji kedalaman yang disetel ke D3D11_COMPARISON_EQUALatau GL_EQUALatau yang setara?

Render yang ditangguhkan juga memiliki potensi untuk menjadwalkan lebih baik pada GPU. Membagi satu warp / wavefront besar menjadi muka gelombang geometri yang lebih kecil dan kemudian muka gelombang pencahayaan yang lebih kecil kemudian meningkatkan hunian (lebih banyak muka gelombang dalam penerbangan secara bersamaan). Tetapi Anda juga berakhir dengan penggunaan bandwidth yang lebih banyak (menuliskan sejumlah besar saluran ke buffer-G, kemudian membacanya kembali saat pencahayaan). Jelas spesifik di sini sangat bergantung pada GPU Anda, tetapi apa prinsip umumnya?

Apakah ada pertimbangan kinerja praktis lain saat memutuskan antara pengalihan maju dan ditangguhkan? (Asumsikan bahwa kita dapat menggunakan variasi dari setiap teknik jika perlu: yaitu kita dapat membandingkan ubin maju dengan ubin yang ditangguhkan juga.)

John Calsbeek
sumber

Jawaban:

11

Dimungkinkan untuk menghindari penarikan berlebih dari objek buram bahkan dengan rendering maju dengan melakukan pra-lintasan mendalam dan menggunakan informasi itu untuk menolak piksel yang sebenarnya tidak terlihat. Namun, tergantung pada biaya sudut adegan Anda, pra-lintasan kedalaman dapat menambahkan jumlah overhead kinerja yang tidak dapat diterima. Selain itu, rendering menggunakan pipeline pixel shading dari GPU berarti bahwa Anda tidak membayar biaya per pixel yang dirender, Anda membayar biaya per quad 2x2 pixel yang diberikan. Jadi, bahkan melakukan pra-lintasan kedalaman masih menyebabkan tepi segitiga membuang piksel shading kerja yang akan dibuang.

Penjadwalan GPU adalah topik yang kompleks, dan pertukaran antara maju dan ditangguhkan tidak hanya untuk "berjalan lebih cepat tetapi menggunakan lebih banyak bandwidth." Jika Anda memiliki dua operasi yang sama-sama murah yang berjalan secara berurutan dan masing-masing menggunakan jumlah sumber daya yang sama, tidak ada alasan untuk membaginya menjadi shader terpisah: dua muka gelombang kecil yang masing-masing menggunakan sumber daya X secara fundamental tidak bekerja lebih baik daripada satu gelombang muka lagi yang juga menggunakan sumber X. Namun, jika Anda memiliki operasi yang murah dan operasi yang mahal untuk dijalankan secara berurutan, itu mungkin mendapat manfaat dari pemisahan menjadi shader terpisah: shader secara umum akan mencadangkan jumlah maksimum sumber daya yang dapat digunakan pada titik mana pun. Itu' Dapat dibayangkan bahwa rendering ke depan mungkin tidak dapat menggunakan semua bandwidth GPU Anda karena ada beberapa wavefronts dalam penerbangan yang tidak dapat mengeluarkan operasi yang cukup untuk memenuhi bandwidth. Tetapi jika Andayang bandwidth yang terbatas, mungkin tidak ada keuntungan untuk render ditangguhkan (karena mungkin akan menggunakan lebih banyak bandwidth).

Masalah kinerja tambahan adalah bahwa rendering ke depan mendukung jenis material yang berbeda (misalnya, BRDF yang berbeda) hanya dengan menggunakan shader yang berbeda untuk objek tersebut. Penyaji yang ditangguhkan secara langsung perlu menangani jenis bahan yang berbeda dengan cara yang berbeda (berpotensi cabang di shader), karena pekerjaan tidak lagi dikelompokkan ke dalam lungsin / muka gelombang secara koheren tergantung pada objek yang diberikan. Ini dapat dikurangi dengan penyaji ubin — jika hanya area tertentu dari layar yang menggunakan jenis bahan pengganti (misalnya, untuk rambut), maka Anda dapat menggunakan variasi shader dengan cabang jenis bahan hanya untuk ubin yang berisi piksel dengan materi tersebut .

John Calsbeek
sumber