Pencahayaan global masa nyata (GI masa nyata) sentiasa menjadi tarikan utama grafik komputer.
Selama bertahun-tahun, industri telah mencadangkan pelbagai kaedah untuk menyelesaikan masalah ini.
Pakej kaedah biasa mengekang domain masalah dengan menggunakan andaian tertentu, seperti geometri statik, perwakilan pemandangan kasar atau menjejak probe kasar dan interpolasi pencahayaan antara keduanya.
Dalam Unreal Engine, sistem pencahayaan dan pantulan global teknologi Lumen diasaskan oleh Krzysztof Narkowicz dan Daniel Wright.
Matlamatnya adalah untuk membina penyelesaian yang berbeza daripada yang sebelumnya, mampu mencapai pencahayaan bersatu dan kualiti pencahayaan seperti penaik.
Baru-baru ini, di SIGGRAPH 2022, Krzysztof Narkowicz dan pasukan bercakap tentang perjalanan mereka membina teknologi Lumen.
Pengesanan sinar perkakasan semasa tidak mempunyai sokongan kuasa pengkomputeran GPU yang berkuasa. Kami tidak tahu seberapa pantas pengesanan sinar perkakasan, atau walaupun konsol generasi baharu akan menyokongnya.
Oleh itu, kaedah pengesanan sinar perisian digunakan. Ia ternyata alat yang sangat berguna untuk menskala atau menyokong adegan dengan banyak kejadian bertindih.
Pengesanan sinar perisian memberikan kemungkinan untuk menggunakan pelbagai struktur penjejakan, seperti segi tiga, medan jarak dan luncur air atau medan ketinggian.
Di sini, Krzysztof Narkowicz meninggalkan kajian segi tiga dan mengkaji secara ringkas surfels, tetapi bagi geometri yang memerlukan kepadatan yang besar untuk diwakili, mengemas kini atau menjejaki surfel adalah Agak mahal.
Selepas penerokaan awal, medan ketinggian adalah yang paling sesuai kerana ia memetakan dengan baik ke dalam perkakasan dan menyediakan perwakilan permukaan dan LOD berterusan yang ringkas.
Oleh kerana kami boleh menggunakan semua algoritma POM, seperti min-max quadtree, kelajuan pengesanannya sangat pantas.
Selain itu, medan ketinggian berbilang boleh mewakili geometri kompleks, sama seperti meraster hierarki volum terikat.
Adalah sangat menarik untuk menganggapnya sebagai struktur pecutan untuk surfels, di mana satu texel ialah surfel yang dikekang oleh grid biasa .
Selain medan ketinggian, Lumen mempunyai ciri-ciri lain, seperti albedo atau iluminasi, supaya ia boleh mengira pencahayaan setiap masa.
Di Lumen, pembangun menamakan unjuran pelekat lengkap ini dengan Kad data permukaan, iaitu kedudukan tangkapan.
Rasterized segitiga
Kad Raymarched (medan ketinggian)
Raymarching terlalu perlahan untuk setiap kad dalam adegan. Oleh itu, struktur pecutan kad diperlukan, dan pembangun memilih BVH 4-nod. Ia dibina untuk pemandangan yang lengkap, dengan setiap bingkai pada CPU dan dimuat naik ke GPU.
Kemudian dalam shader surih kita akan melakukan traversal berasaskan timbunan dan secara dinamik memerintahkan nod supaya nod terdekat dilalui terlebih dahulu.
Pandangan Nyahpepijat BVH
Bahagian paling rumit di sini ialah cara meletakkan medan ketinggian supaya keseluruhan jaring ditangkap grid. Krzysztof Narkowicz berkata, "Salah satu idea adalah berdasarkan medan jarak global GPU. Setiap bingkai kami akan mengesan set kecil sinar utama untuk mencari sinar yang tidak diliputi oleh kad.
Seterusnya, Untuk setiap sinar yang belum ditemui, kami akan merentasi medan jarak global menggunakan kecerunan permukaan untuk menentukan orientasi dan julat kad yang optimum, menghasilkan kad baharu >
Kedudukan tangkapan medan jarak global
Di satu pihak, terbukti bahawa adalah mungkin untuk menjana kad untuk keseluruhan adegan yang digabungkan tanpa perlu mencipta kad untuk setiap kad despawn Grid , sebaliknya, ternyata agak cerewet dalam amalan, kerana mereka menghasilkan hasil yang berbeza setiap kali kamera bergerak Idea lain adalah untuk meletakkan setiap Kad mesh dilakukan sebagai langkah import mesh Ini dilakukan dengan membina BVH geometri di mana setiap nod akan ditukar kepada N kad seperti berikut: 🎜>
Segi tiga rasterisasi
Kad Ray Step (Medan Tinggi)
Pandangan Kedudukan Kad
Kaedah ini menghadapi masalah dalam mencari lokasi yang baik, kerana nod BVH bukanlah ejen yang baik untuk meletakkan kad Kedudukan Kad Berpandu Secara Bebas
Dengan percubaan dan kesilapan, kaedah ini berfungsi dengan baik untuk bentuk mudah, tetapi sebelum menumpu kepada lebih banyak Masalah timbul dengan bentuk yang kompleks Akhirnya, Narkowicz bertukar kembali kepada kad sejajar paksi, tetapi kali ini dihasilkan daripada kelompok tong sampah dan setiap jejaring >
Penjejakan kon
Sifat unik bagi. medan ketinggian penjejakan juga boleh mencapai penjejakan konPenjejakan kon berguna untuk mengurangkan bunyi sangat cekap kerana satu jejak kon pra-tapis mewakili beribu-ribu sinaran individu
Penjejakan Kon
Untuk setiap kad, pembangun juga menyimpan rantai peta mip pra-tapis lengkap dengan ketinggian permukaan, pencahayaan dan sifat bahan.
Apabila menjejak, pilih sinar melangkah yang sesuai berdasarkan jejak kon dan lakukan pengesanan sinar padanya.
Menjejak tepi tanpa kesesakan dan tepi dengan kesesakan
Menjejak sejumlah besar sinar tidak koheren dalam perisian adalah sangat perlahan. Sebaik-baiknya, satu struktur global akan digunakan dan bukannya berbilang medan ketinggian.
Apabila jejak kon menjadi lebih besar dan lebih besar, perwakilan tepat adegan sebenarnya tidak diperlukan dan boleh digantikan dengan perwakilan yang lebih anggaran untuk kelajuan yang lebih pantas.
Adegan yang lebih kompleks dengan berpuluh-puluh kad untuk mengesan setiap sinar
Kaedah pertama yang berjaya ialah melaksanakan pengesanan kon voxel tulen, di mana keseluruhan adegan divoxelkan pada masa tayangan, seperti dalam artikel klasik "Pencahayaan Tidak Langsung Interaktif Menggunakan Pengesanan Kon Voxel".
Rasterized segitiga
Kad Ray Step (Medan Ketinggian)
Penjejakan Kon Voxel
Kad ray stepping diteruskan dengan penjejakan kon voxel
Dan ini Kelemahan utama kaedah ini ialah kebocoran akibat gabungan geometri pemandangan yang berlebihan, yang amat ketara apabila menjejaki pemetaan rendah kasar.
Teknik pertama untuk mengurangkan kebocoran imej adalah dengan menjejaki medan jarak global dan hanya sampel voxel berhampiran dengan permukaan. Semasa proses pensampelan, kelegapan terkumpul apabila julat pensampelan berkembang, dan apabila penjejakan dihentikan, kelegapan akan mencapai 1. Ini sentiasa melakukan pensampelan yang tepat berhampiran geometri untuk mengurangkan kebocoran grafik.
Teknik kedua ialah memutihkan bahagian dalam mesh. Ini sangat mengurangkan kebocoran pada dinding yang lebih tebal, walaupun ini juga boleh menyebabkan beberapa halangan yang berlebihan.
Percubaan lain termasuk menjejak tompok bit voxel yang jarang dan saluran ketelusan voxel setiap muka. Tujuan kedua-dua eksperimen adalah untuk menyelesaikan masalah interpolasi voxel arah sinar, iaitu, dinding pepejal sejajar paksi akan menjadi lutsinar untuk sinar yang tidak normal pada dinding.
Voxel Bit Brick menyimpan satu bit setiap voxel dalam bata 8x8x8 untuk menunjukkan sama ada voxel yang diberikan kosong. Algoritma DDA dua peringkat kemudiannya digunakan untuk langkah sinar. Voxel dengan permukaan lutsinar adalah serupa tetapi mempunyai DDA yang sama dan meningkatkan ketelusan sepanjang arah sinar. Ternyata kedua-dua kaedah tidak sehebat mewakili geometri seperti domain jarak dan agak perlahan.
Voxel dengan ketelusan
Cara paling awal untuk menjejak perwakilan yang digabungkan ialah menggunakan medan jarak global dan kad setiap adegan global hits teduhan melakukan pengesanan kon. Iaitu, lelaran melalui BVH, ketahui kad dalam adegan yang mempengaruhi titik pensampelan, dan kemudian sampel tahap gelongsor sederhana setiap kad berdasarkan jejak tirus.
Artikel ini meninggalkan kaedah ini kerana ia tidak dianggap hanya menggunakannya untuk mewakili trajektori medan jauh, tetapi menganggapnya sebagai pengganti langsung untuk langkah cahaya medan tinggi. Agak ironisnya, pendekatan terbengkalai ini paling hampir dengan penyelesaian yang akhirnya kami capai dua tahun kemudian.
Pada ketika ini, ia menghasilkan beberapa hasil yang cukup baik:
Walaupun begitu, kami menghadapi banyak isu kebocoran grafik, dan dalam adegan mudah ini, prestasinya tidak begitu baik, walaupun pada GPU PC mewah.
Untuk menyelesaikan masalah kebocoran untuk mengendalikan lebih banyak kejadian dan menyelesaikan pemprosesan dalam masa kurang dari 8 milisaat pada PS5. Demo ini adalah pemangkin sebenar.
Berbanding dengan penyelesaian sebelumnya, perubahan pertama dan terbesar ialah menggantikan penjejakan medan ketinggian dengan penjejakan medan jarak.
Untuk menutup titik kesihatan, masukkan sinar titik kesihatan dari kad, kerana medan jarak tidak mempunyai ciri bucu, dengan cara ini, kawasan yang tidak dilindungi hanya akan menyebabkan tenaga kerugian, bukan kebocoran.
Mengubah surih kon voxel kepada surih sinar medan jarak global atas sebab yang sama.
Pada masa yang sama, kami juga telah melakukan banyak pengoptimuman berbeza dan masa memunggah bahagian Lumen yang berlainan melalui penyelesaian caching. Perlu diingat bahawa tanpa penjejakan kon kita perlu mengecam dan menyembunyikan penjejakan dengan lebih agresif, tetapi sekali lagi itu adalah cerita yang panjang dan rumit.
Ini ialah keputusan akhir selepas kami menghantar demo pertama, secara konsisten di bawah 8ms pada PS5, termasuk kemas kini kepada semua struktur data yang dikongsi seperti medan jarak global. Prestasi semasa adalah lebih baik Contohnya, masa penyiapan demo terkini hampir 4 milisaat, dan kualiti juga telah dipertingkatkan dengan ketara.
Ringkasnya, artikel ini adalah penulisan semula lengkap keseluruhan Lumen, dan terdapat banyak idea berbeza yang telah tidak dilaksanakan. Sebaliknya, beberapa perkara digunakan semula. Sama seperti pada asalnya kami menggunakan kad sebagai perwakilan penjejakan, tetapi kini ia digunakan sebagai cara untuk cache pelbagai pengiraan pada permukaan mesh. Sama seperti penjejakan perisian, ia bermula sebagai kaedah penjejakan utama kami, terutamanya penjejakan kon, tetapi akhirnya menjadi cara untuk mengecilkan dan menyokong adegan berat yang kompleks dengan banyak kejadian bertindih.
Atas ialah kandungan terperinci Rendering super realistik! Pakar teknologi Unreal Engine menerangkan sistem pencahayaan global Lumen. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!