RENDERING W CZASIE RZECZYWISTYM Michał Radziszewski
Plan wykładu Opóźnione cieniowanie wprowadzenie Koszt obliczeniowy cieniowania Cieniowanie jedno- i wieloprzebiegowe Cieniowanie opóźnione Schemat opóźnionego cieniowania Rendering, bufory G (Geometric Buffers) Przechowywane dane, odtwarzanie pozycji Obliczanie oświetlenia
Plan wykładu c.d. Przeźroczystość Obliczana po przebiegu cieniowania opóźnionego Technika depth peeling w cieniowaniu opóźnionym Listy fragmentów na piksel Antyaliasing Algorytm podstawowy zwielokrotnienie tekseli Antyaliasing oparty o wykrywanie krawędzi Technika Light Pre-Pass
Literatura O. Shishkovtsov, Deferred shading in S.T.A.L.K.E.R., GPU Gems 2, 2005 R. Koonce, Deferred Shading in Tabula Rasa, GPU Gems 3, 2007 M. Valient, Deferred Rendering in Killzone 2, Develop Conference, 2007 W. Engel, The Light Pre-Pass Renderer, ShaderX7, 2008
Literatura c.d. A. Reshetov, Morphological Antialiasing, High Performace Graphics 2009 V. Biri i inni, Practical morphological antialiasing on the GPU, SIGGRAPH 2010
Opóźnione cieniowanie wprowadzenie Sceny ze współczesnych gier komputerowych zawierają wiele obiektów oraz są oświetlone dużą ilością świateł Powoduje to problemy z wydajnym obliczaniem oświetlenia Podobne trudności powstają przy stosowaniu map cieni do wielu świateł jednocześnie
Opóźnione cieniowanie wprowadzenie W grafice czasu rzeczywistego obecnie stosowane są trzy podejścia Rendering jednoprzebiegowy z wieloma źródłami światła Rendering wieloprzebiegowy ze z góry ograniczoną ilością świateł na przebieg Cieniowanie opóźnione oświetlenie obliczane w postprocesie
Opóźnione cieniowanie wprowadzenie Cieniowanie opóźnione znacznie obniża koszt obliczania oświetlenia Niestety wprowadza też pewne niedogodności Obiekty półprzeźroczyste cieniowanie zwykłe albo np. rendering z listami fragmentów na piksel Antyaliasing wymaga bardzo dużo pamięci Własności materiału (matowy, połyskliwy, itp.) zawarte w programie liczącym oświetlenie scena nie może zawierać zbyt wielu różnych materiałów
Koszt obliczeniowy cieniowania Rendering jednoprzebiegowy Wielokrotne cieniowanie tych samych pikseli (tzw. overdraw ) Konieczność zapamiętania wszystkich map cienia jednocześnie brak pamięci VRAM Rendering wieloprzebiegowy Nie ma problemu z mapami cienia Jeszcze większy koszt obliczeniowy wielokrotne wykonanie programów wierzchołków Koszt = ilość obiektów * ilość świateł
Koszt obliczeniowy cieniowania Cieniowanie opóźnione Rendering tylko zapisanie informacji potrzebnych do cieniowania, ale bez cieniowania, niezależność kosztu od ilości świateł Koszt obliczania oświetlenia (postporces) jest niezależny od ilości obiektów na scenie Nie ma problemów z mapami cienia Koszt = ilość obiektów + ilość świateł
Schemat opóźnionego cieniowania W pierwszym przebiegu renderowane są wszystkie obiekty sceny, bez uwzględnienia oświetlenia Wyjściem jest pozycja, normalna, kolor matowy, kolor połyskliwy, i w razie potrzeby inne parametry Mapowania nierówności i przemieszczeń są wykonywane w pierwszym przebiegu zapisana normalna jest bezpośrednio używana do obliczania oświetlenia
Schemat opóźnionego cieniowania Następnie wykonywane są kolejne przebiegi, po jednym dla każdego światła Przebiegi te na wejściu otrzymują wyłącznie obrazy 2D, pomijane są pozostałe informacje o scenie Wejściem przebiegów oświetlenia są: Wyjścia pierwszego przebiegu W razie potrzeby mapa cienia (dla jednego światła) Wejściem może być też lista fragmentów zamiast obrazów 2D obiekty półprzeźroczyste
Schemat opóźnionego cieniowania Wyjściem jest obraz oświetlony tylko i wyłącznie przez renderowane w danym przebiegu światło Przebiegi oświetlenia zapisują wyniki do tekstury, używając dodawania jako trybu mieszania alfa, tak aby nie nadpisać poprzednich wyników Tekstura może być w formacie zmiennoprzecinkowym łatwe dodanie techniki HDR Początkowo zwykle tekstura czyszczona jest kolorem czarnym
Bufory G (G-Buffers)
Bufory G (G-Buffers)
Bufory G (G-Buffers)
Bufory G (G-Buffers)
Bufory G (G-Buffers)
Bufory G (G-Buffers)
Bufory G (G-Buffers) Przechowują dane niezbędne do oświetlenia Pozycja, normalna Kolory matowy i w razie potrzeby połyskliwy Być może też inne dane w przypadku stosowania bardziej zaawansowanych modeli oświetlenia Problemem jest zajętość pamięci i przepustowość GPU VRAM Konieczność dobrania odpowiedniego formatu tekstury do wymaganej precyzji
Bufory G c.d. Format IEEE float 32 prawie zawsze jest zbyt kosztowny obliczeniowo i pamięciowo Najprościej jest zastosować format float 16 (half) Można też eksperymentować z innymi formatami, jeszcze bardziej ograniczając zużycie pamięci kosztem minimalnej utraty precyzji Opłaca się też odrzucić część danych, które będzie można potem odtworzyć Obecnie proste obliczenia są tańsze niż użycie pamięci
Bufory G c.d. Zapis pozycji można ograniczyć tylko do głębi Mając głębię, współrzędne fragmentu i macierz projekcji można odtworzyć pozycję w przestrzeni widoku W przypadku cieniowania w przestrzeni widoku można pominąć składową Z normalnej Z = (1 X 2 Y 2 ) 0.5 Zawsze ujemna albo zawsze dodatnia, w zależności od skrętności układu współrzędnych Niestety stwierdzenie to nie jest prawdziwe w przypadku stosowania map normalnych
Bufory G c.d. Kodowanie normalnej na dwóch komponentach bez założenia konkretnej wartości znaku składowej Z Zapis do buforu G: G.xy = normalize(n.xy)*(0.5nz + 0.5) 0.5 Odczyt z buforu G: N.z = 2 G.xy 2 1 N.xy = normalize(g.xy)*(1 N.z 2 ) 0.5
Bufory G c.d. Mapowanie nierówności i przemieszczeń zostało już wykonane w pierwszym przebiegu Zatem styczne na ogół nie będą już potrzebne Mogą one być jednak przydatne przy materiale stosującym odbicie anizotropowe (wykład 2) Można zapewnić, że wektory T, B i N będą wzajemnie prostopadłe Wtedy wystarczy zapamiętać kwaternion opisujący obrót referencyjnego układu współrzędnych trzy komponenty, oraz skrętność układu jeden komponent
Obliczanie oświetlenia Oświetlenie obliczane jest w postprocesie w oparciu o bufory G Najprościej jest dla każdego światła renderować pełnoekranowy czworokąt jest to jednak kosztowne obliczeniowo i zupełnie nieopłacalne O wiele lepiej jest renderować bryłę ograniczającą (bounding box, bounding sphere, ) dla każdego światła Użycie buforu szablonu
Obliczanie oświetlenia c.d. Szablon czyszczony zerami W pierwszym przebiegu: rendering tylko ścian tylnych, z testem głębi większy lub równy Zapis tylko do szablonu jedynek, tam gdzie przeszedł test głębi
Obliczanie oświetlenia c.d. W drugim przebiegu: rendering tylko ścian przednich, z testem głębi mniejszy lub równy i testem szablonu równy Tylko te fragmenty są oświetlone
Obliczanie oświetlenia c.d. Powyżej przedstawiony algorytm działa poprawnie tylko wtedy, gdy obserwator znajduje się na zewnątrz bryły ograniczającej światła Jeżeli obserwator jest w środku, to nie pozostaje nic innego jak rendering pełnoekranowego czworokąta Jeżeli światło jest nieskończone, np. światło kierunkowe, to też trzeba renderować pełnoekranowy czworokąt
Obliczanie oświetlenia c.d. Dwuprzebiegowy rendering z buforem szablonu nie zawsze jest opłacalny Czasami (szczególnie na najnowszych kartach) szybszy jest rendering bryły ograniczającej, najlepiej zwykłego prostopadłościanu Technika ta jest lepsza wtedy, gdy wąskim gardłem jest wydajność CPU, a nie karty graficznej
Obiekty półprzeźroczyste Z punktu widzenia cieniowania obiekty półprzeźroczyste można podzielić na dwie kategorie: Obiekty naklejane (decals) Obiekty niezależne Obiekty naklejane nie wymagają niezależnego cieniowania można je bezproblemowo stosować wraz z cieniowaniem opóźnionym Obiekty takie zmieniają pewne dane w buforach G, jednak nie wpływają na pozycję (głębię)
Obiekty naklejane
Obiekty naklejane
Obiekty półprzeźroczyste c.d. Obiekty półprzeźroczyste, które mają własne pozycje, przy cieniowaniu opóźnionym trzeba uwzględniać w specjalny sposób Rendering obiektów nieprzeźroczystych najpierw, przy pomocy cieniowania opóźnionego, potem obiektów półprzeźroczystych w tradycyjny sposób Jeżeli istnieje duża ilość obiektów półprzeźroczystych, oświetlanych przez dużą ilość świateł, to ich rendering będzie mieć decydujący wpływ na wydajność Problem kolejności renderingu tych obiektów
Obiekty półprzeźroczyste c.d. Technika Depth peeling Można ją zastosować przy cieniowaniu opóźnionym podobnie jak przy cieniowaniu tradycyjnym Przebieg renderingu geometrii i przebiegi oświetlenia dla każdej warstwy głębi Kompozycja kolejnych warstw głębi, na końcu rendering obiektów nieprzezroczystych Te same problemy związane z wydajnością (nieograniczona z góry ilość przebiegów), co w renderingu tradycyjnym
Obiekty półprzeźroczyste c.d. Listy fragmentów na piksel Tą technikę też można stosować wraz z cieniowaniem opóźnionym Dla każdego fragmentu, zamiast ostatecznego koloru, zapamiętywane są informacje takie same jak w buforach G, a także przeźroczystość Niestety przy cieniowaniu opóźnionym z listami fragmentów potrzeba o wiele więcej pamięci niż przy cieniowaniu tradycyjnym
Antyaliasing Podstawowe algorytmy kosztowne pamięciowo i obliczeniowo Rendering do tekstury o N razy większej rozdzielczości (supersampling) Potrzeba N 2 razy więcej pamięci i czasu, poza tym OK. Rendering do tekstury w trybie multisampling Zastosowanie sprzętowego antyaliasingu GPU Ogranicza wymagania czasowe Nie zmienia wymagań pamięciowych
Antyaliasing morfologiczny Kompromis pomiędzy jakością a wydajnością Rendering do takich samych tekstur jak bez antyaliasingu Brak wzrostu zużycia pamięci Przetwarzanie w postprocesie pewien koszt obliczeniowy, ale na ogół znacznie mniejszy niż koszt supersamplingu Zależy to od złożoności sceny
Antyaliasing morfologiczny c.d.
Antyaliasing morfologiczny c.d.
Antyaliasing morfologiczny c.d. Wykrywanie wzorców w obrazie Adaptywne rozmywanie krawędzi, w zależności od wykrytego wzorca Proste dla obrazów 1-bitowych (czarno-białych) Np. cienie Bardziej skomplikowane, ale też możliwe do wykonania dla obrazów kolorowych
Antyaliasing morfologiczny c.d.
Technika Light Pre-Pass
Technika Light Pre-Pass c.d. Alternatywa dla cieniowania opóźnionego Schemat algorytmu: Pierwszy przebieg: rendering geometrii, zapis tylko i wyłącznie pozycji (głębi) i normalnej Przebieg oświetlenia: rendering oświetlenia od świateł do buforów światła dla odbicia matowego i połyskliwego Drugi przebieg geometrii: oświetlenie przy pomocy buforów światła
Technika Light Pre-Pass c.d.
Podsumowanie kiedy stosować cieniowanie opóźnione Technika cieniowania opóźnionego nie zawsze jest najlepszym wyborem Warto ją stosować dla scen z dużą ilością świateł i prostymi materiałami Jest ona nieopłacalna dla scen otwartych z jednym światłem (Słońcem) bądź dwoma (Słońcem i dodatkowym światłem dopełniającym) W przypadku scen z dużą ilością świateł i obiektów półprzeźroczystych trzeba sprawdzić co jest bardziej wydajne
Dziękuję za uwagę