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.