Adam Bandurski 08.04.2010 Przykłady mapowania detali
Transkrypt
Adam Bandurski 08.04.2010 Przykłady mapowania detali
Adam Bandurski 08.04.2010 Przykłady mapowania detali geometrycznych w komputerowej grafice 3D 1. Czym jest mapowanie Mapowaniem w komputerowej grafice trójwymiarowej nazywa się odwzorowanie dwuwymiarowej płaszczyzny na trójwymiarowej bryle. Innymi słowy „obłożenie” trójwymiarowego modelu, złożonego z wielokątów, dwuwymiarową bitmapą. Typowym przykładem mapowania jest teksturowanie modelu, w którym to poszczególne fragmenty komputerowego modelu zyskują barwę. Za pomocą specjalnie przygotowanych bitmap, można również odwzorowywać szczegóły geometryczne modelu. Mapowanie tych detali ma za zadanie zwiększenie dokładności modelu nie zwiększając jego złożoności. Ma to szczególne znaczenie w aplikacjach wyświetlających grafikę trójwymiarową w czasie rzeczywistym, gdzie wzrost rozdzielczość geometrycznej modelu powoduje spadek wydajności programu. 2. Model oświetlenia Aby zagłębić się w szczegóły tematu należy najpierw zapoznać się ze sposobem obliczania oświetlenia i cieniowania. Model zaproponowany przez Phong Bui-Tonga w 1973 roku, stosowany przez programistów do dziś dnia, uzależnia natężenie światła rozproszonego od cosinusa kąta między wektorem normalnym do powierzchni a wektorem poprowadzonym od powierzchni do źródła światła. Poniższy schemat ilustruje ten model cieniowania. Gdzie: L – wektor do źródła światła R – wektor odbicia światła V – wektor do obserwatora N – wektor normalny do powierzchni Źródło: http://www.blacksmith-studios.dk/projects/downloads/bumpmapping_using_cg.php Zatem jasność obserwowanej powierzchni zależy od wielkości kąta między wektorami L i N. Zmniejszenie kąta powoduje zwiększenie jasności powierzchni a zwiększenie kąta powoduje zmniejszenie jasności. Najwyższa jasność występuje, gdy wektory N i L są równe a najmniejsza, gdy są do siebie prostopadłe. W uproszczeniu jasność zależy od iloczynu skalarnego tych dwu wektorów. Dlatego wektor normalny N jest kluczowym wektorem w obliczaniu jasności powierzchni a co z tym idzie większości prezentowanych dalej przykładów, będzie opierać się na obliczaniu odchylenia tego wektora. 3. Bump mapping Mapowanie wypukłości (ang. bump mapping) to model zaproponowany na konferencji SIGGRAPH w 1978 roku przez Jamesa F. Blinna w pracy zatytułowanej „Simulation of wrinkled surfaces”. Metoda ta, do modyfikacji wektora normalnego, używa tekstury, w której każdy piksel modyfikuje wektor normalny lokalnie za pomocą jasności koloru. Im większa jasność piksela, tym większe odchylenie wektora. Głównymi zaletami tej metody są zachowanie dotychczasowej geometrii modelu oraz łatwość wykonania (zazwyczaj wykonana w skali szarości bitmapa). W celu obliczenia dla pojedynczego piksela wartości wektora normalnego należy wpierw wyznaczyć dwa wektory, których wartości można wyliczyć z poniższych wzorów: t = (1, 0, wys[x+1, y] – wys[x-1,y]) b = (0, 1, wys[x, y+1] – wys[x, y-1]) gdzie wys[x, y] jest funkcją zwracającą jasność piksela o współrzędnych x, y. Następnie z iloczynu wektorowego powyższych, można wyznaczyć wektor normalny do powierzchni, dla danego piksela. Wynikiem iloczynu skalarnego otrzymanego wektora normalnego i wektora L jest jasność światła rozproszonego danego teksela (piksela tekstury). Dla przykładu, chcąc obliczyć wartość wektora normalnego zaznaczonego poniżej piksela, trzeba znać jasność pikseli sąsiednich. Po podstawieniu wartości do odpowiednich wzorów otrzyma się: t = (1, 0, wys[x+1, y] – wys[x-1,y]) t = (1, 0, 1-0,25) t = (1, 0, 0,75) b = (0, 1, wys[x, y+1] – wys[x, y-1]) b = (0, 1, 0,5-0,25) b = (0, 1, 0,25) Z iloczynu wektorowego: n = (-0,75, -0,25, 1) Warto podkreślić w tym miejscu, że ze względu na budowę wektorów t i b, ostatnia współrzędna wektora n jest niezmienna i wynosi 1. W efekcie, w tego rodzaju mapowaniu, nie jest możliwe odwzorowywanie wgłębień, jedynie wypukłości – stąd nazwa. 4. Normal Mapping Drugą metodą mapowania detali jest metoda mapowania normalnych (ang. normal mapping). Znana jest również pod nazwą Dot3 Bump Mapping, ze względu na obliczanie jasności teksela za pomocą iloczynu skalarnego (dot product w języku angielskim to iloczyn skalarny). Przedstawiona została na konferencji SIGGRAPH w roku 1998, w pracy „AppearancePreserving Simplifications” autorstwa Jonathana Cohena, Marca Olano i Dinesha Manocha. Metoda ta, podobnie jak poprzednia, nie powoduje zmian w geometrii modelu, jednak w odróżnieniu od poprzedniej, nie jest ograniczona małym odchyleniem wektora normalnego, dlatego, że współrzędne wektora normalnego są bezpośrednio zakodowane w składowych koloru piksela. Minusem tej metody jest to, że do utworzenia takiej mapy przekształceń potrzebne jest specjalne oprogramowanie. Poszczególne współrzędne wektora normalnego są zakodowane odpowiednio: X – w wartości czerwonej składowej koloru piksela, Y – w wartości zielonej składowej koloru piksela, Z – w wartości niebieskiej składowej koloru piksela, Ponieważ wartości kolorów są reprezentowane w zakresie [0; 1] a współrzędne wektora n są z zakresu [-1; 1] wartości poszczególnych składowych koloru należy podać dekompresji. Można do tego wykorzystać wzór: Współrzędna = 2.0 * (Składowa_koloru -0.5) Dla przykładu piksel o składowych koloru: R=0,93, G=0,6, B=0,67, ma następujące współrzędne wektora normalnego: x=2.0*(0,93-0,5)=0,86 y=2.0*(0,6-0,5)=0,2 z=2.0*(0,67-0,5)=0,34 co daje wektor n = (0,86, 0,2, 0,34) 5. Displacement mapping Kolejną metodą jest mapowanie przemieszczeń (ang. displacement mapping). Jest to metoda, w której na podstawie podanej mapy przemieszczeń, tworzona jest nowa, zagęszczona geometria. Mapą przemieszczeń jest zazwyczaj tekstura wykonana w skali szarości. Dla każdego piksela tekstury przypisywana jest wartość, która definiuje przemieszczenie tego piksela wzdłuż wektora normalnego do powierzchni, następnie na tak utworzone przekształcenia jest interpolowana nowa siatka wyższej rozdzielczości. Ze względu na zagęszczanie siatki modelu, metoda ta jest najmniej efektywna. Cały proces (zredukowany do dwóch wymiarów) ilustruje poniższy rysunek: Źródło: J. Kautz, H. P. Seidel „Hardware Accelerated Displacement Mapping for Image Based Rendering” http://www.graphicsinterface.org/proceedings/2001/102/ 6. Parallax mapping Ostatnia z prezentowanych metod mapowania opiera się na zjawisku paralaksy, czyli zjawisku niezgodności obrazu obiektu obserwowanego z dwóch różnych punktów obserwacyjnych. Ten rodzaj mapowania, znany jest również jako mapowanie wirtualnych przemieszczeń (ang. Virtual displacement mapping). Podstawą jest ponownie czarno-biała mapa wysokości, na podstawie której obliczana jest wartość przesunięcia poszczególnych pikseli, jednakże tutaj istotną rolę odgrywa wektor do obserwatora. Przemieszczenia tekstury są zatem uzależnione od kierunku obserwacji. Poniższy schemat opisuje te przekształcenia. Źródło: T. Kaneko „Detailed Shape Representation with Parallax Mapping ” http://www.vrsj.org/ic-at/papers/list.html#2001 Głównym minusem tego podejścia jest wąskie zastosowanie, ze względu na zniekształcenia występujące przy wysokim kącie obserwacji. Istnieje kilka odmian powyższego algorytmu, np.: steep parallax mapping lub iterative parallax mapping, które próbują z mniejszym lub większym skutkiem rozwiązać ten problem, jednak 7. Wnioski Przedstawione powyżej sposoby mapowania są jedynie wprowadzeniem do tematu. Algorytmy te są w ciągłej ewolucji, powstają nowe odmiany już istniejących mapowań lub nowe rodzaje mapowań z połączenia już istniejących. Kilkunastoletnia praktyka i ciągły rozwój branży kart graficznych, pokazały iż w aplikacjach renderujących grafikę w czasie rzeczywistym, mapowanie detali jest udanym kompromisem pomiędzy wysoką wydajnością aplikacji wyświetlającej grafikę 3D a zachowaniem satysfakcjonującego poziomu szczegółowości geometrycznej wyświetlanych modeli.