Grafika w czasie rzeczywistym wykorzystuje różne przybliżenia, aby poradzić sobie z kosztami obliczeniowymi symulacji oświetlenia pośredniego, kompromis między wydajnością w czasie wykonywania a wiernością oświetlenia. Jest to obszar aktywnych badań, a nowe techniki pojawiają się co roku.
Otaczające światło
Na najprostszym końcu zakresu można zastosować oświetlenie otoczenia : globalne, wszechkierunkowe źródło światła, które stosuje się do każdego obiektu na scenie, bez względu na rzeczywiste źródła światła lub lokalną widoczność. Nie jest to wcale dokładne, ale jest niezwykle tanie, łatwe do poprawienia przez artystę i może wyglądać dobrze w zależności od sceny i pożądanego stylu wizualnego.
Typowe rozszerzenia podstawowego oświetlenia otoczenia obejmują:
- Spraw, aby kolor otoczenia zmieniał się kierunkowo, np. Za pomocą harmonicznych sferycznych (SH) lub małej mapy sześciennej , i patrząc na kolor w module cieniującym w oparciu o normalny wektor każdego wierzchołka lub piksela. Umożliwia to pewne wizualne rozróżnienie powierzchni o różnych orientacjach, nawet tam, gdzie nie dociera do nich bezpośrednie światło.
- Zastosuj techniki okluzji otoczenia (AO) , w tym wstępnie obliczone AO wierzchołka, mapy tekstur AO, pola AO i AO w przestrzeni ekranu (SSAO) . Wszystko to działa, próbując wykryć obszary, takie jak dziury i szczeliny, w których światło pośrednie jest mniej podatne na odbijanie, i przyciemnić tam światło otoczenia.
- Dodaj mapę sześcienną środowiska, aby uzyskać odbicie lustrzane otoczenia. Mapa sześcienna o przyzwoitej rozdzielczości (128 ² lub 256 ² na twarz) może być dość przekonująca dla lustrzanych na zakrzywionych, błyszczących powierzchniach.
Pieczone oświetlenie pośrednie
Kolejny „poziom”, że tak powiem, technik obejmuje pieczenie (wstępne obliczenia offline) pewnej reprezentacji pośredniego oświetlenia na scenie. Zaletą pieczenia jest to, że można uzyskać bardzo wysokiej jakości wyniki przy niewielkich kosztach obliczeniowych w czasie rzeczywistym, ponieważ wszystkie twarde części są wykonywane w piecu. Kompromisy polegają na tym, że czas potrzebny na proces pieczenia szkodzi wskaźnikowi iteracji projektantów poziomów; potrzeba więcej pamięci i miejsca na dysku do przechowywania wstępnie obliczonych danych; możliwość zmiany oświetlenia w czasie rzeczywistym jest bardzo ograniczona; a proces pieczenia może wykorzystywać tylko informacje z geometrii na poziomie statycznym, więc pośrednie efekty świetlne pochodzące od obiektów dynamicznych, takich jak postacie, zostaną pominięte. Mimo to pieczone oświetlenie jest dziś bardzo szeroko stosowane w grach AAA.
W kroku pieczenia można użyć dowolnego pożądanego algorytmu renderowania, w tym śledzenia ścieżki, radości lub samego silnika gry do renderowania map sześciennych (lub półkul ).
Wyniki mogą być przechowywane w teksturach ( mapach świetlnych ) zastosowanych do geometrii statycznej na poziomie i / lub mogą być również konwertowane na SH i przechowywane w strukturach danych wolumetrycznych, takich jak objętości natężenia napromienienia (tekstury objętości, w których każdy tekst przechowuje sondę SH) lub czworościenne siatki . Następnie możesz użyć shaderów, aby wyszukać i interpolować kolory z tej struktury danych i zastosować je do renderowanej geometrii. Podejście wolumetryczne pozwala zastosować wypalone oświetlenie do obiektów dynamicznych, a także do geometrii statycznej.
Rozdzielczość przestrzenna map świetlnych itp. Będzie ograniczona pamięcią i innymi praktycznymi ograniczeniami, więc możesz uzupełnić pieczone oświetlenie pewnymi technikami AO, aby dodać szczegóły wysokiej częstotliwości, których nie zapewnia pieczone oświetlenie, i reagować na obiekty dynamiczne (takie jak przyciemnienie światła pośredniego pod poruszającą się postacią lub pojazdem).
Istnieje również technika zwana wstępnie obliczonym transferem blasku (PRT) , która wydłuża czas pieczenia w celu obsługi bardziej dynamicznych warunków oświetleniowych. W PRT zamiast pieczenia samego oświetlenia pośredniego, piec funkcję przenoszenia z jakiegoś źródła światła - zwykle nieba - do wynikowego oświetlenia pośredniego w scenie. Funkcja przenoszenia jest reprezentowana jako macierz, która przekształca się ze współczynników SH źródłowych na docelowe w każdym punkcie próbki upieczonej. Umożliwia to zmianę warunków oświetlenia, a oświetlenie pośrednie w scenie zareaguje w wiarygodny sposób. Far Cry 3 i 4 zastosowali tę technikę, aby umożliwić ciągły cykl dzień-noc, z pośrednim oświetleniem zmieniającym się w zależności od kolorów nieba o każdej porze dnia.
Jeszcze jedna uwaga na temat pieczenia: przydatne mogą być oddzielne dane na temat pieczenia dla rozproszonego i lustrzanego oświetlenia pośredniego. Mapy sześcienne działają znacznie lepiej niż SH dla lustrzanych (ponieważ mapy sześcienne mogą mieć znacznie więcej szczegółów kątowych), ale zajmują również dużo więcej pamięci, więc nie możesz sobie pozwolić na umieszczenie ich tak gęsto, jak próbki SH. Aby nieco to zrekompensować, można zastosować korekcję paralaksy , heurystycznie wypaczając mapę sześcienną, aby jej odbicia były bardziej uziemione do otaczającej ją geometrii.
Techniki w pełni czasu rzeczywistego
Wreszcie możliwe jest obliczenie w pełni dynamicznego oświetlenia pośredniego na GPU. Może reagować w czasie rzeczywistym na dowolne zmiany oświetlenia lub geometrii. Jednak znowu występuje kompromis między wydajnością środowiska uruchomieniowego, wiernością oświetlenia i rozmiarem sceny. Niektóre z tych technik wymagają w ogóle mocnego procesora graficznego i mogą być wykonalne tylko przy ograniczonych rozmiarach scen. Zwykle obsługują tylko jedno odbicie pośredniego światła.
- Dynamiczna mapa kubatury środowiska, w której ściany mapy kubków są ponownie renderowane dla każdej klatki za pomocą sześciu kamer skupionych wokół wybranego punktu, może zapewnić całkiem dobre odbicie otoczenia dla pojedynczego obiektu. Jest to często wykorzystywane na przykład w samochodzie gracza w grach wyścigowych.
- Globalne oświetlenie przestrzeni ekranu , rozszerzenie SSAO, które gromadzi odbite oświetlenie z pobliskich pikseli na ekranie w przebiegu przetwarzania końcowego.
- Odbicie raytracingu w przestrzeni ekranu działa poprzez marsz promienny przez bufor głębokości w post-passie. Zapewnia odbicia o dość wysokiej jakości, o ile odbite obiekty znajdują się na ekranie.
- Natychmiastowa radość polega na śledzeniu promieni na scenie za pomocą procesora i umieszczaniu punktowego światła w każdym punkcie trafienia promienia, który w przybliżeniu reprezentuje wychodzące światło odbite we wszystkich kierunkach od tego promienia. Te liczne światła, znane jako wirtualne światła punktowe (VPL), są następnie renderowane przez GPU w zwykły sposób.
- Odblaskowe mapy cienia (RSM) są podobne do natychmiastowej radości, ale VPL są generowane przez renderowanie sceny z punktu widzenia światła (jak mapa cienia) i umieszczenie VPL na każdym pikselu tej mapy.
- Objętości propagacji światła składają się z siatek 3D sond SH umieszczonych w całej scenie. RSM są renderowane i używane do „wstrzykiwania” światła odbitego do sond SH najbliższych powierzchni odbijających. Następnie proces przypominający wypełnienie powodziowe rozsyła światło z każdej sondy SH do otaczających punktów na siatce, a wynik tego jest wykorzystywany do zastosowania oświetlenia na scenie. Technikę tę rozszerzono również na wolumetryczne rozpraszanie światła .
- Śledzenie stożków wokselu polega na wokselowaniu geometrii sceny (prawdopodobnie przy użyciu różnych rozdzielczości wokseli, dokładniejszych w pobliżu kamery i grubszych daleko), a następnie wstrzykiwaniu światła z RSM do siatki wokseli. Podczas renderowania głównej sceny moduł cieniujący piksel wykonuje „ślad stożka” - marsz promieniowy o stopniowo zwiększającym się promieniu - przez siatkę wokseli, aby zebrać przychodzące światło dla cieniowania rozproszonego lub lustrzanego.
Większość tych technik nie jest dziś powszechnie wykorzystywana w grach z powodu problemów ze skalowaniem do realistycznych rozmiarów scen lub innych ograniczeń. Wyjątkiem jest odbicie przestrzeni ekranu, które jest bardzo popularne (chociaż zwykle używane jest z mapami sześciennymi jako rezerwą, w regionach, w których zawodzi część ekranu).
Jak widać, oświetlenie pośrednie w czasie rzeczywistym jest ogromnym tematem, a nawet ta (raczej długa!) Odpowiedź może zapewnić jedynie 10 000 stóp przeglądu i kontekst do dalszego czytania. To, które podejście będzie dla Ciebie najlepsze, będzie zależeć w dużej mierze od szczegółów konkretnej aplikacji, ograniczeń, które chcesz zaakceptować i od tego, ile czasu będziesz musiał w to włożyć.
Jest to główny „trudny” problem pozostający w CG w czasie rzeczywistym, a wiele badań jest w trakcie jego rozwiązywania.
Największą przeszkodą jest to, że w grafice rastrowej każdy element sceny jest renderowany „w próżni” - każdy trójkąt jest renderowany bez odniesienia do innych trójkątów w scenie, i to samo dotyczy pikseli, w przeciwieństwie do metod śledzenia promieniami gdzie każdy promień ma dostęp do całej sceny w pamięci. Dlatego programiści w czasie rzeczywistym muszą używać chwytliwych sztuczek, aby robić rzeczy takie jak odbicia i cienie, to samo dotyczy globalnego oświetlenia.
Tani sposób działania polega na użyciu wypalonych map świetlnych, w których najpierw uruchamiasz w trybie offline coś powolnego, ale niesamowitego, na przykład radość lub śledzenie ścieżki, a następnie zapisujesz informacje o oświetleniu wraz ze zwykłymi danymi wierzchołków. Jest to świetne w przypadku geometrii statycznej, ale staje się problematyczne, gdy tylko dodasz ruchome obiekty. Michał Iwanicki zrobił dobrą prezentację na temat tego, jak rozwiązali ten problem w „The Last of Us”.
Sferyczne harmoniczne są często stosowane w silnikach gier do reprezentowania światła pośredniego. Zasadniczo są one transformacją Fouriera na powierzchni kuli, odrzucając komponenty o wysokiej częstotliwości, można uzyskać przyjemne wizualnie, w większości dokładne oświetlenie otoczenia, w zaledwie 9 współczynnikach na kolor. Na przykład Unity używa SH do pieczenia „sond świetlnych” w różnych punktach sceny, poruszające się obiekty mogą następnie interpolować między pobliskimi sondami, aby uzyskać przybliżenie światła pośredniego w ich położeniu. Artykuł Robina Greena jest w zasadzie biblią dotyczącą tej techniki, ale jest dość ciężki.
Obecnie gorącą techniką jest śledzenie stożka Voxela, które nie wymaga żadnego kroku przed pieczeniem. Sam nie znam się na tym zbyt dobrze, ale jak rozumiem, wiąże się to z wokselowaniem twojej sceny do świata w stylu Minecraft o niskiej rozdzielczości, umieszczeniem wokseli w szybko przechodzącej strukturze przestrzennej, takiej jak oktawa, a następnie rzuceniu kilku szerokich promienie (szyszki) z każdego punktu i sprawdzanie, które woksele uderzają, aby zebrać podskakujące światło. NVidia w tej chwili bardzo mocno naciska, a są na to dokumenty tutaj i tutaj .
Mam nadzieję, że to pomoże :)
źródło
Śledzenie ścieżki jest bardzo drogim obliczeniowo algorytmem, nieprzystosowanym do czasu rzeczywistego. Architektura PBRT również nie jest dostosowana do czasu rzeczywistego, głównym celem PBRT jest rozwiązanie równania renderowania przy użyciu obiektywnej integracji Monte Carlo. Widzieć uzyskać więcej informacji, https://en.wikipedia.org/wiki/Niezależne_renderowanie .
Bez wielu optymalizacji i ograniczeń wątpię, czy będziesz w stanie osiągnąć przyzwoitą wydajność na urządzeniu mobilnym.
W każdym razie, śledzenie ścieżki może być zaimplementowane w OpenGL, sugeruję zajrzeć shaderom obliczeniowym, które są bardzo potężne. OpenGL ES 3.1 obsługuje shadery obliczeniowe z pewnymi drobnymi ograniczeniami, w przeciwieństwie do Desktop GL.
Przeczytaj tę stronę, aby uzyskać więcej informacji: https://github.com/LWJGL/lwjgl3-wiki/wiki/2.6.1.-Ray-tracing-with-OpenGL-Compute-Shaders-(Part-I)
Powodzenia!
źródło