Cienie w odroczonym renderowaniu

12

Przeczytałem trochę materiału o odroczonym renderowaniu i myślę, że rozumiem o co chodzi. Ale nie rozumiem, w jaki sposób osiąga cienie. O ile mi wiadomo, bufor G nie obejmuje tworzenia mapy cienia dla każdego światła, więc jestem zdezorientowany, w jaki sposób przejście światła jest świadome, czy każdy piksel jest zasłonięty, czy nie. W końcu dany piksel, który jest widoczny z perspektywy kamery, może w rzeczywistości nie być widoczny z perspektywy danego światła - i ta geometria okluzji może nie być widoczna z perspektywy kamery, a zatem nie ma o tym nic zapisanego w buforze G. .

Jeśli zaczniesz renderować mapy cienia, będzie to wyglądało tak samo jak renderowanie do przodu - renderujesz całą geometrię w scenie dla każdego światła do renderowania map cienia.

Jak więc renderowanie odroczone pozwala uzyskać cienie odpowiadające renderowaniu do przodu?

DeadMG
źródło

Odpowiedzi:

14

Odroczone cieniowanie nie robi nic specjalnego dla cieni. Nadal musisz renderować mapy cienia normalnie, a następnie renderować każde światło z odpowiednią mapą cienia związaną jako tekstura.

Jest to wciąż lepsze niż renderowanie do przodu, ponieważ nie trzeba przerysowywać sceny w widoku głównym, aby zastosować oświetlenie. Rysowanie mapy cienia jest często znacznie tańsze niż rysowanie większej liczby przejść w widoku głównym, ponieważ nie trzeba wykonywać cieniowania pikseli, a mapy cienia często zawierają mniej sceny (można wykreślić o wiele więcej rzeczy).

Ludzie czasami robią „odroczone cienie” dla jednego światła, zazwyczaj głównego światła kierunkowego. Głównym powodem tego jest użycie kaskadowych map cieni lub innego podejścia, które wykorzystuje wiele map cieni dla tego samego światła. Możesz zarezerwować jeden kanał w buforze G na maskę cienia (biały, oświetlony, ciemny, zacieniony) i zastosować wszystkie kaskadowe mapy cieni do tego kanału bufora G. następnie moduł cieniujący światła odczytuje maskę cienia i mnoży ją do koloru światła. Jest to miłe, ponieważ oddziela cienie od cieniowania, ale nadal rysujesz te same mapy cieni.

Nathan Reed
źródło
1
Jeśli jesteś wyjątkowo sprytny, możesz spróbować użyć modułu cieniującego geometrię podczas tworzenia GBuffera, aby „wstawić” tworzenie mapy cienia (podobnie jak w przypadku mapy sześcianu DX10). Nie jestem pewien, czy zostało to zrobione, czy jest to w ogóle możliwe, czy też byłoby wolniejsze na końcu - ale zbliżyłoby tworzenie map cieni do odroczonego cieniowania lub do definicji w zależności od twojej religii.
Jonathan Dickinson
6

Czym jest mapa cieni? Mapa cieni to tekstura, której tekstury odpowiadają na proste pytanie: w jakiej odległości od światła, wzdłuż kierunku reprezentowanego przez texel, światło jest zasłonięte? Współrzędne tekstury są generowane przy użyciu różnych rzutowych teksturowania, w zależności od konkretnego algorytmu odwzorowywania cieni.

Teksturowanie rzutowe jest po prostu sposobem przekształcenia obiektu w przestrzeń tekstury (i tak, wiem, że to brzmi wstecz. Ale tak to działa). Algorytmy mapowania cienia wykorzystują kilka różnych rodzajów transformacji. Ale ostatecznie są to tylko przekształcenia z jednej przestrzeni w drugą.

Podczas renderowania mapy cienia bierzesz wierzchołki geometrii i transformujesz je za pomocą standardowego potoku renderowania. Ale kamera i matryce projekcyjne są zaprojektowane dla twojej pozycji światła i kierunku, a nie dla pozycji widoku i orientacji.

Podczas renderowania do przodu za pomocą mapy cienia renderujesz obiekt w normalny sposób, przekształcając wierzchołki w przestrzeń kamery widoku i za pomocą matrycy projekcji widoku. Przekształcasz jednak również wierzchołki przez kamerę światła i matryce projekcyjne, przekazując je jako dane dotyczące wierzchołków do modułu cieniującego fragmenty. Wykorzystuje je poprzez teksturowanie rzutowe, aby uzyskać dostęp do tekstury cienia.

Oto ważny punkt. Projekcyjny dostęp do tekstury został zaprojektowany w taki sposób, że miejsce, do którego uzyskuje dostęp do tekstury, reprezentuje kierunek między tym punktem na powierzchni (punktem renderowanym w module cieniującym fragmenty) a światłem. Dlatego pobiera tekst, który reprezentuje głębokość, na której dochodzi do okluzji renderowanego fragmentu.

Ale w tym rurociągu nie ma nic specjalnego . Nie musisz przekształcać pozycji wierzchołków w teksturę cienia i przekazywać je do modułu cieniującego fragmenty. Możesz przekazać pozycje wierzchołków przestrzeni świata do modułu cieniującego fragmenty, a następnie zmusić moduł cieniujący fragmentu do przekształcenia ich w przestrzeń rzutową tekstury cienia. To prawda, że ​​wyrzucilibyście dużo wydajności, ponieważ otrzymacie dokładnie te same współrzędne tekstury. Ale jest to matematycznie wykonalne.

Rzeczywiście, możesz przekazać pozycje wierzchołka przestrzeni kamery do widoku modułu cieniującego fragmenty. Może następnie przekształcić je w świat, następnie w jasną przestrzeń kamery, a następnie w rzutową przestrzeń tekstury cienia. Możesz umieścić całą tę transformację w jednej macierzy (w zależności od algorytmu projekcji cienia). Ponownie daje to dokładnie to, co miałeś wcześniej, więc przy renderowaniu do przodu nie ma powodu, aby to robić.

Ale w renderowaniu odroczonym masz już pozycje wierzchołków w przestrzeni kamery. Musisz, inaczej nie możesz zrobić oświetlenia. Albo zmarnowałeś dużo pamięci i przepustowości, pisząc je do bufora, albo byłeś mądry i ponownie obliczyłeś je za pomocą bufora głębokości i różnych obliczeń matematycznych (do których nie wchodzę tutaj, ale są omówione online).

Tak czy inaczej, masz widok pozycji kamery w przestrzeni. I, jak wspomniano powyżej, możemy zastosować macierz, aby przekształcić je z widoku przestrzeni kamery w rzutującą przestrzeń tekstury cienia. Więc ... zrób to. Następnie uzyskaj dostęp do swojej mapy cienia.

Problem rozwiązany.

Nicol Bolas
źródło
Czy można wykluczyć geometrię na światło w odroczonym renderowaniu (ze względu na optymalizację)?
Samaursa
@Samaursa: „Wykluczać geometrię na światło” z czego? Z przejścia do mapy cienia? Od bycia zapalonym?
Nicol Bolas
Widzę, że odpowiedziałeś na pytanie dotyczące tego, dziękuję. Dla innych, jeśli chcą postępować zgodnie z pytaniem / odpowiedzią: gamedev.stackexchange.com/q/178755/2287
Samaursa