Grafik waktu nyata menyebarkan berbagai perkiraan untuk menangani biaya komputasi dari simulasi pencahayaan tidak langsung, pertukaran antara kinerja runtime dan pencahayaan kesetiaan. Ini adalah bidang penelitian aktif, dengan teknik baru muncul setiap tahun.
Pencahayaan sekitar
Pada ujung rentang yang paling sederhana, Anda dapat menggunakan pencahayaan sekitar : sumber cahaya global, omnidirectional yang berlaku untuk setiap objek dalam pemandangan, tanpa memperhatikan sumber cahaya aktual atau visibilitas lokal. Ini sama sekali tidak akurat, tetapi sangat murah, mudah bagi seorang seniman untuk mengubah, dan dapat terlihat oke tergantung pada pemandangan dan gaya visual yang diinginkan.
Ekstensi umum untuk pencahayaan ambient dasar meliputi:
- Buat warna ambient berbeda-beda arah, misalnya menggunakan harmonik bola (SH) atau cubemap kecil , dan mencari warna dalam shader berdasarkan vektor normal masing-masing vertex atau pixel. Ini memungkinkan beberapa perbedaan visual antara permukaan dengan orientasi yang berbeda, bahkan ketika tidak ada cahaya langsung yang mencapai mereka.
- Terapkan teknik ambient occlusion (AO) termasuk vertex AO pra-komputasi, peta tekstur AO , bidang AO , dan AO layar-ruang (SSAO) . Ini semua bekerja dengan mencoba mendeteksi area seperti lubang dan celah di mana cahaya tidak langsung cenderung memantul ke dalamnya, dan menggelapkan cahaya sekitar di sana.
- Tambahkan cubemap lingkungan untuk memberikan refleksi ambient specular. Cubemap dengan resolusi yang layak (128 ² atau 256 ² per wajah) bisa sangat meyakinkan untuk specular pada permukaan melengkung dan mengkilap.
Pencahayaan tidak langsung panggang
"Level" selanjutnya, tekniknya melibatkan baking (pra-komputasi offline) beberapa representasi pencahayaan tidak langsung dalam sebuah adegan. Keuntungan memanggang adalah Anda bisa mendapatkan hasil berkualitas tinggi dengan sedikit biaya komputasi waktu nyata, karena semua bagian yang sulit dikerjakan dalam proses pemanggangan. Imbalannya adalah bahwa waktu yang dibutuhkan untuk proses panggang membahayakan tingkat iterasi desainer tingkat; lebih banyak memori dan ruang disk diperlukan untuk menyimpan data yang telah dikomputasi; kemampuan untuk mengubah pencahayaan secara real-time sangat terbatas; dan proses memanggang hanya dapat menggunakan informasi dari geometri level statis, sehingga efek pencahayaan tidak langsung dari objek dinamis seperti karakter akan terlewatkan. Meski begitu, pencahayaan yang dipanggang sangat banyak digunakan dalam game AAA saat ini.
Langkah panggang dapat menggunakan algoritma rendering yang diinginkan termasuk pelacakan jalur, radiositas, atau menggunakan mesin game itu sendiri untuk membuat cubemaps (atau hemicubes ).
Hasilnya dapat disimpan dalam tekstur ( lightmaps ) diterapkan pada geometri statis di tingkat, dan / atau mereka juga dapat dikonversi ke SH dan disimpan dalam struktur data volumetrik, seperti volume irradiance (tekstur volume di mana setiap texel menyimpan probe SH) atau jerat tetrahedral . Anda kemudian dapat menggunakan shader untuk mencari dan menginterpolasi warna dari struktur data itu dan menerapkannya pada geometri yang Anda render. Pendekatan volumetrik memungkinkan pencahayaan baked diterapkan pada objek dinamis serta geometri statis.
Resolusi spasial dari lightmaps dll. Akan dibatasi oleh memori dan kendala praktis lainnya, sehingga Anda dapat melengkapi pencahayaan yang dipanggang dengan beberapa teknik AO untuk menambahkan detail frekuensi tinggi yang tidak dapat diberikan oleh pencahayaan yang dipanggang, dan untuk menanggapi objek yang dinamis (seperti menggelapkan cahaya tidak langsung di bawah karakter atau kendaraan yang bergerak).
Ada juga teknik yang disebut transfer cahaya terkomputasi (PRT) , yang memanjang memanggang untuk menangani kondisi pencahayaan yang lebih dinamis. Dalam PRT, alih-alih memanggang pencahayaan tidak langsung itu sendiri, Anda memanggang fungsi transfer dari beberapa sumber cahaya — biasanya langit — ke pencahayaan tidak langsung yang dihasilkan di tempat kejadian. Fungsi transfer direpresentasikan sebagai matriks yang mentransformasikan dari koefisien SH ke sumber ke tujuan pada setiap titik sampel panggang. Ini memungkinkan lingkungan pencahayaan diubah, dan pencahayaan tidak langsung dalam pemandangan akan merespons secara masuk akal. Far Cry 3 dan 4 menggunakan teknik ini untuk memungkinkan siklus siang-malam terus-menerus, dengan pencahayaan tidak langsung bervariasi berdasarkan warna langit pada setiap waktu.
Satu hal lain tentang memanggang: mungkin berguna untuk memisahkan data yang dipanggang untuk pencahayaan tidak langsung yang menyebar dan specular. Cubemaps bekerja jauh lebih baik daripada SH untuk specular (karena cubemaps dapat memiliki lebih banyak detail sudut), tetapi mereka juga membutuhkan lebih banyak memori, sehingga Anda tidak dapat menempatkannya sepadat sampel SH. Koreksi parallax dapat digunakan untuk menebusnya, dengan membengkokkan cubemap secara heuristik untuk membuat pantulannya terasa lebih didasarkan pada geometri di sekitarnya.
Teknik yang sepenuhnya real-time
Akhirnya, dimungkinkan untuk menghitung pencahayaan tidak langsung yang sepenuhnya dinamis pada GPU. Ia dapat merespons secara real-time terhadap perubahan pencahayaan atau geometri yang berubah-ubah. Namun, lagi-lagi ada tradeoff antara kinerja runtime, pencahayaan fidelity, dan ukuran adegan. Beberapa teknik ini membutuhkan GPU yang kuat untuk bekerja sama sekali, dan mungkin hanya layak untuk ukuran pemandangan terbatas. Mereka juga biasanya hanya mendukung satu pantulan cahaya tidak langsung.
- Cubemap lingkungan yang dinamis, di mana wajah cubemap di-render ulang setiap frame menggunakan enam kamera yang berkerumun di sekitar titik yang dipilih, dapat memberikan refleksi ambient yang cukup baik untuk objek tunggal. Ini sering digunakan untuk mobil pemain di game balap, misalnya.
- Penerangan global ruang-layar , perpanjangan SSAO yang mengumpulkan pencahayaan pantulan dari piksel terdekat pada layar dalam pascaproses pemrosesan.
- Layar-ruang refleksi raytraced bekerja dengan ray-marching melalui buffer kedalaman di post-pass. Ini dapat memberikan pantulan berkualitas tinggi selama objek yang dipantulkan ada di layar.
- Radiositas instan bekerja dengan melacak sinar ke TKP menggunakan CPU, dan menempatkan titik cahaya pada setiap titik pemukul sinar, yang kira-kira mewakili cahaya yang dipantulkan ke segala arah dari sinar itu. Banyak lampu ini, yang dikenal sebagai lampu titik virtual (VPL), kemudian diberikan oleh GPU dengan cara biasa.
- Peta bayangan reflektif (RSM) mirip dengan radiositas instan, tetapi VPL dihasilkan dengan menampilkan adegan dari sudut pandang cahaya (seperti peta bayangan) dan menempatkan VPL pada setiap piksel peta ini.
- Volume rambat cahaya terdiri dari kisi 3D probe SH yang ditempatkan di seluruh adegan. RSM diberikan dan digunakan untuk "menyuntikkan" cahaya pantulan ke probe SH terdekat dengan permukaan pantulan. Kemudian proses mengisi-banjir menyebarkan cahaya dari setiap probe SH ke titik-titik di sekitarnya, dan hasilnya digunakan untuk menerapkan pencahayaan ke lokasi. Teknik ini telah diperluas untuk hamburan cahaya volumetrik juga.
- Pelacakan kerucut Voxel bekerja dengan menguapkan geometri pemandangan (kemungkinan menggunakan berbagai resolusi voxel, lebih halus di dekat kamera dan lebih jauh lebih kasar), kemudian menyuntikkan cahaya dari RSM ke dalam kisi voxel. Saat merender adegan utama, pixel shader melakukan "jejak kerucut" —baris pari dengan radius yang meningkat secara bertahap — melalui kisi voxel untuk mengumpulkan cahaya yang masuk untuk naungan difus atau specular.
Sebagian besar teknik ini tidak banyak digunakan dalam permainan saat ini karena masalah peningkatan skala ke ukuran adegan yang realistis, atau keterbatasan lainnya. Pengecualian adalah refleksi layar-ruang, yang sangat populer (meskipun biasanya digunakan dengan cubemaps sebagai fallback, untuk daerah di mana bagian layar-ruang gagal).
Seperti yang Anda lihat, pencahayaan tidak langsung waktu nyata adalah topik yang sangat besar dan bahkan jawaban ini (agak panjang!) Hanya dapat memberikan gambaran dan konteks 10.000 kaki untuk dibaca lebih lanjut. Pendekatan mana yang terbaik untuk Anda akan sangat bergantung pada perincian aplikasi khusus Anda, kendala apa yang ingin Anda terima, dan berapa banyak waktu yang harus Anda masukkan ke dalamnya.