Lekkie wolumeny rozmnażania: anizotropowe filtrowanie danych objętościowych

9

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.

wprowadź opis zdjęcia tutaj

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:

wprowadź opis zdjęcia tutaj

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:

wprowadź opis zdjęcia tutaj

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.

TravisG
źródło

Odpowiedzi:

4

Główną różnicę wprowadził papier AMD, gdy wykonali demo z kryształem latającym w tunelu z pamięci.

Ta cfunkcja nie musi być czymś precyzyjnym, tylko pomysłem np. Blasku, więc po prostu oceń SH używając bieżącej normalnej.

Zatem to, co robisz z tym, to obniżanie tonów, przy użyciu czynnika empirycznego, blask przy użyciu tej różnicy. Ale wyłączasz się tylko wtedy, gdy różnica wskazuje, że strumień światła odbiega od twojej obecnej normalnej.

Zasadniczo chodzi o to, aby empirycznie wykryć fakt, że jeśli pójdziesz w kierunku przeciwnym do normalnej ściany, przepływ światła zmniejsza się powoli, ponieważ rozchodzi się w powietrzu (po drugiej stronie). Ale jeśli sondujesz nieco przed swoim normalnym, zauważysz nagły spadek strumienia, co oznacza, że ​​komórka, z której próbujesz teraz, jest w rzeczywistości przeciekaniem.

Przekonałem się, że działa w 70% przypadków, ale jeśli zastosuje się go niedbale, może tworzyć bardzo dziwne efekty czarnych dziur lub zmiany odcienia (różowy, zielony ...) na bardzo ciemnych obszarach, które zawierają lekki wyciek w inny sposób. Dzieje się tak, ponieważ masz 3 LPV dla każdego koloru, centralna różnica zwykle daje różne wyniki. Jeśli jesteś w stanie, spróbuj użyć jasności w skali szarości, aby ocenić środkowy tłumik różnicy, i zastosuj wspólny współczynnik redukcji dla wszystkich kanałów kolorów później.

Bez tego hacka normalnie i tak nie powinieneś mieć dużo blasku, ponieważ normalna wartość używana do oceny SH jest przeciwna do kierunku strumienia. Jakkolwiek zauważyłeś, 2-pasmowy SH zastosowany w LPV nie jest w rzeczywistości wystarczający i ma silny komponent DC, który daje tak silne wycieki. Właśnie dlatego LPV jest niepraktyczny dla geometrii, które nie są ściśle kontrolowane przez znającego LPV artystę, który zapewni każdej ścianie minimalną grubość w celu zmniejszenia wycieków.

Również niektóre firmy (jak kwadrat enix) używają ręcznie zaprojektowanych ścian blokujących, aby zabić przecieki, tak jak powinna zapewnić objętość geometrii. (objętość geometrii pomaga zredukować wycieki, ale retroprojekt RSM w celu wokoksylacji sceny jest w większości przypadków zbyt częściowy i tworzy aliasing na poziomie komórki LPV, co daje wycieki jeszcze gorszy wygląd, ponieważ dziwnie zmieniają intensywność).

Możesz go tylko wyssać i spróbować złagodzić problemy, dając LPV słabsze końcowe słowo na końcowym pośrednim świetle, użyj stałego terminu o wadze (0,5?), A LPV może przyczynić się do pozostałych 0,5 pośrednich światło. Spróbuj także zaimplementować objętość geometrii, zmniejszy to problem. I wreszcie główna różnica.

v.oddou
źródło
jako ulepszenie ponad 50% stałego otoczenia, można zastosować technikę zwaną „ambient BRDF” (tri-Ace).
v.oddou,