Saya telah mengimplementasikan algoritma Cascaded Light Propagation Volumes (belum ada bayangan tidak langsung) untuk iluminasi global difus waktu-nyata yang diperinci di sini dan di sini . Ini berfungsi dengan baik tetapi saya masih mencoba untuk memperbaiki satu artefak pada khususnya.
Ringkasan singkat
Anda dapat melewati ini jika Anda sudah tahu bagaimana algoritma bekerja.
Algoritma ini bekerja dengan menyimpan informasi pencahayaan dalam bentuk harmonik bola dalam kisi 3D, di mana pada awalnya data di setiap sel kisi berasal dari render peta bayangan yang diperluas ( peta bayangan reflektif)) itu juga termasuk warna dan informasi normal, selain kedalaman. Idenya adalah bahwa pada dasarnya semua piksel yang dilihat oleh sumber cahaya adalah penyebab pantulan pertama penerangan tidak langsung, sehingga Anda menyimpan informasi yang diperlukan di samping buffer kedalaman biasa yang Anda gunakan untuk pemetaan bayangan, dan sampel semua data untuk menginisialisasi kisi 3D . Informasi dalam kisi 3D kemudian diperbanyak secara iteratif dengan (untuk setiap iterasi) menyebarkan informasi dalam satu sel ke semua 6 tetangga langsungnya (di atas, di bawah, kiri, kanan, atas, atas, bawah). Untuk menerangi pemandangan menggunakan informasi di grid, Anda menerapkan layar penuh melewati adegan Anda, dan untuk setiap piksel raster Anda memiliki posisi ruang dunia permukaan raster yang tersedia (misalnya dari G-Buffer dalam naungan ditangguhkan), sehingga Anda tahu sel mana dari grid yang dimiliki piksel tertentu pada layar.
Ini berfungsi dengan baik untuk sebagian besar, di sini adalah dua gambar tanpa simulasi GI dan hanya istilah ambient hardcoded, dan di sebelahnya gambar dengan algoritma LPV. Perhatikan pantulan berwarna pada permukaan, detail kedalaman yang lebih baik, dll.
Masalah
Ketika mencari sel selama tahap pencahayaan, interpolasi trilinear (menggunakan filter tekstur perangkat keras) digunakan untuk menginterpolasi data dengan lancar antara pusat sel, sel tetangga, dan koordinat tekstur aktual yang terlihat. Intinya, interpolasi ini meniru penyebaran informasi pencahayaan di pusat sel ke piksel konkret di sekitar pusat tempat informasi itu dilihat. Ini diperlukan karena jika tidak, pencahayaan akan terlihat sangat kasar dan jelek. Namun, karena interpolasi trilinear tidak memperhitungkan arah rambat cahaya informasi pencahayaan yang dikodekan dalam sel (ingat, itu dalam harmonik bola), cahaya dapat disebarkan secara keliru ke piksel yang tampak. Misalnya, jika pancaran yang dikodekan dalam sel hanya merambat ke (1,0,0) ("
Hal ini menyebabkan pendarahan cahaya salah melalui dinding ketika ukuran sel di grid besar dibandingkan dengan permukaan di tempat kejadian (ini diperlukan karena Anda membutuhkan sel besar untuk menyebarkan cahaya jauh ke tempat kejadian dengan iterasi propagasi sesedikit mungkin). Seperti inilah tampilannya:
Seperti yang Anda lihat (dari bayangan di kanan atas), pemandangan diterangi oleh sumber cahaya arah di suatu tempat di atas pemandangan ke kiri atas. Dan karena hanya ada satu sel yang memisahkan bagian luar atrium dan bagian dalam, cahaya berdarah melalui dan dinding ke kiri diterangi dengan tidak benar.
Pertanyaan aktual
Penulis menyarankan bentuk penyaringan anisotropik manual untuk memperbaikinya. Dia memberikan gradien cahaya (saya mengasumsikan koefisien SH sampel dari sel saat ini) menuju arah permukaan normal n sebagai:
Dan menyatakan
Jadi, dengan membandingkan turunan terarah radiance dengan arah pancaran yang sebenarnya, dapat dihitung apakah distribusi cahaya mulai lebih jauh dari interpolasi trilinearnya untuk titik ini.
Pertanyaan saya):
Dalam persamaan, fungsi c (x) tampaknya menjadi koefisien SH pada titik (x). Jadi gradien pancaran tampaknya dihitung seperti derivasi numerik normal sebagai perbedaan bobot koefisien SH pada titik x - (n / 2) dan x + (n / 2). Namun, apa c (x) dalam konteks saya? Saat ini saya mengasumsikan bahwa c (x) mengacu pada koefisien interpolasi trilinearly di lokasi permukaan (x), tetapi saya tidak yakin sama sekali, karena saya tidak tahu bagaimana yang seharusnya memberi Anda lebih banyak informasi tentang arah distribusi koefisien SH.
Dan bagaimana gradien itu kemudian digunakan untuk mengubah bagaimana pencahayaan sampel dari sel diterapkan pada permukaan, tepatnya? Penulis hanya menulis "membandingkan turunan directional pancaran dengan arah pancaran yang sebenarnya", tetapi ini cukup samar.
Dia menyebutkan menggunakan "skema diferensiasi pusat" dan referensi slide ini untuk perbedaan pusat koefisien SH, dan juga referensi makalah ini yang menunjukkan derivasi dari gradien, tetapi saat ini saya tidak bisa menarik kesimpulan yang berguna dari mereka.