3D technologie: Displacement Mapping
29.7.2004, Zdeněk Kabát, článek
Minulý týden jsme Vám přinesli popis 3D techniky Bump Mapping, která se používá v grafických čipech již hezkou řádku let. Dnes přichází řada na úplnou novinku v online renderingu, a tou je Displacement Mapping. Tato metoda je hardwarově podporována od Shader Modelu 3.0 a pomocí 2D textury fyzicky upravuje geometrický detail objektu.
Kapitoly článku:
- 3D technologie: Displacement Mapping
- Implementace Displacement mappingu
- Výhody a nevýhody DM
Implementace Displacement Mappingu
Pokud jste četli minulý článek o Bump Mappingu, konkrétně kapitolu o normálovém mapování, musíte mít již představu o tom, jak pracuje Displacement Mapping. Stejně jako u normálového mapování zde máme 2D texturu, tentokrát displacement mapu (8- nebo 16-bitová). Ta obsahuje, podle úrovně detailů, informace o posunech každého vrcholu podél určitého vektoru, čili normály. Jedná se tedy o per-vertex metodu (nikoliv per-pixel jako u normálového mapování).
V případě, že by displacement mapa přesně odpovídala danému modelu, nedošlo by k žádnému zvýšení geometrického detailu. Proto musí být každý polygon rozčleněn na menší trojúhelníky, jejichž vrcholy jsou tedy i novými vrcholy daného objektu. Každý tento vrchol na objektu, jak původní, tak i nově vzniklý, se poté přemístí podle hodnoty uložené v displacement mapě.
Takto vysvětleno by se zdál DM jako triviální záležitost. Problém, resp. největší množství práce tkví v tom, že jednotlivé trojúhelníky je třeba rozdělit na menší, aby bylo možné Displacement Mapping aplikovat. K tomu se používají různé algoritmy, kterých je hned několik. Podívejme se na to ten nejdůležitější.
Adaptive tessellation
Jeden způsob rozdělení scény je adaptivní mozaikování (adaptive tessellation). Zatímco fixed tessellation rozdělí všechny trojúhelníky na dané scéně rovnoměrně, adaptivní metoda šetří mnohem více grafické jádro. Díky této technice, která je opět součástí specifikace DirectX 9.0, jsou polygony v blízkosti pozorovatele rozděleny nejvíce, zatímco vzdálené trojúhelníky naopak své detaily sníží (tzv. depth-adaptive tessellation).
Aplikace Displacement Mappingu
Abychom mohli techniku Displacement Mappingu použít, potřebujeme tato zdrojová data:
Model s nízkými detaily musí být vytvořen tak, aby byla následná aplikace displacement mappingu co nejjednodušší. Lidská postava může takto obsahovat kolem 100 polygonů, což samozřejmě závisí na tom, jak detailní chceme výsledný model. Tento nízko-polygonový model bývá odvozen od vysoko-polygonového a to automaticky či poloautomaticky.
Vytvoření displacement mapy a normálové mapy
Kromě displacement mapy se zároveň vytváří i normálová mapa, která ještě dokáže zvýšit detaily osvětlení. Normálová mapa je obvykle podrobnější, protože obsahuje data pro každý pixel, zatímco displacement mapa pro každý vrchol (samozřejmě i pro nově vytvořené). Navíc je normálová mapa 24-bitová (8 bitů pro každou souřadnici XYZ), ale displacement mapa jen 8- nebo 16-bitová. Je to způsobeno tím, že neobsahuje vektorová, ale skalární data.
Obr. 6 - Normálová mapa, displacement mapa a textura aplikované na nízko-polygonový model
Klikněte pro zvětšení
Obě tyto mapy lze vytvořit ručně v nějakém profesionálním softwaru. Častější ovšem bývá jejich odvození od vysoko-polygonového modelu. Díky unikátnímu mapování odpovídá každý texel detailního modelu právě jednomu texelu na nízko-polygonovém modelu. Z nízkodetailního modelu je vyslán paprsek, který se v určitém bodě protne s detailním modelem. Vektor tohoto paprsku je poté zapsán do normálové mapy, zatímco jeho délka do displacement mapy.
I zde jsou ale jistá omezení. Protože se jedná o výškovou mapu, nemohou se do displacement mapy kódovat různé záhyby apod., kde by jednomu bodu na mapě de facto odpovídaly dva texely původního modelu. Proto musí nakonec model projít několika "lidskými" úpravami, kde programátoři pozmění data v mapách.
Pokud jste četli minulý článek o Bump Mappingu, konkrétně kapitolu o normálovém mapování, musíte mít již představu o tom, jak pracuje Displacement Mapping. Stejně jako u normálového mapování zde máme 2D texturu, tentokrát displacement mapu (8- nebo 16-bitová). Ta obsahuje, podle úrovně detailů, informace o posunech každého vrcholu podél určitého vektoru, čili normály. Jedná se tedy o per-vertex metodu (nikoliv per-pixel jako u normálového mapování).
V případě, že by displacement mapa přesně odpovídala danému modelu, nedošlo by k žádnému zvýšení geometrického detailu. Proto musí být každý polygon rozčleněn na menší trojúhelníky, jejichž vrcholy jsou tedy i novými vrcholy daného objektu. Každý tento vrchol na objektu, jak původní, tak i nově vzniklý, se poté přemístí podle hodnoty uložené v displacement mapě.
Takto vysvětleno by se zdál DM jako triviální záležitost. Problém, resp. největší množství práce tkví v tom, že jednotlivé trojúhelníky je třeba rozdělit na menší, aby bylo možné Displacement Mapping aplikovat. K tomu se používají různé algoritmy, kterých je hned několik. Podívejme se na to ten nejdůležitější.
Adaptive tessellation
Jeden způsob rozdělení scény je adaptivní mozaikování (adaptive tessellation). Zatímco fixed tessellation rozdělí všechny trojúhelníky na dané scéně rovnoměrně, adaptivní metoda šetří mnohem více grafické jádro. Díky této technice, která je opět součástí specifikace DirectX 9.0, jsou polygony v blízkosti pozorovatele rozděleny nejvíce, zatímco vzdálené trojúhelníky naopak své detaily sníží (tzv. depth-adaptive tessellation).
Aplikace Displacement Mappingu
Abychom mohli techniku Displacement Mappingu použít, potřebujeme tato zdrojová data:
- Displacement mapa (pro posun vrcholů)
- Normálová mapa (pro výpočet osvětlení)
- Model s nízkými detaily
- Texturové mapování pro aplikaci map
Model s nízkými detaily musí být vytvořen tak, aby byla následná aplikace displacement mappingu co nejjednodušší. Lidská postava může takto obsahovat kolem 100 polygonů, což samozřejmě závisí na tom, jak detailní chceme výsledný model. Tento nízko-polygonový model bývá odvozen od vysoko-polygonového a to automaticky či poloautomaticky.
Vytvoření displacement mapy a normálové mapy
Kromě displacement mapy se zároveň vytváří i normálová mapa, která ještě dokáže zvýšit detaily osvětlení. Normálová mapa je obvykle podrobnější, protože obsahuje data pro každý pixel, zatímco displacement mapa pro každý vrchol (samozřejmě i pro nově vytvořené). Navíc je normálová mapa 24-bitová (8 bitů pro každou souřadnici XYZ), ale displacement mapa jen 8- nebo 16-bitová. Je to způsobeno tím, že neobsahuje vektorová, ale skalární data.
Obr. 6 - Normálová mapa, displacement mapa a textura aplikované na nízko-polygonový model
Klikněte pro zvětšení
Obě tyto mapy lze vytvořit ručně v nějakém profesionálním softwaru. Častější ovšem bývá jejich odvození od vysoko-polygonového modelu. Díky unikátnímu mapování odpovídá každý texel detailního modelu právě jednomu texelu na nízko-polygonovém modelu. Z nízkodetailního modelu je vyslán paprsek, který se v určitém bodě protne s detailním modelem. Vektor tohoto paprsku je poté zapsán do normálové mapy, zatímco jeho délka do displacement mapy.
I zde jsou ale jistá omezení. Protože se jedná o výškovou mapu, nemohou se do displacement mapy kódovat různé záhyby apod., kde by jednomu bodu na mapě de facto odpovídaly dva texely původního modelu. Proto musí nakonec model projít několika "lidskými" úpravami, kde programátoři pozmění data v mapách.