20. července 2011

Normal mapping - 3. část

Dnes ukončím třetím dílem seriál článků o normal mappingu, článek bude tentokrát trochu delší a pokusím se v něm dovysvětlit další důležité informace a některé triky.

V minulém díle jsem popsal jak vygenerovat normálovou mapu z highpoly modelu. Pokud je ale model složitější a obsahuje mnoho konkávních tvarů, budou se takto promítat některé části modelu na jiné, kam nepatří. Tomu zabráníme využitím tzv. klecí - cages a rozřezáním objektu na více částí. Co je to cage a jak ji použít jsme si již řekli v předchozích dvou dílech. Dnes pouze dodám, že stejně jako v 3ds maxu lze klec použít i v xNormal. Stačí manuálně přidat modifikátor Projection, který známe již z minulého dílu (v ostatních 3D programech bude jistě obdobná funkce), s jeho pomocí nastavíme cage na lowpoly modelu a exportujeme pomocí xNormal .sbm exporteru, použijeme přitom nastavení Export Cage ve skupině Options a při přidávání lowpoly modelu v xNormal zaškrtneme Use Cage. Můžeme také specifikovat cage model z externího souboru (musí mít stejnou topologii a počet vertexů) pravým kliknutím na model ze seznamu a Browse external cage file.

Druhým zmíněným trikem je rozřezání modelu na více částí. Většinou je zapotřebí využití obou technik zároveň. Obě verze modelu (lowpoly a highpoly) tedy rozdělíme na stejné části:



V případě generování v 3ds maxu od sebe v prostoru posuneme tyto objekty dále (odpovídající lowpoly a highpoly na stejná místa), vytvoříme klece a dále je vše stejné. V případě xNormal exportujeme každou část zvlášť a všechny poté vložíme do seznamu lowpoly / highpoly objektů v xNormal. Poté je ale potřeba vždy označit pouze jednu část a jí odpovídající highpoly, vygenerovat pro ní NM a toto opakovat pro všechny díly. Pro ulehčení práce alespoň při exportu z maxu jsem napsal jednoduchý skript, stáhnout si ho můžete zde (český popis je v komentářích po otevření souboru v textovém editoru).

Další věcí, kterou je potřeba při vytváření modelů pro generování NM dodržet je synchronizace smoothing groups s "ostrovy" v UV souřadnicích. Mez mezi dvěma těmito skupinami tedy musí souhlasit s vnější hranou jednoho spojitého kusu geometrie na UV. Je to proto, že interně  herní engine (i vykreslovací technologie pro viewport) pro vertexy ležící na hranici smooth groups vytváří dvě normály k dosažení efektu ostré hrany (viz článek Smooting a stínování). To samé ale dělají i hranice ostrovů v souřadnicích textury. Aby generovaná normálová mapa vypadala všude správně, měly by proto být dvojité normály synchronizované.

Co jsem uvedl v předchozím odstavci je však zjednodušené. Ve hře se totiž nevytvoří pouze vertex se dvěma normálami, ale dva vertexy, každý s jednou normálou. Narůstá tedy počet vertexů v modelu, což může ve větším počtu být nežádoucí, navíc ostré hrany v pravém úhlu nevypadají vždy nejlépe. To lze trochu obejít vytvořením hladkých zaoblených hran na highpoly modelu, ale ne vždy to stačí a nese to s sebou případné problémy při generování NM (viz první díl seriálu). V některých případech je tedy lepší využít zkosení hrany a nechat obě strany včetně zkosení v jedné smooth group. Pokud zkosení bude pouze z jednoho segmentu, je možné že NM nezachytí úhel normál pixelů úplně ideálně, zvláště při optimalizovaném vykreslování ve hře. Jedním trikem je potom modifikovat směr normál přilehlých vertexů - viz obrázek:



