Wdrożyłem algorytm Cascaded Light Propagation Volumes (brak pośredniego cieniowania) dla rozproszonego globalnego oświetlenia w czasie rzeczywistym, szczegółowo tu i tutaj . Działa dobrze, ale wciąż próbuję naprawić jeden artefakt.
Krótkie podsumowanie
Możesz to pominąć, jeśli wiesz już, jak działa algorytm.
Algorytm działa poprzez przechowywanie informacji o oświetleniu w postaci harmonicznych sferycznych w siatce 3D, gdzie początkowo dane w każdej komórce siatki pochodzą z renderowania rozszerzonej mapy cieni ( odblaskowa mapa cieni), która oprócz głębi zawiera także informacje o kolorze i normalne. Chodzi o to, że zasadniczo wszystkie piksele widziane przez źródło światła są przyczyną pierwszego odbicia pośredniego oświetlenia, więc przechowujesz wymagane informacje obok zwykłego bufora głębokości używanego do mapowania cieni i próbkujesz wszystkie dane, aby zainicjować siatkę 3D . Informacje w siatce 3D są następnie propagowane iteracyjnie poprzez (dla każdej iteracji) propagację informacji w jednej komórce do wszystkich 6 bezpośrednich sąsiadów (powyżej, poniżej, z lewej, z prawej, z góry, z dołu). Aby oświetlić scenę za pomocą informacji w siatce, zastosujesz przejście pełnoekranowe nad sceną, a dla każdego zrasteryzowanego piksela masz dostępną pozycję w przestrzeni światowej zrasteryzowanej powierzchni (np. Z buforów G w odroczonym cieniowaniu), więc wiedzieć, do której komórki siatki należy dany piksel na ekranie.
W większości przypadków działa dobrze, oto dwa obrazy bez symulowanego GI i tylko zakodowany termin otoczenia, a obok niego obraz z algorytmem LPV. Zwróć uwagę na kolorowe odbicia na powierzchni, lepszą szczegółowość głębi itp.
Problem
Podczas wyszukiwania komórek na etapie oświetlenia stosuje się interpolację trójliniową (przy użyciu sprzętowych filtrów tekstur), aby płynnie interpolować dane między środkiem komórki, sąsiednimi komórkami i rzeczywistą współrzędną tekstury. Zasadniczo interpolacja ta naśladuje propagację informacji o oświetleniu w środku komórki do konkretnych pikseli wokół centrum, w którym informacje są wyszukiwane. Jest to wymagane, ponieważ w przeciwnym razie oświetlenie wyglądałoby bardzo szorstko i brzydko. Ponieważ jednak interpolacja trójliniowa nie uwzględnia kierunku propagacji światła informacji o oświetleniu zakodowanych w komórce (pamiętaj, że to harmoniczne sferyczne), światło może być niepoprawnie propagowane do szukanego piksela. Na przykład, jeśli promieniowanie zakodowane w komórce propaguje się tylko w kierunku (1,0,0) („
Powoduje to nieprawidłowe krwawienie światła przez ściany, gdy rozmiary komórek w siatce są duże w porównaniu z powierzchniami w scenie (jest to konieczne, ponieważ potrzebne są duże komórki do rozprzestrzeniania światła daleko w scenie przy możliwie najmniejszej liczbie iteracji propagacyjnych). Tak to wygląda:
Jak widać (z konturów cienia w prawym górnym rogu), scena jest oświetlona przez kierunkowe źródło światła gdzieś nad sceną w lewym górnym rogu. A ponieważ istnieje tylko jedna komórka oddzielająca zewnętrzną stronę przedsionka i wnętrze, światło przecieka, a ściana po lewej stronie jest nieprawidłowo oświetlona.
Rzeczywiste pytanie
Autor sugeruje formę ręcznego filtrowania anizotropowego, aby to naprawić. Daje gradient luminancji (zakładam współczynniki SH próbkowane z bieżącej komórki) w kierunku kierunku normalnej powierzchni n jako:
I stwierdza
Zatem porównując pochodną kierunkową promieniowania z rzeczywistym kierunkiem promieniowania, można obliczyć, czy rozkład promieniowania zaczyna się dalej niż jego trójpoliniowa interpolacja dla tego punktu.
Moje pytania):
W równaniu funkcja c (x) wydaje się być współczynnikami SH w punkcie (x). Tak więc gradient luminancji wydaje się być obliczany jak normalna pochodna numeryczna jako ważona różnica współczynników SH w punktach x - (n / 2) i x + (n / 2). Czym jednak jest c (x) w moim kontekście? Obecnie zakładam, że c (x) odnosi się do trójliniowo interpolowanych współczynników w położeniu powierzchniowym (x), ale nie jestem wcale pewien, ponieważ nie wiem, jak to powinno dać ci więcej informacji na temat kierunku rozkład współczynników SH.
I w jaki sposób ten gradient jest następnie wykorzystywany do zmiany, w jaki sposób próbkowane oświetlenie z komórki jest dokładnie stosowane do powierzchni? Autor pisze „porównując pochodną kierunkową promieniowania z rzeczywistym kierunkiem promieniowania”, ale jest to dość niejasne.
Wspomina o zastosowaniu „centralnego schematu różnicowania” i odwołuje się do tych slajdów do centralnego różnicowania współczynników SH, a także odwołuje się do tego dokumentu, który pokazuje pochodne gradientu, ale w tej chwili nie mogę wyciągnąć z nich żadnych użytecznych wniosków.