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.