RENDERING W CZASIE RZECZYWISTYM Michał Radziszewski
Plan wykładu Rendering cieni wprowadzenie Cienie w grafice komputerowej Rendering off-line i rendering w czasie rzeczywistym Cienie rozmyte i ostre Mapy cieni dla różnych źródeł światła Zasada działania techniki Światła punktowe Światła kierunkowe Reflektory, latarki, itp.
Plan wykładu c.d. Filtrowanie map cienia Technika PCF (Percentage Closer Filtering) Mapy cienia oparte o wariancję Technika VSM (Variance Shadow Maps) Głębokie mapy cienia (ang. Deep Shadow Maps) Cienie od obiektów półprzeźroczystych Cienie wolumetryczne
Literatura L. Williams, Casting Curved Shadows on Curved Surfaces, SIGGRAPH 1978 W. Reeves i inni, Rendering Antialiased Shadows with Depth Maps, SIGGRAPH 1987 M. Bunnell, F. Pellacini, Shadow Map Antialiasing, GPU Gems, 2004 R. Fernando, Percentage-Closer Soft Shadows, NVIDIA R. Dimitrov, Cascaded Shadow Maps, NVIDIA 2007
Literatura c.d. W. Donnelly, A. Lauritzen, Variance Shadow Maps, SI3D 2006 T. Lokovic, E. Veach, Deep Shadow Maps, SIGGRAPH 2000 D. Filion, R. McNaughton, StarCraft II: Effects and Techniques, SIGGRAPH 2008 S. Rottger i inni, Shadow Volumes Revisited, WSCG 2002
Rendering cieni wprowadzenie Cienie pozwalają na zwiększenie realizmu oglądanych scen 3D Cienie stanowią też istotną wskazówkę odnośnie rozłożenia obiektów w przestrzeni Jest to szczególnie ważne gdy oglądamy obraz płaski, bez głębi To wszystko powoduje, że cienie są obowiązkowym elementem niemalże każdej aplikacji stosującej grafikę 3D, zarówno czasu rzeczywistego jak i offline
Cienie w grafice komputerowej W zaawansowanych algorytmach renderingu offline cienie są generowane automatycznie Cienie w śledzeniu promieni Cienie w metodzie energetycznej Istnienie cieni zakłada sam projekt algorytmów, ich usunięcie natomiast na ogół powoduje trudności, a często wręcz uniemożliwia poprawne działanie tych technik
Cienie w grafice komputerowej
Cienie w grafice komputerowej
Cienie w grafice komputerowej W grafice czasu rzeczywistego, opartej o schemat rasteryzacji trójkątów, w wersji podstawowej algorytmu cieni nie ma Algorytm ten można (i należy) rozszerzyć o rendering cieni Niestety jest to trudne, głównie ze względu na ograniczoną precyzję, i dość kosztowne obliczeniowo Kompromis: na scenie z kilkunastoma (kilkudziesięcioma) światłami tylko kilka z nich rzuca cienie
Cienie w grafice komputerowej
Cienie rozmyte i ostre Źródła światła w rzeczywistości mają pewne określone rozmiary i rozbieżność kątową Modele stosowane w grafice czasu rzeczywistego pomijają ten szczegół, który jest istotny z punktu widzenia poprawnego renderingu cieni Światła punktowe i reflektory zajmują punkt w przestrzeni Światła kierunkowe emitują promienie równoległe, bez rozbieżności kątowej
Cienie rozmyte i ostre c.d. Cienie rozmyte powstają w tych miejscach, w których światło jest częściowo zasłonięte Dokładnie: w tych punktach, w których rzut światła na sferę wokół punktu jest częściowo przesłonięty przez rzuty obiektów sceny na tą sferę Dotyczy to kąta bryłowego, pod jakim widać światło, więc nie ma to znaczenia, czy światło jest kierunkowe, czy znajduje się na scenie W obu przypadkach modele świateł w grafice czasu rzeczywistego generują rzut w postaci punktu
Cienie rozmyte i ostre c.d. Punkt nie może być częściowo zasłonięty, więc bez specjalnych chwytów i sztuczek wszystkie cienie miałyby ostre krawędzie Założenia uwzględniane przy różnych chwytach: Cienie powinny być ostre blisko obiektu rzucającego cień Wraz ze wzrostem odległości i wielkości rzutu światła na sferę cienie powinny być coraz bardziej rozmyte Ze względu na koszt obliczeniowy, często rozmycie jest niezależne od odległości od obiektu rzucającego cień
Cienie rozmyte i ostre c.d.
Cienie rozmyte i ostre c.d.
Mapy cieni Aby obliczyć stopień zacienienia danego punktu, oprócz danych źródła światła, potrzebne są jeszcze informacje o wszystkich innych obiektach na scenie Informacje takie są dostępne w renderingu off-line Niestety nie są one dostępne w grafice czasu rzeczywistego opartej o algorytm rasteryzacji Technika: minimalny zbiór danych potrzebny do renderingu cieni zapisywany jest w teksturze, tzw. mapie cienia, która jest następnie uwzględniana w trakcie renderingu
Mapy cieni generacja Teksele mapy cienia dla danego źródła światła przechowują odległości odpowiadających im punktów na scenie od tego źródła światła Aby wygenerować mapę cienia należy wykonać rendering sceny z punktu widzenia źródła światła Test głębi musi być aktywny Wyjściem programu fragmentów jest wyłącznie odległość od źródła światła Mapa cienia będzie zawierać odległości najbliższych obiektów licząc od źródła światła
Mapy cieni rendering Mapa cienia jest dodatkową teksturą na każde źródło światła uwzględniane w trakcie jednego przebiegu W czasie renderingu należy policzyć odległość cieniowanego w danej chwili punktu od źródła światła Jeżeli ta odległość jest większa niż odległość zapisana w mapie cienia, to punkt jest w cieniu W przeciwnym wypadku jest oświetlony
Mapy cieni projekcja Aby wygenerować mapę cienia należy odpowiednio dobrać macierz projekcji i teksturę do typu i parametrów źródła światła Te parametry trzeba też uwzględnić przy odczycie z mapy cienia Błędnie dobrane parametry projekcji mogą znacznie pogorszyć dokładność albo nawet uniemożliwić poprawne działanie tej techniki
Mapy cieni: światła punktowe Mapa cienia jest teksturą sześcienną Konieczne jest 6 przebiegów renderingu, po jednym na każdą ścianę Macierz widoku: Pozycja taka jak źródła światła, Kierunek do przodu wzdłuż jednej z 6 osi, Kierunek w górę ze specyfikacji mapy sześciennej Macierz projekcji: Kąty /2 w pionie i poziomie
Mapy cieni: światła kierunkowe Mapa cienia jest zwykłą teksturą 2D Macierz widoku: Pozycja dowolny punkt, np. środek sceny, najprościej punkt (0, 0, 0) Kierunek do przodu kierunek światła Kierunek do góry dowolny Macierz projekcji Projekcja ortogonalna Skala i przesunięcie dobrane tak, aby objąć całą scenę
Mapy cieni: światła kierunkowe Macierz projekcji obejmującej całą (potencjalnie bardzo dużą) scenę, wraz z mapą cienia o względnie małej rozdzielczości powoduje potencjalne problemy z precyzją metody Technika kaskadowych map cienia rozwiązanie trudności Temat jednego z projektów, metoda nie będzie omawiana na wykładzie
Mapy cieni: reflektory Światła punktowe, które świecą w ograniczonym stożku wokół kierunku światła Jeżeli rozwartość stożka jest wyraźnie większa niż /2 można traktować reflektor podobnie jak światło punktowe, z kierunkiem światła w macierzy widoku Poprawia to precyzję, jednak kosztem ilości obliczeń 5 przebiegów renderingu zamiast jednego 6. przebieg (tył) nie jest potrzebny
Mapy cieni: reflektory Mapa cienia jest zwykłą teksturą 2D Macierz widoku: Pozycja taka jak źródła światła, Kierunek do przodu kierunek światła Kierunek do góry dowolny Macierz projekcji: Kąty równe rozwartości kątowej stożka światła
Mapy cieni przesunięcie głębi Mapa cieni przechowuje dane wektorowe Dane te są zapisane w formacie rastrowym utrata precyzji ze względu na ograniczoną rozdzielczość map cienia Na skutek utraty precyzji renderowana powierzchnia może niepoprawnie rzucać cień sama na siebie Aby zminimalizować ten problem stosuje się tzw. przesunięcie głębi (ang. depth bias)
Mapy cieni przesunięcie głębi Dobranie wartości przesunięcia głębi Zbyt mała wartość nie usuwa niewłaściwego zacieniania Zbyt duża powoduje efekt oderwania cieni od obiektów, które je rzucają Może okazać się, że akceptowalne wartości są różne w różnych punktach sceny Wartości te można uzależnić od kąta padania światła na płaszczyznę mapy cienia może to nieco pomóc w ominięciu ww. trudności
Mapy cieni przesunięcie głębi
Mapy cieni przesunięcie głębi
Filtrowanie map cienia Sprawdzanie tylko i wyłącznie czy obiekt jest w cieniu czy nie powoduje ostre krawędzie cieni Zbyt duża rozdzielczość mapy cienia względem rozdzielczości ekranu powoduje aliasing Konieczne jest filtrowanie map cieni Niestety filtrowanie przez GPU nie daje oczekiwanych wyników GPU: result = threshold < filter(shadow_map) Potrzebne: result = filter(threshold < shadow_map)
Filtrowanie map cienia c.d. Technika PCF (Percentage Closer Filtering) jest stosowana w celu zgodnego z oczekiwaniami filtrowania map cienia W wersji podstawowej tworzy gładkie krawędzie cieni, jednak ich rozmycie nie zależy od odległości do obiektu rzucającego cień Uśrednianie wartości logicznych wyników porównania głębi dla sąsiednich tekseli Konieczne dużo odczytów z tekstury, koszt obliczeniowy
Technika PCSS Technika PCSS (Percentage Closer Soft Shadows) rozmycie zależne od odległości obiektu rzucającego cień od źródła światła Rozmycie cienia zależy od zasięgu filtrowania mapy cienia techniką PCF trzeba odpowiednio dobrać ten zasięg Algorytm wymaga takich samych map cienia jak PCF, różnica jest jedynie w cieniowaniu obiektów
Technika PCSS c.d. Algorytm cieniowania: Znalezienie odległości cieniowanego punktu od obiektu blokującego światło (d b ) uśrednianie (filtrowanie) wartości sąsiednich tekseli biorąc pod uwagę tylko odległości bliższe niż cieniowany punkt Oszacowanie wielkości rozmycia cienia (w r ) w r = (d c d b )w s / d b, gdzie w s rozmiar źródła światła, a d c odległość cieniowanego fragmentu od źródła Rozmycie techniką PCF stosując znormalizowane w r jako rozmiar filtru
Filtrowanie map cienia c.d.
Mapy cienia oparte o wariancję Użycie sprzętowego filtrowania tekstur map cienia zamiast programowego filtrowania wyników porównań z głębokością progową Przechowywanie uproszczonej informacji o rozkładzie głębi na każdym tekselu Potrzebne dwie liczby do zapisu głębi Wartość głębi (M 1 ) Wartość głębi podniesiona do drugiej potęgi (M 2 )
Mapy cienia oparte o wariancję Rendering cieni Działanie algorytmu aproksymacja na podstawie statystyki matematycznej Średnia: = M 1 Wariancja: 2 = M 2 M 1 2 Jeżeli odległość od światła bieżącego fragmentu jest mniejsza niż średnia ( ), to obiekt nie jest w cieniu W przeciwnym wypadku współczynnik zacienienia obliczany jest jako p = 2 /( 2 + ( d) 2 ), gdzie d jest odległością cieniowanego fragmentu od światła
Mapy cienia oparte o wariancję
Mapy cienia oparte o wariancję Działanie techniki opiera się na różnicy pomiędzy wartością filtrowaną podniesioną do kwadratu, a wartością podniesioną do kwadratu, a następnie filtrowaną Rozmycie cieni zależy od wielkości filtra Niestety, technika ta jest jedynie aproksymacją Wadą są tzw. Wycieki światła Bardziej skomplikowane implementację minimalizują tę wadę, ale jej nie usuwają całkowicie
Mapy cienia oparte o wariancję
Głębokie mapy cienia Użyteczne dla cieni od obiektów typu magła, dym oraz włosy, futro, itp. Dla tych obiektów kluczowe jest rzucanie cienia na samego siebie Przechowują widoczność poprzez teksele dla wszystkich wartości głębi Dla każdego teksela przechowywana jest linia łamana widoczność jako funkcja głębi Istotna jest kompresja informacji ograniczenie ilości wierzchołków linii łamanej
Głębokie mapy cienia
Głębokie mapy cienia
Cienie od obiektów półprzeźroczystych
Cienie od obiektów półprzeźroczystych Użycie drugiej mapy cienia i buforu koloru Rendering do pierwszej mapy cienia obiektów nieprzeźroczystych, tak samo jak bez tej techniki Rendering do drugiej mapy cienia obiektów półprzeźroczystych Bufor koloru czyszczony kolorem białym Rendering do buforu koloru obiektów półprzeźroczystych, używając pierwszej mapy cienia jako buforu głębi
Cienie od obiektów półprzeźroczystych Rendering cieni: Jeżeli obiekt jest w cieniu od obiektu nieprzeźroczystego, to oświetlenie mnożone jest przez odpowiednio wyliczony współczynnik zacienienia Jeżeli obiekt jest w cieniu od obiektów półprzeźroczystych, to oświetlenie mnożone jest przez kolor z buforu koloru związanego z mapą cienia mieszanego z kolorem białym, przy pomocy analogicznie wyliczanego współczynnika zacienienia
Cienie od obiektów półprzeźroczystych
Cienie wolumetryczne Potrzebny jest wypełniony bufor głębi Rendering oświetlenia i cieni wykonywany w drugim przebiegu Pozycja światła i wszystkie trójkąty sceny tworzą obcięte ostrosłupy trzy czworokąty na każdy trójkąt Rendering czworokątów cieni z zastosowaniem buforu szablonu oraz testem głębi
Cienie wolumetryczne Rendering ścian zwróconych przodem do obserwatora zwiększa licznik szablonu o 1 Rendering ścian zwróconych tyłem do obserwatora zmniejsza licznik szablonu o 1 Fragment jest zacieniony, jeżeli jego licznik szablonu jest równy jeden po zakończeniu renderingu czworokątów cienia
Cienie wolumetryczne
Cienie wolumetryczne Problem z przycinaniem geometrii bardzo blisko i bardzo daleko od kamery, istnieją rozwiązania Metoda mało wydajna bardzo dużo figur do renderingu, wąskim gardłem staje się prędkość wypełniania GPU Są opracowane pewne optymalizacje, Ale na ogół preferowane są metody oparte o mapy cienia, obecnie one wydaje sie być najlepsze
Dziękuję za uwagę