Takémapa normálPokročilý
Definice
Normálová mapa je textura, která pro každý texel ukládá směr povrchové normály místo běžné barvy. Renderer podle těchto směrů upravuje výpočet osvětlení, takže plochá geometrie může působit jako členitý materiál v reálném čase. Skutečné vrcholy ani silueta modelu se tím obvykle nemění.
Proč reliéf nevzniká v geometrii
Normálová mapa řeší častý problém v 3D grafice: model má vypadat detailně, ale počet polygonů má zůstat rozumný. Místo toho, aby umělec modeloval každou rýhu, škrábanec nebo drobný šroub jako skutečnou geometrii, uloží změny směru povrchu do speciální textury. Renderer potom při osvětlování používá tyto uložené směry a vytvoří dojem drobného reliéfu.
Normálová mapa tedy nemění tvar objektu. Okraj modelu zůstane stejný, kolize ve hře se nezpřesní a kamera při pohledu z boku neodhalí skutečně vystouplý profil. Výhoda je rychlost: výpočet osvětlení je levnější než vykreslování tisíců dodatečných trojúhelníků.
Co zapisuje barva v normálové mapě
Barvy v normálové mapě nejsou barvy materiálu. Kanály RGB obvykle reprezentují složky vektoru X, Y a Z. Hodnota se při čtení převádí z rozsahu 0 až 1 na směr kolem povrchu. Proto běžné tangent-space normálové mapy často vypadají modrofialově: většina normál míří přibližně ven z povrchu a jen lokálně se odklání.
Normálová mapa potřebuje správné UV mapování, pokud je uložena jako 2D obrázek. Důležitá je také shoda mezi nástrojem, který mapu vytvořil, a enginem, který ji čte. Některé workflow mají zelený kanál orientovaný opačně, takže se prohlubně mohou po importu tvářit jako vyvýšeniny.
Normálová mapa ve shaderu
Shader při výpočtu osvětlení vezme normálu z mapy, převede ji do použitého prostoru a porovná se směrem světla. U tangent-space mapy se používá báze TBN: tangent, bitangent a původní normála povrchu. Bez správné báze by stejné pixely dávaly jiný výsledek na různě natočených částech modelu.
Normálová mapa se v PBR materiálech kombinuje s albedem, roughness a metalness. Samotná mapa normál neurčuje barvu ani lesklost, pouze ovlivňuje, jak světlo dopadá a odráží se. Výsledné vnímání detailu proto závisí i na světlech, úhlu kamery a nastavení materiálu ve shaderu.
Dva příklady z praxe
Kožený batoh ve hře
Herní model batohu má jednoduchou polygonální síť, protože se na scéně objevuje ve velkém počtu. Normálová mapa přidá švy, jemnou strukturu kůže a otlaky kolem přezek. Hráč vidí bohatší povrch, ale engine pořád posílá do GPU výrazně jednodušší geometrii.
WebGL materiál s drobnými rýhami
Webová konfigurace produktu může načíst normálovou mapu pro plastový kryt, aby rýhy reagovaly na otočení světla. Fragment shader převede hodnoty z textury na vektor a použije jej pro difuzní složku osvětlení.
vec3 n = texture(normalMap, vUv).rgb * 2.0 - 1.0;
n.xy *= normalScale;
n = normalize(TBN * n);
float light = max(dot(n, normalize(lightDir)), 0.0);Krátká ukázka neřeší celý materiál, ale ukazuje podstatu: normálová mapa mění normálu použitou pro světlo, nikoli souřadnice vrcholů.
Příklady z praxe
Obrácený zelený kanál po importu do Unity
Grafik připravil normálovou mapu skalní stěny v programu 3ds Max a exportoval ji do Unity. Ve hře se prohlubně mezi kameny tvářily jako vystouplé hrany a osvětlení působilo nepřirozeně při pohybu slunce. Příčinou byla odlišná orientace zeleného kanálu mezi DirectX a OpenGL konvencí. Tým problém vyřešil dávkovou invertací zeleného kanálu u všech dvaačtyřiceti textur a do dokumentace pipeline doplnil povinný formát OpenGL, aby se chyba neopakovala u dalších assetů.
// Invertace zeleného kanálu ve fragment shaderu vec3 packed = texture(normalMap, vUv).rgb; vec3 n = packed * 2.0 - 1.0; n.g = -n.g; // převod DirectX -> OpenGL n = normalize(TBN * n);Silueta dlažby prozradila plochou geometrii
Architektonická vizualizace terasy používala jednu velkou plochu se normálovou mapou dlažebních kostek. Při pohledu zpředu vypadal povrch přesvědčivě, ale renderovaná animace s nízkou kamerou u země ukázala, že obrys terasy je naprosto rovná linka bez vystouplých spár. Klient si stěžoval na nepřirozený vzhled. Studio nahradilo krajní pás dlažby skutečnou geometrií a normálovou mapu ponechalo jen pro vzdálenější části plochy, kde silueta není vidět.
Časté omyly
- MýtusNormálová mapa přidá do modelu skutečné detaily.
- Ve skutečnostiNormálová mapa nemění geometrii modelu, pouze ovlivňuje výpočet osvětlení. Silueta objektu, kolize a skutečný objem zůstávají stejné.
- MýtusNormálová mapa je totéž co černobílá bump mapa.
- Ve skutečnostiNormálová mapa ukládá přímo směr normály ve více kanálech, zatímco bump mapa nebo height mapa obvykle popisuje výšku v jednom kanálu. Výsledek může vypadat podobně, ale data a zpracování nejsou stejná.
- MýtusKdyž normálová mapa vypadá hezky v Blenderu, bude automaticky správná i v enginu.
- Ve skutečnostiNormálová mapa může v různých nástrojích vyžadovat jinou konvenci tangentů nebo orientaci zeleného kanálu. Při exportu je nutné ověřit nastavení materiálu a cílového rendereru.
Časté dotazy
- Proč normálová mapa často vypadá modře?
- Normálová mapa v tangent space často vypadá modrofialově, protože kanály RGB nekódují viditelnou barvu, ale směr normály. Modrý kanál odpovídá složce, která obvykle míří ven z povrchu, a proto bývá vysoký na většině pixelů. Červený a zelený kanál popisují odklon do stran, takže se výrazněji mění jen kolem detailů.
- Kdy má normálová mapa přednost před větším počtem polygonů?
- Normálová mapa má přednost tehdy, když detail ovlivňuje hlavně osvětlení, ale nemusí měnit obrys objektu. Jemné póry, škrábance, rytiny nebo drobné švy jsou typické případy. Skutečná geometrie je vhodnější pro velké výstupky, ostré hrany, viditelnou siluetu nebo prvky, které mají vrhat přesné stíny a účastnit se kolizí.
- Proč se po importu normálová mapa jeví obráceně?
- Normálová mapa se po importu může jevit obráceně, pokud zdrojový nástroj a cílový engine používají odlišnou orientaci zeleného kanálu. Výsledek vypadá tak, že důlky se chovají jako hrbolky nebo naopak. Běžná oprava je invertovat zelený kanál, případně v materiálu přepnout volbu typu OpenGL nebo DirectX podle konvence daného nástroje.
- Potřebuje normálová mapa UV mapování?
- Normálová mapa obvykle potřebuje UV mapování, protože jde o 2D texturu navázanou na povrch modelu. Bez UV souřadnic renderer neví, který texel má použít na konkrétním místě polygonu. Existují i procedurální nebo triplanární přístupy, ale v běžném herním, webovém a filmovém workflow se normálové mapy nejčastěji řídí UV rozložením.
Zdroje
- glTF 2.0 Specification(otevře se v novém okně)
- Bump Mapping (Direct3D 9)(otevře se v novém okně)
- Normal mapping(otevře se v novém okně)