Michał Drobot Technical Art Director Reality Pump Shadowing Michał Drobot Technical Art Director Reality Pump
Plan wykładu Charakterystyka cienia Algorytmy cieni Shadow Volumes Shadow Mapping
Cień Cień powstaje w wyniku przesłonięcie źródła światła przez okluder Miejsce, do którego nie dociera światło Jest naturalny dla człowieka Ważny element naszej wizji człowieka Ułatwia pozycjonowanie obiektów w przestrzeni Ocena odległości obiektu od powierzchni Ocena odległości źródła światła od obiektu Rodzaju materiału, z którego wykonano obiekt Ocena charakterystyki światła
Cień Pozycjonowanie obiektu Odległość obiektu od płaszczyzny Cienie kontaktowe
Cień Ocena odległości źródła światła od obiektu
Cień Ocena odległości źródła światła od obiektu
Cień Ocena materiału z którego wykonano obiekt przesłaniający Kolorowe szkło, wosk, skóra, mat przeźroczyste
Cień Ocena charakterystyki źródła światła Punktowe, obszarowe (wielkość, stosunek wielkości do obiektów)
Cień Umbra – obszar znajdujący się w cieniu całkowitym Penumbra – obszar znajdujący się w półcieniu Umbra Penumbra
Cień
Algorytmy Rzutowanie płaszczyzn Śledzenie promieni Stencil shadows , Shadow Volumes Śledzenie promieni Raytracing Porównywanie głębi Z Shadow mapping
Shadow Volumes Potraktujmy cienie jako bryły przestrzenne Cień jako bryła jest obiektem, w którym nie jest niesione światło dla danego źródła Punkt światła Bryła cienia Trójkąt rzucający cień
Shadow Volumes
Shadow Volumes
Shadow Volumes Generacja Shadow Volume’ów Zrzutuj promień od światła, przez każdy vertex w nieskończoność Zrzutowane wektory/vertexy utworzą bryłę cienia Interesującą nas częścią okludera jest jedynie jego sylwetka Znajdź sylwetkę z punktu widzenia światła Rozciągnij ją w nieskończoność OD światła W zależności od algorytmu zamknij bryłę (cap)
Shadow Volumes Podczas tworzenia shadow volume’a Prześlij każdą krawędź obiektu jako zdegenerowany quad Znajdź w VS krawędzie (poprzez dot product) Odpowiednie 2 vertex’y przemieść w nieskończoność wzdłuż wektora od światła Pozostałe będą dalej zdegenerowane i zostaną wyrzucone z potoku renderowania Front/Back – cap tworzą front/back face’y przesunięta na odpowiednią odległość (clip plane/far plane/nieskończoność)
Shadow Volumes Ogólny algorytm oświetlania z cieniami Wypełnij Z-buffer sceny Zaznacz miejsca na obrazie w których występuje cień poprzez rasteryzacje shadow volume’ów Użyj stencil buffera Korzystając z gotowej informacji wyrenderuj scenę (np.): Pierwszy pass – ambient light (zapełnia z-buffer, krok 1) Drugi pass – oświetlenie korzystając z informacji o cieniu Ewentualnie światła deferred przycięte volume’ami, bądź odczytujące wartość cienia z textury
Shadow Volumes Oświetlone płaszczyzny mają 0 w stencilu Depth Pass Wyłącz pisanie do Z i koloru Ustaw back-face culling Ustaw stencil na inkrementacje przy depth pass Tylko volume’y przed obiektem Wyrenderuj shadow volume’y Tylko front-face’y brył Ustaw front-face culling Ustaw stencil na dekrementację przy depth pass Tylko back-face’y brył Oświetlone płaszczyzny mają 0 w stencilu
Shadow Volumes Depth Pass Problematyczny jeśli kamera jest wewnątrz bryły cienia Błędny wynik cieniowania W tym wypadku najprostszą metodą jest przełączyć się na Depth Fail
Shadow Volumes Oświetlone płaszczyzny mają 0 w stencilu Depth Fail Wyłącz pisanie do Z i koloru Ustaw front-face culling Ustaw stencil na inkrementacje przy depth fail Tylko volume’y za obiektem Wyrenderuj shadow volume’y Tylko back-face’y brył Ustaw back-face culling Ustaw stencil na dekrementację przy depth fail Tylko front-face’y brył Oświetlone płaszczyzny mają 0 w stencilu
Shadow Volumes Wymaga back-cap’owania bryły Depth Fail Ze względu na rasteryzację uznawany za wolniejszy W zamian za brak problemów wewnątrz bryły Wymaga back-cap’owania bryły Inaczej cień nie zostanie znaleziony tam gdzie punkty bryły odchodzą do nieskończoności
Shadow Mapping Shadow mapping Konceptualnie cieniowanie traktujemy jako problem widoczności Punkt znajdujący się w cieniu Światło nie widzi punktu Oko widzi punkt Punkt znajdujący się w świetle Światło widzi punkt
Shadow Mapping Metoda w pełni w przestrzeni obrazu Opiera się na porównawczym teście widoczności Widok światła jest renderowany do textury głębi (shadow map) Scena jest renderowana normalnie z punktu widzenia oka Dla każdego punktu wykonywane jest porównanie głębi punktu w przestrzeni światła między punktem renderowanym (przetransformowanym przez odpowiednią macierz) z punktem zapisanym w shadow mapie Metoda w pełni w przestrzeni obrazu Nie wymaga wiedzy o geometrii sceny
Shadow Mapping Opiera się na porównawczym teście widoczności Widok światła jest renderowany do textury głębi (shadow map) Scena jest renderowana normalnie z punktu widzenia oka Dla każdego punktu wykonywane jest porównanie głębi punktu w przestrzeni światła między punktem renderowanym (przetransformowanym przez odpowiednią macierz) z punktem zapisanym w shadow mapie
Shadow Mapping Zalety Nie wymaga stencil buffera W wielu przypadkach jest szybszy ze względu na rasteryzację oraz mniejszą liczbę operacji transformacji Umożliwia generowanie cieni z alpha-testowanych textur Umożliwia łatwą integrację miękkich cieni (penumbra shadows / soft shadows) Umożliwia tworzenie cieni transparentnych Ma uzasadnienie praktyczno wydajnościowe w scenach otwartych (oświetlenie słoneczne) Umożliwia łatwą integrację z projekcją textur
Shadow Mapping Wady Mniej dokładna od Shadow Volume’ów Metoda rasteryzacji zamiast operacji geometrycznej Problem z aliasingiem ze względu na dyskretyzację shadow mapy Rozdzielczość Zajętość pamięci shadow mapą dla każdego światła Problem renderowania świateł o dużych kątach oświetlania Point light = kilka shadow map
Shadow Mapping Wady Mniej dokładna od Shadow Volume’ów Metoda rasteryzacji zamiast operacji geometrycznej Problem z aliasingiem ze względu na dyskretyzację shadow mapy Rozdzielczość Zajętość pamięci shadow mapą dla każdego światła Problem renderowania świateł o dużych kątach oświetlania Point light = kilka shadow map
Shadow Mapping Wyrenderuj do textury z-buffer z punktu widzenia światła Shadow mapa używana później Zawiera rodzaj 2D funkcji oznaczającej odległość najbliższych do światła punktów W podstawowej wersji odległość Z Wyrenderuj scenę z punktu widzenia oka Dla każdego pixela Zdefiniuj pozycję XYZ pixela w przestrzeni światła Powinna się zgadzać z parametrami wg. Jakich została stworzona shadow mapa Dokonaj testu porównawczego
Shadow Mapping Test porównawczy Dwie wartości A = wartość Z z shadow mapy (z punktu XY pixela w przestrzeni światła) B = wartość Z punktu XYZ pixela w przestrzeni światła Jeśli B > A to znaczy, że istnieje punkt obiektu będącego bliżej światła niż cieniowany pixel Pixel jest w cieniu Jeśli A ~~ B to znaczy, że pixel jest oświetlony
Shadow Mapping B > A depth map image plane depth map Z = A light source eye position eye view image plane, a.k.a. the frame buffer fragment’s light Z = B
Shadow Mapping B ~A depth map image plane depth map Z = A light source eye position eye view image plane, a.k.a. the frame buffer fragment’s light Z = B
Shadow Mapping Precyzja shadow mapy może się różnić od precyzji bufora, do którego generujemy cień Dochodzi do pomyłek w szacowaniu Artefaktów Widocznego aliasingu Pixelozy na krawędzi cienia
Shadow Mapping Copyright by nvidia
Shadow Mapping
Shadow Mapping
Shadow Mapping Shadow bias Problem wynikły z dyskretyzacji Błędne samo-cieniowanie płaszczyzn Objawia się tzw. Shadow ackne tworząc efekt Moire’a Zapisywaną głębie do shadow mapy należy przesunąć o ‘małą’ wartość Na tyle dużą by uniknąć błedów Na tyle małą, żeby cień nie odszedł za daleko od obiektu Można dobrać ręcznie Istnieją algorytmy, które dobierają ją optymalnie w czasie rzeczywistym względem danego pixela
Shadow Mapping Bias Bias
Shadow Mapping
Shadow Mapping Shadow mapa Musi być generowana z każdą zmiana światła Musi być generowana z każda zmianą obiektów rzucających cień W zależności od algorytmu może być niezależna od ruchu oka Problem doboru projekcji przy konstrukcji macierzy światła Problem doboru shadow casterów oraz frustum Problem undersamplingu Problem filtrowania
Shadow Mapping Problem doboru projekcji przy konstrukcji macierzy światła Dla świateł punktowych bądź typu spot używamy projekcji perspektywicznej szerokiej wg kąta oświetlenia światła Efektywnie do 90* Dla świateł szerszych można rozważyć projekcje Point light = 6 * projekcja 90 = cubemap Ewentualnie możliwe projekcje wrap : sphere mapping, paraboloid mapping Dla świateł kierunkowych (słońce) używamy zaawansowanych projekcji Ortogonalna Projekcje wrapujące ze względu na zwiększenie jakości
Shadow Mapping Dobór obiektów Obiekty, które będą wyrenderowane do shadow mapy Są oznaczone jako shadow casting Np. ze względu na wielkość (automatycznie odrzucamy zbyt małe obiekty których wielkość na shadow mapie będzie mniejsza niż n pixeli – w szczególności <1) Znajdują się w light frustum wyznaczonym Przez macierz światła Przyciętym na far przez frustum oka Przyciętym na near na pierwszy shadow castujący obiekt
Shadow Mapping Wyznaczenie near plane W zależności od sytuacji możemy wybrać near plane tuż przy świetle Może mieć dramatyczny efekt w skomplikowanych scenach Np. teren podczas gdy słońce jest nisko Możemy odrzucać obiekty po funkcji wielkości bounding boxów oraz kąta padania światła Specyficzne sytuacje Możemy zrzutować wierzchołki bounding boxów wg macierzy światła i sprawdzić przecięcie z view frustrum Jęsli przecięcia nie będzie, oznacza to, że mamy pewność nie zobaczenia cieni przez oko
Shadow Mapping Problem undersamplingu Występuje gdy w wyniku różnic perspektywy bądź projekcji wielkość potencjalnego pixela shadow mapy jest mniejsza niż pixela płaszczyzny na która generujemy cień d > di ds * rs / ri – perspektywa cosb/cosa - projekcja
Shadow Mapping Undersmapling rozwiązywany Zwiększanie rozdzielczości shadow mapy Mało wydajne na pixel (duże marnotrawstwo) Zmiany projekcji wymuszające większą rozdzielczość w bardziej potrzebnych miejscach Trapezoidal mapping Perspective mapping Podział frustrum oka na części obsługiwane przez różne shadow mapy o różnej charakterystyce (dalsze mniejsza rozdzielczość) Podział frustrum światła wg podziału frustrum oka Podział ze względu na optymalizacje rozdzielczości analitycznej shadow mapy Parametryzowalne przez ilosc podzialow jak I rozdzielczosc poszczegolnych shadow map
Shadow Mapping
Shadow Mapping Problem filtrowania Shadow mapa nie może być filtrowana standardowo tak jak zwykłe tekstury Da to błędny wynik Ze względu na dyskretyzacje filtrowanie jest potrzebne Wykonuje się je przy użyciu filtra PCF Ręcznie Sprzętowo dla obszaru 2x2 pixele Ręcznie dla tworzenia miękkich cieni oraz penumbra shadows
Shadow Mapping
Shadow Mapping
Shadow Mapping
Shadow Mapping Problem filtrowania Shadow mapping wykonujemy przy użyciu kilku sampli z shadow mapy Najpierw wyliczamy potem filtrujemy Wsparcie sprzętowe tex2Dproj, fetch4 itp. Zależne od sprzętu Filtrowanie poprawia wygląd, błędy aliasingu //Projected coords projCoords = oTex1.xy / oTex1.w; //Sample nearest 2x2 quad shadowMapVals.r = tex2D(ShadowSampler, projCoords ); shadowMapVals.g = tex2D(ShadowSampler, projCoords + texelOffsets[1].xy * g_vFullTexelOffset.xy ); shadowMapVals.b = tex2D(ShadowSampler, projCoords + texelOffsets[2].xy * g_vFullTexelOffset.xy ); shadowMapVals.a = tex2D(ShadowSampler, projCoords + texelOffsets[3].xy * g_vFullTexelOffset.xy ); //Evaluate shadowmap test on quad of shadow map texels inLight = ( dist < shadowMapVals); //Percent in light percentInLight = dot(inLight, float4(0.25, 0.25, 0.25, 0.25) );
Shadow Mapping Problem filtrowania Poszukiwanie innych funkcji zapisu odległości, umożliwiających przefiltrowanie przed operacją porównywania Zastąpienie prostej funkcji zapisu głębi i porównania na funkcję separowalną i liniową ze względu na operacje filtrowania Niektóre sprawdzone rozwiązania VSM – Variance Shadow Mapping – bazują na zapisie wariancji i koowariancji, które podlegają filtrowaniu ESM – Exponential Shadow Maps – bazują na szeregach funkcji exponencialnych, podległych filtrowaniu
Podsumowanie For more information contact me hello@drobot.org Slides will be available at Drobot.org
Questions ?