Herní enginy využívají pro zobrazení textur tzv. MIP mapy, tzn. že ve výsledné textuře uložené v balíčku herních dat je nejen textura v původní velikosti, ale zároveň několik jejích vždy o polovinu menších verzí. Menší verze se vykresluje na vzdálenějším modelu ve scéně. Nebudu zacházet do detailů, ale je důvod proč to zmiňuji. Když se totiž zmenší textura, sníží se počet pixelů, které obsahuje, je nutné umisťovat kontrastní části, které se nachází v textuře vedle sebe dále od sebe, jinak by se mohla barva z jedné části na modelu objevit na druhé části, kam nepatří. A s tím ještě souvisí nastavení při generování normálové mapy (i jiných textur, viz dále). Tím nastavením je padding, ten udává, jak daleko od UV ostrovu se ještě budou kopírovat pixely stejné barvy, právě pro zamezení chyb vlivem MIP mappingu a velikostí textury. Např. v xNormal se toto nastavení nachází v Baking options pod názvem Edge padding. Ještě uvedu přibližné doporučené hodnoty pro používané velikosti textur:



Do této chvíle jsem popisoval jak se pokud možno vyvarovat chyb v generování normálové mapy ještě před jejím vytvořením. I tak se to ale ne vždy povede a i když by bylo třeba možné to napravit, je daleko rychlejší upravit pouze výslednou texturu. Pokud vzniknou např menší chyby v projekci částí kam napatří, pomůže klonovací razítko ve photoshopu. Pro efekt vlnících se pruhů na válcích je dobrý nástroj rozmazání (stačí horizontální či vertikální pruh jednou přejet tímto nástrojem) a na mnoho dalších triků, co ještě lze zaretušovat určitě přijdete sami.

Vizualizace ve 3D softwaru


Nyní již tedy umíme vygenerovat normálovou mapu z highpoly modelu, jak teď ale zobrazit výsledek ještě mimo engine v 3D aplikaci bez nutnosti renderu? Pro tento účel existují různé viewport shadery, placené i freeware. Z nabídky pro 3ds max mohu doporučit Xoliul's shader – ke stažení zde. Jeho použití je jednoduché. Jako typ materiálu vyberte DirextX shader a po rozkliknutí velkého tlačítka pro výběr shaderu vyberte právě stažený soubor. Zobrazí se samotné nastavení shaderu, které je popsáno na webu autora. Mimo zobrazení vlivu normálové mapy ve viewportu dokáže simulovat také specular, emissive a další textury a efekty jako je fresnel. Výsledek bude vždy trochu jiný od použitého engine, ale neměl by se lišit příliš. Pozor si dejte hlavně u specular textur, ty se mezi různými herními enginy liší hodně.

Generování NM v 2D aplikacích


Vytváření normálových map z highpoly modelu je sice nejkvalitnější metodou, ne však jedinou. Další možností jak ji vytvořit je její generování z 2D obrázku, tzv. bump mapy či height mapy. Bílé pixely na takovém obrázku znázorňují, že se budou jevit ve výsledku výše, černé níže a mezi nimi samozřejmě stupně šedi. Možností jak z takové textury vytvořit normálovu je mnoho. Jedním je např. plugin pro Photoshop, který se instaluje s xNormal. nVidia také vytvořila podobný PS filtr, ke stažení zde. Zajímavým řešením je také sada maker nDo. Nebudu zde nyní popisovat funkce každého z nich. Jen doplním, že je často velmi výhodné jejich použití pro malé detaily a různé vzory, které je rychlejší vytvořit takto, než je modelovat. Lze je potom přidat ke generované normálové mapě z highpoly pomocí upraveného overlay prolnutí. Makro pro takovou akci naleznete např. ve zmíněném nDo setu.

To bude dnes tedy vše a ukončím tím malý seriál článků. O normal mappingu toho lze říci ještě mnohem více, ale jako základ znalostí by to mohlo stačit a možná se k tomuto tématu ještě někdy vrátím.

Žádné komentáře:

Okomentovat