Michał Drobot Visual Technical Director Reality Pump GPU Pipeline II Michał Drobot Visual Technical Director Reality Pump
Plan wykładu Optimalizacje geometrii Rasteryzacja Texture Mapping Antialiasing Flow Control Alpha Blending
Optymalizacje geometrii Backface Culling Occlusion
Backface Culling Sprawdzamy kierunek względem, którego ustawiony jest trójkąt Kierunek przeglądania trójkąta ma znaczenie Wyliczanie wektora normalnego trójkąta Iloczyn wektorowy dwóch wektorów reprezentujących krawędzie trójkąta
Backface Culling Iloczyn wektorowy A x B = C C – wektor prostopadły do płaszczyzny wyznaczonej przez A i B Układ „prawej dłoni” C A B
Backface Culling 2 wektory Iloczyn skalarny V1 = (b1 – a1 , b2 – a2 , b3 – a3) V2 = (c1 – a1 , c2 – a2 , c3 – a3) Iloczyn skalarny V1 = (x1, x2, x3) V2 = (y1 , y2, y3) V1xV2 = (x2*y3 - x3*y2, x3*y1 - x1*y3, x1*y2 - x2*y1) Z X a Y c b
Backface Culling Kierunek ruchu wskazówek zegara (clockwise) V1 = (5, 5, 0) V2 = (11, 0, 0) N = V1 x V2 Anti-clockwise N’ = V2 x V1 X Z N (5,5,0) N v1 Y (0,0,0) v2 N’ (11,0,0)
Backface Culling Sprawdzamy czy normalna jest w kierunku kamery Jeśli tak to renderujemy Nie ma sensu renderować trójkątów ‘tyłem’ do kamery Test dokonujemy przez iloczyn skalarny Z X Y
Backface Culling A o B = |A||B|cos fi A o B > 0 => -90* < fi < 90* fi B
Backface Culling Przeprowadzany sprzętowo Przed PixelShadingiem
Occlusion Culling Rodzina algorytmów klasyfikacji powierzchni widocznych Na różnych etapach renderingu odrzuca powierzchnie z potoku renderowania Opierają się na metodach Przestrzeni świata Przestrzeni obraz
Occlusion Culling Frustum Culling Przycinanie obiektów do bryły widzialności Frustum tworzone jako ostrosłup ścięty, wg parametrów kamery w przestrzeni świata Stosuje się modele aproksymacyjne Bouding Box Bounding Volume Dla każdego vertexa BB/BV sprawdzamy czy znajduje się w frustum Jeśli nie to odrzucamy obiekt z kolejki renderowania
Occlusion Culling Oclussion Culling Ma za zadanie określenie obiektów, które z punktu widzenia kamery, są zasłaniane przez inne obiekty Skomplikowane ze względu na ruchomość kamery, bądź obiektów
Occlusion Culling Raytracing HOM – Hierarchical Occlusion Maps Hi-Z Istnieje wiele metod pozwalających przyśpieszyć sprawdzanie Hierarchiczny podział przestrzeni Zamykanie obiektów w drzewach : OCT, BSP , KD etc. Divide and Conquer Algorytm Warnock’a Raytracing HOM – Hierarchical Occlusion Maps Hi-Z
Occlusion Culling Test occluderów W świecie ustawia się niewidzialne obiekty przesłaniające (clipping box) W momencie tworzenia kolejki do renderowania, obiekty są wycinane przez frustum utworzone przez obiekt przesłaniający Efektywnie wycina się obiekty przesłonięte przez occluder Stosowane w skomplikowanych sceneriach o naturalnych przeszkodach widoczności Miasta – occluder = budynek Teren – occluder = skały, wzgórza doliny
Occlusion Culling Potentially Visible Sets Portal Rendering Dodatkowo wykorzystuje się metody PVS Potentially Visible Sets Portal Rendering Podział mapy na określone, przystające do siebie sektory W danej kolejce renderowania brany pod uwagę jest Dany sektor Przystający do niego sektor w kierunku patrzenia kamery W danym sektorze przeprowadzamy standardowe frustum culling W sektorze przystającym przeprowadzamy frustum culling przy użyciu nowego frustum utworzonego z przejścia (portalu) pomiędzy sektorami (np. tunel, drzwi…) Efektywnie wycinamy jedynie ‘widok’ następnego sektora przez portal Często stosowane w renderingu zamkniętych pomieszczeń
Rasteryzacja Rasteryzacja występuje na etapie triangle traversal Wykonywana przy użyciu algorytmu Scanline / Scan Conversion Liczne optymalizacje sprzętowe Znajomość algorytmów przydatna w rasteryzacji software’owej
Rasteryzacja
Rasteryzacja
Rasteryzacja Dla każdego pixela Sprawdzamy czy znajduje się wewnątrz trójkąta Test obliczamy poprzez sprawdzenie czy pixel znajduję się algebraicznie w przecięciu płaszczyzn wyznaczonych przez krawędzie trójkąta Zapisujemy do tablic (color buffer, textura, z-buffer…) interpolowane dane z vertexów Interpolowane dane zapisywane do tablic i przekazywane do pixel shaderów (interpolatory)
Rasteryzacja Skanowanie jest przyśpieszane przez Wykorzystanie Bounding Box’ów Stosowanie ‘połowicznej przestrzeni obliczeń’ Half-space Pracowanie na blokach pixeli 2x2 / 4x4 etc…
Texture mapping Wielowymiarowe obrazy nakładane na poligony Textury składają się z „texeli” Dopiero później mapowane są na „pixele” Zwykle obrazy 2D Cube, Volumetric Są jedynie różnymi rodzajami pakowania i adresowania obrazów Przechowywane w wielu formatach i metodach kompresji w zależności od zastosowania DXT1, DXT5 – GPU mogą pracować na formatach skompresowanych 8888, 1010102, 1616, 16161616… Etc…
Texture mapping Geometria (vertex) posiada kilka atrybutów Pozycja Wektor normalny Kolor Koordynaty textur Koordynaty textur dla każdego vertex’a (u,v) zwykle z zakresu [0;1] (0,0) – górny lewy róg
Texture mapping {v0.x, v0.y, v0.z, … , 1 , 0}
Texture mapping {v0.x, v0.y, v0.z, … , 1 , 0}
Texture mapping Istnieje wiele opcji konfiguracji samplera Tryb samplowania Point Linear … Tryb adresowania UV Clamp – przycina wartość (u,v) do [0;1] Wrap – frac(u,v) – zawija texture
Texture mapping {v0.x, v0.y, v0.z, … , 0 , 0}
Texture mapping Texele zwykle nie mapują się 1:1 z pixelami Jeśli pixel jest większy od texela Należy przerowadzić minifikacje textury (pomniejszenie) Jeśli pixel jest mniejszy od texela Należy przeprowadzić magnifikacje textury (powiększenie) Filtrowania przeprowadzamy metodami Nearest Neighbour – najbliższego sąsiada Bilinear – liniową w dwóch wymiarach – średnia ważona najbliższych texeli ze względu na odległość od punktu samplowania
Texture mapping Texele zwykle nie mapują się 1:1 z pixelami Jeśli pixel jest większy od texela Należy przerowadzić minifikacje textury (pomniejszenie) Jeśli pixel jest mniejszy od texela Należy przeprowadzić magnifikacje textury (powiększenie) Filtrowania przeprowadzamy metodami Nearest Neighbour – najbliższego sąsiada Bilinear – liniową w dwóch wymiarach – średnia ważona najbliższych texeli ze względu na odległość od punktu samplowania
Texture mapping Mip-mapping Przy skrajnych minifikacjach na jeden pixel przypada wiele texeli Ilość wymaganych do uśrednienia wartości jest zbyt duża dla zachowania wydajności Przygotowuje się uprzednio wyliczone mip-mapy – uśrednione wersje danej textury w mniejszych rozdzielczościach Mogą być generowane automatycznie przez API Przyśpieszają mapowanie obiektów oddalonych od kamery Mniejsze textury (mip mapy) Mniej texeli – szybsze filtrowanie i cache’owanie Posiadają wymiary : 2^n, 2^n-1, 2^n-2 … 2^1 , 2^0 W zależności od stopnia minifikacji wybierana najbliższa mip-mapa Pamięciowo zajmują dodatkowo 1/3 pamięci danej textury
Texture mapping Mip-mapping Z racji swoich wymiarów filtrowanie przy pomocy mip-map jest izotropowe Uniformiczne w każdym kierunku Jeśli płaszczyzna jest pochyła względem kamery należy przeprowadzić mocniejsze filtrowanie tylko w jednym kierunku Mip-mapping wybierze rozmiar mipmapy pasujący do najbliższego pomniejszenia Pixele prostopadłe do kierunku pochylenia płaszczyzny będą niepotrzebnie filtrowane (rozmyte)
Texture mapping Tri-linear filtering Dokonuje filtrowania bilinearnego w dwóch najbliższych mipmapach Następnie interpoluje uzyskane wartości względem odległości między mipmapami Poprawia jakość mipmappingu Nie wpływa na izotropowość filtrowania
Texture Mapping Anizotropic filtering Filtrowanie anizotropowe oblicza kształt mapowanej powierzchni Względem kształtu dokonuje odpowiednichń bi-/tri- linearnych Kształt jest wyliczany przez dodatkowe sample dookoła samplowanego miejsca Liczba dodatkowych sampli zależy od odległości oraz kąty patrzenia na płaszczyznę względem kamery
Texture Mapping Anizotropic filtering Koszt wynosi x razy sample przewidziane dla typu podrzędnego samplowania Bilinear – 4 sample Trilinear – 2 * 4 sample Anizotropic - Trilinear AFx4 – 4 * 2 * 4 = 32 sample Zapewnia optymalną jakość mapowania powierzchni „pod kątem” do kamery Duży narzut obliczeniowy oraz pamięciowy ze względu na olbrzymią dodatkową ilość samplowań
Antialiasing Rasteryzacja zamienia dane wektorowe z przestrzeni ciągłej na dyskretną – pixele Dochodzi do problemu mapowania danych na pixel Efektem są błędy aliasingu Poszarpane krawędzie Brak ostrości textur
Antialiasing Algorytm rasteryzacji musi zadecydować czy pixel należy do trójkąta Decyzja zachodzi względem ‘środka’ pixela
Antialiasing Najprostszą metodą rozwiązania problemu jest overs/super – sampling Renderowanie obrazu w większej rozdzielczości (2xH , 2xV , 2x , 4x…) Przy odczycie obrazu pomniejszanie go i uśrednianie Duży narzut pamięciowy, przepustowości oraz obliczeń X razy większy bufor koloru i Z
Antialiasing Supersampling
Antialiasing Supersampling
Antialiasing Supersampling Anitaliasowane krawędzie Brak przeskoku pixeli Możliwe poprawienie jakości textur Kosztowne Zwykle powoduje lekkie rozmycie Textury mogą być filtrowane osobno poprzez filtrowanie anizotropowe AF
Antialiasing MSAA Multi Sample Anti Aliasing Dowolna metoda SSAA, która wykorzystuje nierówne bufowry Zwykle bufory koloru są mają klonowane kolory Średnia nie różni się od braku SSAA Z bufor posiada wartość SSAA Efektywnie trójkąty nie mają poszarpanych krawędzi Tyle samo pamięci Mniejszy narzut obliczeniowy oraz transferu
Antialiasing Wszystkie wymienione metody wiążą się z licznymi ograniczeniami wydajności jak i przepustowości Zależy od konstrukcji renderera Jeśli dane nie będące na krawędzi maja po uśrednieniu ten sam wynik, po co w ogóle wykonywać obliczenia?
Antialiasing EdgeAA Opiera się na 2 etapach Wykrycie krawędzi obiektów na ekranie Przeprowadzenie obliczeń/SSAA jedynie na wykrytych krawędziach Skomplikowane wykrywanie krawędzi Szybkie z nowymi kartami Metoda zapewniająca optimum wydajności i jakości
Antialiasing Istnieją różne metody samplowania z obrazu o wyższej rozdzielczości Regular grid Oriented Grid Poisson Sampling Jittered Mixed …
Pipeline Flow control Wykorzystanie IF..Else (loop) Static flow control Bazuje jedynie na stałych Na podstawie stałej decyduje o wyborze ścieżki wykonawczej Dynamic flow control Bazuje na zmiennych dynamicznych Na ich podstawie dokonuje wyboru ścieżki Utrudnia operacje adresowania, liczenia gradientów itp.. Ręczne liczenie adresowania dla textur
Pipeline Flow control Kompilator na podstawie heurystyk (ilośc instrukcji, typ, odwołania…) może zdecydować o statycznym rozwiązaniu (unroll, wykonanie obu gałęzi IF i wybranie logiczne wyniku) bądź dynamicznym (loop, branch) Możemy to wymuszać dyrektywami jeśli wiemy co robimy [branch] [flatten] [loop] [unroll] etc…
Pipeline Branch processor (>= SM 3.0) Umożliwia wprowadzenie architektury MIMD Operacje na fragmentach są przeprowadzane w bloczkach (np. 32x32, 8x8 , 2x2) Każdy z bloczków za pomocą Branch processora i tzw. Flow control może wykonać odmienną ścieżkę wykonawczą Jeśli którykolwiek texel z bloczku musi wybrać odmienną drogę od innych ,obliczenia są wykonywane dla wszystkich texeli i wszystkich dróg Wprowadza fizyczną obsługę dynamicznych if, else, for, while itp. Narzut obliczeniowy < 6 cykli
Pipeline Scan converter dzieli trójkąt na bloki 8x8 Każdy blok jest dzielony dalej na quady 2x2 Mogą wśród nich wystąpić „martwe” pixele Sprawa komplikuje się przy wykorzystaniu flow control W jednym bloku mogą być pixele wymagające odmiennych ścieżek wykonawczych == wykonanie wszystkich ścieżek i wybór logiczny rezultatu
Pipeline Wybór ścieżki powinien być względnie oczywisty dla GPU Quady 2x2 zawierające różne ścieżki wykonawcze zostaną wykonane w całości i wybrany właściwy logicznie wynik Dążymy do lokalizacji wykonań kodu
Alpha Blending Efekty przeźroczystości Kolor źródła jest blendowany (mieszany) z kolorem celu Wybierane są operatory oraz mnożniki : ONE, ZERO , + , - , * … Istnieje wiele metod blendowania Additive C = Src * (1,1,1,1) + Dst * (1,1,1,1) = Src + Dst Substractive C = Src * (1,1,1,1) – Dst * (1,1,1,1) = Src – Dst Multiplicative C = Src * Dst Alpha Blending (różne wersje ze względu na alpha) C = Src.rgb * Src.a + Dst * (1 – Src.a)
Podsumowanie For more information contact me hello@drobot.org Slides will be available at Drobot.org
Questions ?