RENDERING W CZASIE RZECZYWISTYM Michał Radziszewski
Plan wykładu Zaawansowane teksturowanie wprowadzenie Próbkowanie i rekonstrukcja sygnału Granica Nyquista Filtry do rekonstrukcji Antyaliasing tekstur MIP-mapping Filtrowanie anizotropowe
Plan wykładu c.d. Kompresja obrazów Kompresja bezstratna Algorytm deflate/inflate Kompresja stratna Przestrzenie kolorów RGB i YCrCb Transformacja cosinusowa Kompresja S3TC Kompresja różnych danych Wybór odpowiedniego formatu S3TC
Literatura A. R. Smith, A Pixel Is Not A Little Square (and A Voxel Is Not A Little Cube), 1995 D. Mitchell, A. Netravali, Reconstruction Filters in Computer Graphics, SIGGRAPH 1988 P. Heckbert, Fundamentals of Texture Mapping and Image Warping, 1989 J.M.P. van Waveren, Real-Time DXT Compression, ID Software 2006
Zaawansowane teksturowanie wprowadzenie Aby osiągnąć dobre rezultaty teksturowania, nie wystarczy tylko przypisać tekstury do obiektów Konieczne jest zastosowanie odpowiednio dobranych technik antyaliasingu opierających się na filtrowaniu tekstur Współczesne gry stosują wiele tekstur i bardzo dużo obiektów niezbędne okazują się specjalizowane techniki kompresji tekstur
Próbkowanie i rekonstrukcja sygnału Teksturę można traktować jako dwuwymiarowy sygnał Próbkowanie zapamiętanie wartości sygnału w punktach tworzących regularną siatkę Teksele (i piksele) to są próbki punktowe, a nie małe kwadraty! Z takich próbek punktowych można odtworzyć sygnał, stosując odpowiednio dobrane filtry rekonstrukcyjne
Filtry do rekonstrukcji Rekonstrukcja odtworzenie wartości sygnału na podstawie próbek punktowych Wykonywana za pomocą odpowiedniego dobranego filtra Próbkowanie najbliższego punktu Filtrowanie dwuliniowe Filtry wielomianowe Filtry gaussowskie Funkcja sinc
Filtry do rekonstrukcji Wybór najlepszego filtru wybór pomiędzy rozmyciem a dzwonieniem, należy tez wziąć pod uwagę wydajność Najwydajniejsze jest sprzętowe filtrowanie dwuliniowe, ale nie zawsze daje dobre rezultaty Idealny z teoretycznego punktu widzenia filtr oparty o funkcję sinc powoduje dzwonienie W praktyce bardzo dobre wyniki można uzyskać za pomocą filtrów wielomianowych
Interpolacja dwuliniowa
Granica Nyquista Sygnał odtworzony może znacznie różnić się od sygnału oryginalnego Jeżeli maksymalna częstotliwość sygnału jest co najmniej 2x mniejsza niż częstotliwość próbkowania, to wtedy oryginalny sygnał można odtworzyć dokładnie jest to granica Nyquista W praktyce dokładne odtworzenie sygnału zwykle nie jest możliwe Można jednak znacznie ograniczyć błąd
Granica Nyquista aliasing
Antyaliasing tekstur Z punktu widzenia mapowania tekstur rendering trójkąta polega na przekształceniu tekstury poprzez mapowanie uv do przestrzeni widoku, potem ekranu (rzutowanie), a na końcu ponownemu próbkowaniu i zapisaniu wyniku w buforze ramki Jeżeli częstotliwość próbkowania w przestrzeni ekranu jest mniejsza niż oryginalna częstotliwość próbkowania tekstury to powstaje aliasing Jeżeli jest większa, to jakość obrazu silnie zależy od jakości filtru rekonstrukcyjnego
Antyaliasing tekstur c.d. Teksturę trzeba przefiltrować filtrem dolnoprzepustowym tak, aby usunąć częstotliwości powyżej progu powodującego aliasing Jednocześnie nie należy usunąć innych danych spowodowałoby to niepotrzebne rozmazanie tekstury Trudności związane głównie z wydajnością, dobre filtrowanie 2D jest o wiele bardziej kosztowne niż filtrowanie 1D
MIP-mapping
MIP-mapping Technika przyspieszania filtrowania tekstur Przechowywanie kolejnych poziomów szczegółowości, każdy następny o rozdzielczości 2x mniejszej niż poprzedni W przypadku liczb nieparzystych karty graficzne zaokrąglają w dół (wydajność), mimo że zaokrąglanie w gore dałoby nieco lepsze wyniki Zejście do rozdzielczości 1x1 Algorytm dla tekstur nie-kwadratowych
MIP-mapping
MIP-mapping W czasie odczytu z tekstury wybór najlepiej pasującego poziomu szczegółowości, na którym wykonywane jest filtrowanie dwuliniowe Bez MIP-mappingu mogłoby się okazać, że trzeba odczytać jednocześnie nawet wszystkie teksele tekstury Widoczne przejścia miedzy poziomami szczegółowości Tzw. filtrowanie trójliniowe rozwiązanie problemu
Filtrowanie anizotropowe W podstawowym algorytmie MIP-mappingu problematyczny jest wybór odpowiedniego poziomu szczegółowości Algorytm ten zakłada, że filtr będzie mieć kształt koła W przypadku powierzchni nieprostopadłych do obserwatora filtr ma jednak kształt elipsy Filtrowanie anizotropowe Wybór poziomu szczegółowości na podstawie krótszej osi elipsy Uśrednienie wartości wielu tekseli na osi dłuższej
Filtrowanie anizotropowe Filtrowanie trójliniowe wymaga zawsze 8 tekseli Filtrowanie anizotropowe może wymagać odczytania nieograniczonej z góry ilości tekseli Ograniczenie mimośrodu elipsy ograniczenie ilości odczytów tekseli, kosztem pewnego rozmycia Filtrowanie anizotropowe jest kosztowne Producenci kart graficznych stosują różne uproszczenia Rażąca utrata jakości w kartach NVIDIA z serii 5xxx w latach 2002/2003
Filtrowanie anizotropowe
Kompresja obrazów Obrazy nieskompresowane na ogół zapisywane są jako tablice pikseli Format taki pozwala na bardzo szybki odczyt i zapis, jednak zużywa względnie dużo pamięci Kompresja może znacząco ograniczyć zajętość pamięci, jednak za cenę spowolnienia dostępu do obrazu i, czasami, utraty jego jakości (kompresja stratna)
Kompresja obrazów c.d. Współczynnik kompresji (rozmiar skompresowany / rozmiar oryginalny) określa jak skuteczny jest dany schemat kompresji, nie mówi jednak nic o potencjalnej utracie jakości obrazu Istnieją algorytmy dekompresji obrazu w czasie rzeczywistym (w tym wspomagane sprzętowo przez GPU) Kompresja jest na ogół znacznie trudniejsza, ale też możliwa do wykonania w czasie rzeczywistym
Kompresja obrazów c.d. Wszystkie znaczące formaty kompresji określają dokładnie jak ma wyglądać dekompresja Zostawiają one jednak pewną swobodę przy konstruowaniu algorytmu kompresji Pozwala to na uzyskanie nieco szybszej kompresji do pracy w czasie rzeczywistym (kosztem utraty jakości) Można także zastosować bardzo dokładne, ale powolne algorytmy kompresji w trybie off-line
Kompresja bezstratna Umożliwia dokładne odtworzenie oryginalnego obrazu z obrazu skompresowanego Na ogół niezbyt duży współczynnik kompresji W pewnych przypadkach rozmiar obrazu po skompresowaniu może wzrosnąć (!) Nie można wyrzucić informacji Kompresja bezstratna to jedynie przekodowanie w taki sposób, aby typowe pliki obrazów uległy zmniejszeniu Rozmiar pozostałych plików odpowiednio wzrasta
Algorytm deflate/inflate Stosowany w bibliotece zlib Biblioteka ta jest używana m.in. w formatach.png i.exr Podstawowe elementy algorytmu Usunięcie powtarzających się łańcuchów bajtów wstawienie odwołań wstecznych w miejsca powtórzeń Podział danych na symbole o jednakowej długości i przypisanie im kodów o różnej długości tak, aby najczęściej powtarzające się kody dostały najkrótsze symbole
Kompresja stratna Umożliwia osiągnięcie znaczącej kompresji, jednak kosztem utraty jakości obrazu, a zatem braku możliwości dokładnego odtworzenia oryginalnego obrazu Istnieją techniki o stałym, a także zmiennym współczynniku kompresji, w zależności od tego, co dany obraz przedstawia Te drugie pozwalają na efektywniejszą kompresję Do dekompresji w czasie rzeczywistym obecnie stosuje się jednak tylko te pierwsze, ze względu na koszt
Kompresja stratna Metody o zmiennym współczynniku kompresji umożliwiają osiągnięcie z góry założonego współczynnika kompresji, jednak wtedy jakość obrazu będzie zależna od tego, co obraz przedstawia Można też zastosować podejście odwrotne ograniczona maksymalna utrata jakości, a otrzymany współczynnik kompresji zależny od zawartości obrazu
Kompresja stratna oryginał
Kompresja stratna JPEG 1:16
Kompresja stratna 4x rozdzielczość
Przestrzenie kolorów RGB i YCrCb Przestrzeń kolorów RGB nie jest zbyt dobra do kompresji Przestrzeń YCrCb (luminance, red chrominance, blue chrominance) nadaje się lepiej do tego celu Szczegóły na kanale jasności są znacznie lepiej rozpoznawane przez ludzi niż szczegóły na kanałach chrominancji Kanały chrominancji można o wiele bardziej skompresować niż kanał jasności bez znaczącej utraty jakości obrazu
Transformacja cosinusowa Przejście z dziedziny przestrzennej do dziedziny częstotliwości Informacje o wyższych częstotliwościach można skompresować bardziej niż te o niższych ludzki wzrok jest na nie mniej czuły Operacja stratna (nawet bez kompresji) ze względu na błędy zaokrągleń
Transformacja cosinusowa
Kompresja JPEG Kolejne kroki kompresji: Przejście z przestrzeni RGB do przestrzeni YCrCb Opcjonalna redukcja rozdzielczości kanałów chrominancji Podział obrazu na bloki 8x8, dyskretna transformacja cosinusowa (DCT) na każdym z nich Kwantyzacja współczynników DCT, zapisanie ich w kolejności zygzakowej Wycinanie zer, kodowanie Huffmana albo kodowanie arytmetyczne
Kompresja JPEG
Kompresja JPEG Aby zdekodować obraz należy wykonać odwrotności powyższych kroków w odwrotnej kolejności Kompresja stratna, zmienny współczynnik kompresji Standard kompresji JPEG pozwala (z pominięciem pierwszego kroku) na zakodowanie do 255 kanałów, niestety pliki.jpg tylko 1 albo 3 (RGB) Kompresja stosowana w grze Rage jako wsparcie techniki Unique Texturing
Kompresja S3TC Tylko format RGBA Trzy warianty kompresji, różnią się kompresją kanału alfa BC1 alfa 1-bitowa, zmieszana z danymi koloru BC2 alfa 4-bitowa, nieskompresowana BC3 alfa 8-bitowa, skompresowana Niezależna kompresja bloków 4x4 Stały współczynnik kompresji 1:6 (1:8) dla BC1, 1:4 dla BC2 oraz BC3
Kompresja S3TC Opis skompresowanego bloku zawiera dwa kolory w formacie RGB 5:6:5 (2x16 bitów) Dodatkowe dwa kolory są liniowo interpolowane pomiędzy nimi W każdym bloku dostępne są 4 kolory leżące na jednej linii w przestrzeni RGB Każdy z 16 tekseli bloku jest opisany przez indeks, mówiący którego z 4 dostępnych kolorów używa (16x2 bity)
Kompresja S3TC Aby skompresować obraz należy dla każdego bloku tylko określić dwa podstawowe kolory Niestety nie jest to proste, jakość kompresji bardzo silnie zależy od algorytmu użytego do tego celu Formaty BC1, BC2 i BC3 kompresują kolory w powyższy sposób, różnią się tylko kompresją kanału alfa
Kompresja S3TC oryginał
Kompresja S3TC BC1
Kompresja S3TC alg. szybki Wybór dwóch podstawowych kolorów Algorytm szybki: Ograniczenie wszystkich 16 tekseli prostopadłościanem wyrównanym do osi w przestrzeni RGB Dwa kolory: punkty minimalny i maksymalny prostopadłościanu ograniczającego Metoda niezbyt dokładna (np. dlaczego kolory z tej konkretnej przekątnej, a nie innej?) Często błąd kompresji jest akceptowalny, mimo że mógłby być mniejszy
Kompresja S3TC alg. dokładny Algorytm dokładny: Technika PCA (Principal Component Analysis) do znalezienia linii (w przestrzeni RGB) o największej zmienności danych Rzuty kolorów 16 tekseli (punktów w RGB) na tę linię będą miały możliwie mały błąd Dwa podstawowe kolory np. najbardziej odległe od siebie rzuty na tej linii Bardzo dobre wyniki, ale PCA dla 16 punktów jest znacznie wolniejsze niż znalezienie prostopadłościanu
Kompresja S3TC
Kompresja S3TC różnych danych Obrazy bez kanału alfa albo tekstury do alfa-testu można zapisać w formacie BC1 Najlepszy współczynnik kompresji 1-bitowa alfa wystarcza Jeżeli obraz zawiera kanał alfa z ostrymi krawędziami, to najlepszy jest format BC2 Jeżeli obraz zawiera kanał alfa z gładkimi gradientami, to lepszy będzie format BC3
Kompresja S3TC różnych danych Kompresja map normalnych Zakodowane w teksturze RGB, bez kanału alfa Mimo to, nie należy używać formatu BC1 Normalne mają nieliniowe zależności pomiędzy komponentami, natomiast bloki S3TC używają 4 kolorów leżących na jednej linii duży błąd kompresji Zakodowanie tylko wartości Nx i Ny, odtworzenie Nz Format BC3, Nx na kanale G, Ny na kanale A Albo: zapisanie Nx i Ny w dwóch rożnych teksturach przemieszanie normalnych z innymi danymi
Kompresja S3TC różnych danych
Dziękuję za uwagę