Teksturowanie w grafice komputerowej Michał Radziszewski
Plan prezentacji Cel użycia tekstur Mapowanie tekstur Filtrowanie – rekonstrukcja, prefiltrowanie Próbkowanie losowe HDRI Pełne widmo Kompresja tekstur Teksturowanie proceduralne
Cel użycia tekstur Poprawa jakości grafiki Szczegółowe obrazy bez konieczności wykorzystania ogromnej ilości wielokątów Głównie kolor, ale nie tylko Niezależny kolor matowy i kolor połysku Siła połysku Przezroczystość Mapowanie nierówności / przemieszczeń I wiele innych
Tekstury – kolor
Tekstury – przezroczystość © Plus3D
Mapowanie przemieszczeń © William Donnelly
Mapowanie tekstur Podstawowy algorytm mapowania na płaskie wielokąty, historycznie – brak korekcji perspektywy Mapowanie ogólne – dwuwymiarowa powierzchnia musi być parametryzowalna Tekstury trójwymiarowe
Tekstury trójwymiarowe
Filtrowanie Rekonstrukcja – współrzędne teksturo-wanego punktu na ogół niecałkowite Należy zrekonstruować wartość tekstury w dowolnym punkcie Obrazy często nie są zapisami poprawnie (zgod-nie z tw. Shannona) próbkowanego sygnału Teoretycznie idealny filtr oparty o funkcję sinc może powodować ‘dzwonienie’
Filtrowanie – rekonstrukcja Należy zrekonstruować wartość tekstury w dowolnym punkcie – cd. W praktyce używane są filtry gaussowskie albo wielomianowe, kompromis pomiędzy dzwonie-niem, rozmyciem a kosztem obliczeniowym
Filtrowanie – rekonstrukcja 1D © Matt Pharr
Prefiltrowanie Nawet idealna rekonstrukcja nie zawsze jest skuteczna Na skutek złożenia mapowania na wielokąt z mapowaniem na ekran rozdzielczość tekstury może ulec zmniejszeniu Prefiltrowanie – usunięcie z tekstury częstotliwości powodujących aliasing w ww. przypadku
Prefiltrowanie – cd. MIP mapy, trilinear filtering, anisotropic filtering © 3D Mark 2006
Prefiltrowanie – cd. © 3D Mark 2006
Prefiltrowanie – cd. © 3D Mark 2006
Prefiltrowanie – cd. © Extremetech
Próbkowanie losowe Stosowane wtedy, gdy nie można zastosować filtrowania analitycznego (np. map nierówności czy przeźroczystości) Zamienia aliasing na szum, który jest redukowany poprzez dużą ilość próbek Zastępuje tylko prefiltrowanie, dobry algorytm rekonstrukcji nadal jest konieczny Zawsze działa bezbłędnie, ale kosztowne obliczeniowo
Próbkowanie losowe – cd. © Matt Pharr
HDRI High Dynamic Range Imaging Konwencjonalne obrazy – format stałoprzecinkowy, na ogół 256 wartości Pełna precyzja – tylko dla wartości >128 Brak detali w cieniu HDRI – format zmiennoprzecinkowy Pełna precyzja niezależnie od jasności Na ogół 16 bitów, tzw. ‘half’
HDRI – cd. Znacznie lepszy kontrast przy zachowaniu detali na najjaśniejszych i najciemniejszych elementach Na zwykłym projektorze niestety nie można pokazać nic poza tym: © OpenEXR
Pełne widmo a RGB Model RGB nie ma żadnego uzasadnienia fizycznego – został zaprojektowany do wyświetlania i przechowywania obrazów biorąc pod uwagę fizjologię ludzkiego oka oraz charakterystyki monitorów Niestety rendering w oparciu o RGB w ogólnym przypadku nie jest poprawny
Pełne widmo – motywacja Zniekształcanie kolorów – RGB poprawne tylko dla oświetlenia białego Zjawiska zależne od długości fali światła
Pełne widmo – motywacja
Pełne widmo – cd. Ale niemal wszystkie tekstury są w formacie RGB – konieczność konwersji Pełne widmo zawiera dużo więcej informa-cji, niż może przechować tekstura RGB Istnieją różne warianty takiej konwersji – każdy z nich jest ‘zgadywany’, nie da się powiedzieć który z nich jest lepszy
Pełne widmo – cd. Przykładowa konwersja widma r(l), g(l), b(l), gdzie l – długość fali r(l) + g(l) + b(l) = 1, 0 ≤ x(l) ≤ 1 Wynik konwersji: s(l) = R*r(l) + G*g(l) + B*b(l)
Pełne widmo – cd. Wynikiem renderingu w oparciu o pełne widmo jest obraz nie dający się wyświetlić Konieczna jest konwersja powrotna do RGB, na ogół poprzez przestrzeń XYZ Konieczność mapowania zakresu jasności oraz kolorów nie reprezentowalnych w RGB Najlepszy format do przechowywania takich wyników – wariant HDR
Kompresja tekstur Tekstury o wysokiej rozdzielczości zajmują dużo pamięci Kompresja tekstur powoduje mniejszą utratę jakości niż zmniejszenie rozdzielczości Kompromis pomiędzy jakością tekstur, wymaganą mocą obliczeniową a zajętością pamięci
Kompresja tekstur – cd. Wymagania Kompresja bezstratna, np. PNG Szybkie dekodowanie (kodowanie mniej istotne) Swobodny dostęp w przypadku śledzenia promieni (niekonieczny przy rasteryzacji) Kompresja bezstratna, np. PNG Dobra do grafiki tworzonej ręcznie, zrzutów ekranu, itp., ale nie nadaje się do kompresji zdjęć, będących często podstawą tekstur Brak swobodnego dostępu
Kompresja tekstur – cd. Kompresja stratna – np. JPG Dobry (ok. 10-20x) współczynnik kompresji dla zdjęć przy zachowaniu akceptowalnej jakości Utrata jakości objawia się poprzez rozmycie szczegółów i rozpad obrazu na bloki 8x8 albo 16x16, jednak rozpad można skorygować Kosztem niewielkiego (ok. 15% przy kompresji 10x) narzutu pamięciowego można uzyskać dostęp swobodny Niezbyt wydajna dekompresja
Kompresja tekstur – cd. Format specjalizowany – np. DXT Kompresja stratna Jakość lepsza niż przy ograniczeniu rozdzielczości ale gorsza niż dla obrazów JPG Optymalizowany pod kątem kart graficznych Bardzo szybka dekompresja
Teksturowanie proceduralne Zastosowanie programu do utworzenia tekstur Program wykonywany jest w trakcie renderingu Niemal brak zużycia pamięci Wymagana duża moc obliczeniowa
Teksturowanie proceduralne © David Ebert
Teksturowanie proceduralne color main { return blend( blend(color([0.2 0.6]), color([0.6 0.2]), noise(addr=8.0*$uv+16.0)*0.333+0.5), color([0.95 0.9]), marble(addr=12.0*$uv, layers=[0.375, 0.375], amplitude=1.0, roughness=0.25, bright_dark=0.5, c_octaves=6 )) * blend( blend(color([0.2 0.4]), color([0.5 0.2]), noise(addr=8.0*$uv+48.0)*0.333+0.5), blend(color([0.95 0.9]), color([1.0 0.7 0.2 0.1]), noise(addr=8.0*$uv+128)*0.333+0.5), marble(addr=12.0*$uv+4.0, layers=[0.375, 0.375], amplitude=0.75, roughness=0.375, bright_dark=0.375, }
Teksturowanie proceduralne Możliwość efektywnej kontroli nad parametrami tekstury Duża ilość szczegółów Olbrzymia różnorodność scen Nie zawsze łatwo da się zastosować np. twarz człowieka ściana z obrazem
Podsumowanie Właściwe użycie tekstur decyduje o jakości grafiki Bardzo ważne jest odpowiednie filtrowanie tekstur Warto rozważyć stosowanie bardziej zaawansowanych formatów niż 24bit RGB Konieczność wyważenia zużycia pamięci i mocy obliczeniowej