Obsługa aliasów projekcyjnych w mapowaniu cieni

15

Bawię się prostym proceduralnym modelowaniem 3D, aby stworzyć malutkie budynki do drukowania 3D. Przykład:

Budynek


Aby modele były bardziej czytelne na ekranie, zaimplementowałem podstawowe mapowanie cieni dla pojedynczego światła kierunkowego. Ponieważ moja scena się nie zmienia, po prostu renderuję mapę cienia za pomocą wyrównanego do osi pola sceny, aby dowiedzieć się, jakie powinny być granice mapy cienia. Cienie i granice wyglądają tak, jakby wszystkie macierze były prawidłowe, ale przybliżenie się wygląda okropnie:

Zbliżenie wieży

Z lektury, którą wykonałem, rozumiem panoramowanie Petera i co mogę z tym zrobić, ale poszarpane krawędzie, które moim zdaniem są formą aliasingu projekcyjnego, wyglądają tak źle, że myślę, że coś jest nie tak z moją podstawową implementacją.

Zhakowałem moduł cieniujący piksele, aby pokazać granice teksli:

Pokazywanie granic Texela

Mam dwuliniowe filtrowanie w teksturze (bez tego mam poważny trądzik w cieniu). Niestety, moja próba PCF również się nie powiodła - wygląda na równie nierówną:

wprowadź opis zdjęcia tutaj

Oto przykładowy przypadek z wyłączonym filtrowaniem dwuliniowym:

wprowadź opis zdjęcia tutaj

Czy to wygląda jak „typowe” aliasing projekcyjny? Czy dynamiczne renderowanie mapy cienia przy użyciu fragmentu widoku przyciętego do sceny, być może z kaskadowaniem, może rozwiązać ten problem?

Edycja: Dodając zbliżenie do filtrowania dwuliniowego, porównuj cienie, aby pokazać, co otrzymuję. Trądzik zły cień pojawia się z powodu wewnętrznych krawędzi; Modeluję ze stosami wirtualnych bloków i nie wykonuję poprawnej operacji łączenia. Z mojego czytania, implementowanie operacji logicznych na wielościanach nie jest trywialne, ale pozwoli mi również na implementację statycznych woluminów cienia, a także oczyszczenie niektórych programów do drukowania 3D.

Filtrowanie dwuliniowe

Daniel M. Gessel
źródło

Odpowiedzi:

10

Mapowanie cieni o akceptowalnej jakości to niezła podróż. Więc wdrożyłeś pierwszy krok - podstawową mapę cienia, która statycznie obejmuje całą scenę. Oznacza to, że rozmiar tonu mapy cienia w jasnej przestrzeni widoku do rozmiaru teksla renderowanej sceny w przestrzeni widoku kamery jest dość duży, co powoduje aliasing. Aby zmniejszyć ten stosunek bliżej 1: 1, wspomniałeś o technikach takich jak:

  • najłatwiejszym sposobem jest zwiększenie rozmiaru mapy cienia, aby znaleźć wartość przy wciąż optymalnej wydajności,
  • wyrównaj mapę cieni z frustum widoku z kamery. Następnie mapa cienia obejmuje mniejszą część sceny, więc zmniejsza aliasing,
  • można to ulepszyć do CSM, który robi to samo, ale trzeba renderować scenę dla każdej kaskady z różnym położeniem środkowym matrycy widoku światła w oparciu o punkt środkowy każdego wycinka frustum.

Niektóre podstawowe techniki wygładzania krawędzi cienia:

  • oczywiście PCF, ale zaleca się połączenie implementacji PCF z wbudowanym sprzętowym PCF (w Opengl - za pomocą sampler2DShadow). Spowodowałoby to mniej iteracji pętli z Twojej strony i tańszy PCF,
  • blokowanie krawędzi można wymienić na hałas za pomocą obróconego dysku Poissona. Próbki użyte do próbkowania z mapy cienia są obracane losowo przy każdej iteracji pętli PCF.

Możesz także zbadać techniki wygładzania krawędzi, takie jak:

Podstawowa technika PCF cierpi na trądzik w cieniu, który można naprawić poprzez zastosowanie przesunięcia w teście cienia. Obliczanie wielkości tego przesunięcia jest również obszarem badań .

Inne bardziej zaawansowane metody mapowania cieni obejmują:

  • Exponential Shadow Maps i Variance Shadow Maps - w większości przypadków nie cierpią na trądzik w cieniu i oferują gładkie krawędzie bez blokowania, ale kosztem niektórych lekkich przecieków,
  • Wykładnicza zmienność map cieni - prawdopodobnie najbardziej zaawansowana technika mapowania cieni w mapach głębi 2D, łączy w sobie doskonałą płynność VSM i eliminuje wycieki światła, a koszt podwojenia zużycia pamięci,
  • Percentage Closer Soft Shadows - podstawowa technika ulepszania tradycyjnych map cieni o różnych rozmiarach półcienia,
  • Multiview Shadow Maps - wiele map cieni niektórych technik, rozmieszczonych na świetle obszarowym, do obliczania realistycznych miękkich cieni o różnych rozmiarach półcienia,
  • Deep Shadow Maps - do zwiększenia rozproszenia wolumetrycznego z cieniami,
  • Promienie śledzone w czasie rzeczywistym - prawdopodobnie przyszłość.

Nie zawiodłeś z PCF, tak to wygląda :)

Chciałbym, aby istniał sposób na zastosowanie rozmycia gaussowskiego na mapie cienia w przestrzeni widoku kamery, ale nie działa zgodnie z oczekiwaniami.

narthex
źródło
Częścią tego komentarza jest podziękowanie za twoją odpowiedź, więc pomyślałem, że dam ci znać, ponieważ nie dostaniesz od tego powiadomienia.
trichoplax
Tak, widziałem to, ale dziękuję.
narthex,
1

Powiedziałeś, że „… filtrowanie dwuliniowe w teksturze…”. Wygląda na to, że interpolujesz wartości głębokości mapy cienia. Prawidłowym sposobem użycia interpolacji z mapą cienia jest zastosowanie jej do wyników testów cienia (o ile pamiętam, OpenGL to obsługuje). Możesz nawet połączyć interpolację wyników testów cienia z PCF, co zapewni znacznie lepsze wyniki. Jak jednak zauważyłeś, aliasing to plaga, która zawsze dąży do mapowania cieni :)

Chociaż rozumiem, że szukasz rozwiązań dotyczących mapowania cieni (nawet ponieważ jest to dość proste do wdrożenia), czy zastanawiałeś się kiedyś nad użyciem woluminów cienia? Jest o wiele bardziej skomplikowany do wdrożenia, ale w ogóle nie cierpi na aliasing, i myślę, że pasowałby dobrze do twoich celów.

Christian Pagot
źródło
Dziękuję bardzo za odpowiedzi! Aby uzyskać wyniki, których szukam, może być właściwe przejście na woluminy cienia. Link do kodu przepływu pod „interpolacją” jest bardzo przydatny - dzięki!
Daniel M Gessel,