Naungan berbasis fisik - pencahayaan ambient / tidak langsung


Saya menerapkan pelacak jalur berbasis fisik setelah mempelajari PBRT oleh M. Pharr dan G. Humphreys. Sekarang saya mencoba menerapkan rendering berbasis fisik ke grafik waktu nyata menggunakan OpenGL ES (dalam aplikasi iPhone).

Saya ingin mulai menggunakan Oren-Nayar dan Cook-Torrance sebagai BRDF difus dan specular, tetapi saya memiliki masalah: bagaimana cara memodelkan pencahayaan tidak langsung?

Dalam lacak jalur (seperti yang terdapat pada pbrt), cahaya tidak langsung / ambient diberikan "secara otomatis" dari algoritma lintasan jejak, karena mengikuti lintasan sinar cahaya dengan memperhitungkan pencahayaan langsung dan tidak langsung.

Bagaimana cara memodelkan pencahayaan tidak langsung dalam render berbasis fisik yang ditulis dalam OpenGL ES, sehingga menggunakan grafik komputer waktu nyata?

Jawaban:


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.


Hai @Nathan, terima kasih atas jawaban terperinci Anda. Saya tahu ini adalah topik yang sangat besar (dan subjek penelitian yang besar). Masalah terbesar adalah bahwa dokumentasi online terpecah-pecah, dan sulit untuk menemukan pendekatan yang baik. Proyek saya adalah goo.gl/Fgo21x ini : penampil BRDF (terinspirasi oleh WDAS viewer) untuk menunjukkan model BRDF berbasis empiris dan fisik dan yang mendukung perhitungan warna menggunakan data Spectral - nilai tristimulus. Ini adalah proyek pendidikan untuk mempelajari OpenGL.
Fabrizio Duroni

Saya pikir pendekatan pertama yang baik bisa menggunakan ekstensi umum yang Anda sebutkan: SH atau peta kubus kecil + peta lingkungan (untuk refleksi dan refraksi). Apa yang Anda pikirkan? (Saya sedang mengembangkan aplikasi ini setelah bekerja selama malam tanpa tidur saya :)). Sekali lagi terima kasih atas kumpulan sumber yang Anda tautkan di atas (saya memiliki banyak bahan untuk dipelajari sekarang).
Fabrizio Duroni

@FabrizioDuroni Yep! Untuk pemirsa BRDF, ambient directional yang sederhana plus cubemap lingkungan harus bagus.
Nathan Reed

Mungkin ini termasuk ke dalam salah satu kategori Anda, tetapi bukankah mode lama membuat semua bentuk kubus secara teknis teknik yang sepenuhnya realtime? Juga, tidak mungkin untuk menambah ambient dasar dengan cubemap lingkungan untuk refleksi difus juga?

@racarate Maaf butuh waktu untuk merespons, tapi ya, Anda benar! Saya pikir saya bermaksud menyebutkan itu, tetapi lupa. :) Pokoknya, saya menambahkannya. (Saya memang menyebutkan menggunakan cubemap untuk difus, di titik peluru pertama.)
Nathan Reed

Ini adalah masalah 'sulit' utama yang tersisa di CG waktu nyata, dan ada banyak penelitian yang sedang berlangsung untuk menyelesaikannya.

Rintangan terbesar adalah bahwa dalam grafik raster, setiap komponen adegan diberikan 'dalam ruang hampa' - setiap segitiga diberikan tanpa referensi ke segitiga lain di tempat itu, dan hal yang sama berlaku untuk piksel, yang bertentangan dengan pendekatan penelusuran sinar. di mana setiap sinar memiliki akses ke seluruh adegan dalam memori. Jadi programmer real-time perlu menggunakan trik hacky untuk melakukan hal-hal seperti refleksi dan bayangan, dan hal yang sama berlaku untuk penerangan global.

Metode runtime yang murah adalah dengan menggunakan peta cahaya yang dipanggang, di mana Anda menjalankan sesuatu yang lambat tapi mengagumkan seperti radiositas atau lacak jalur luring terlebih dahulu, kemudian simpan informasi pencahayaan bersama dengan data titik biasa Anda. Ini bagus untuk geometri statis, tetapi menjadi bermasalah segera setelah Anda menambahkan objek bergerak. Michal Iwanicki melakukan presentasi yang baik tentang bagaimana mereka memecahkan ini untuk 'The Last of Us'.

Spherical Harmonics banyak digunakan dalam mesin game untuk merepresentasikan cahaya tidak langsung. Mereka pada dasarnya adalah transformasi Fourier melintasi permukaan bola, dengan membuang komponen frekuensi tinggi yang bisa Anda dapatkan secara visual menyenangkan, sebagian besar pencahayaan lingkungan yang akurat hanya dalam 9 koefisien per-warna. Unity, misalnya, menggunakan SH untuk memanggang 'probe cahaya' di berbagai titik dalam adegan, objek yang bergerak kemudian dapat diinterpolasi antara probe terdekat untuk mendapatkan perkiraan cahaya tidak langsung di posisi mereka. Kertas Robin Green pada dasarnya adalah kitab suci tentang teknik ini, tetapi ini cukup berat.

Teknik panas saat ini tampaknya adalah Voxel Cone Tracing, yang tidak melibatkan langkah pra-panggang. Saya sendiri tidak terlalu terbiasa dengan hal itu, tetapi seperti yang saya pahami, itu melibatkan voxelizing adegan Anda ke dunia gaya rendah Minecraft, menempatkan voxels ke dalam struktur spasial yang cepat dapat dilalui seperti sebuah octree, kemudian casting beberapa lebar. sinar (kerucut) dari setiap titik dan memeriksa voxel yang mereka tekan untuk mengumpulkan pencahayaan pantulan. NVidia mendorong ini cukup keras saat ini, dan ada makalah di sini dan di sini .

Semoga itu bisa membantu :)


Path tracing adalah algoritma yang sangat mahal secara komputasi, dan tidak cocok untuk waktu nyata. Arsitektur PBRT juga tidak cocok untuk waktu nyata, tujuan utama PBRT adalah untuk menyelesaikan persamaan rendering, menggunakan integrasi Monte Carlo yang tidak bias. Lihat https://en.wikipedia.org/wiki/Unprice_rendering untuk info lebih lanjut.

Tanpa banyak optimasi dan kendala, saya ragu Anda akan dapat mencapai kinerja yang layak di perangkat seluler.

Dalam kasus apa pun, pelacakan jalur dapat diimplementasikan dalam OpenGL, saya akan menyarankan untuk melihat ke komputasi shader yang sangat kuat. OpenGL ES 3.1 mendukung komputasi shader dengan beberapa batasan kecil, berbeda dengan Desktop GL.

Baca halaman ini untuk mendapatkan informasi lebih lanjut: https://github.com/LWJGL/lwjgl3-wiki/wiki/2.6.1.-Ray-tracing-with-OpenGL-Compute-Shaders-(Part-I)

Semoga berhasil!

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.