bamp mapaTakéBump mapping, Mapa nerovností, Height map (výšková mapa)Pokročilý

Definice

Bump mapa je šedotónová textura, která pro každý bod povrchu udává relativní výšku a slouží k výpočtu vychýlených normál při stínování. Geometrie modelu se nemění, mění se jen směr, kterým povrch odráží světlo, takže hladký polygon vypadá zvrásněně: cihlová spára, kůže, tepaný kov nebo výbrus dřeva.

Kategorie: Grafické programováníAktualizováno

Odkud se bere iluze nerovnosti

Bump mapa využívá toho, že lidské oko posuzuje tvar povrchu především podle stínování, ne podle siluety. Renderer počítá barvu pixelu z úhlu mezi světlem a normálou povrchu. Když se před tímto výpočtem normála mírně nakloní podle gradientu šedotónové textury, vzniknou světlejší a tmavší plošky přesně tam, kde by je vytvořila skutečná prohlubeň nebo výstupek.

Podstatné je, že se do výpočtu nedostane žádný nový vrchol. Trojúhelníky polygonální sítě zůstávají tam, kde byly, a technika se odehrává celá ve fragment fázi shaderu. Metodu popsal James Blinn v roce 1978 a dodnes je základem celé rodiny příbuzných postupů.

Jak se čte šedotónová hodnota

Bump mapa se interpretuje jako výšková funkce: černá znamená nejnižší bod, bílá nejvyšší, střední šedá neutrální úroveň. Shader nepoužívá samotnou hodnotu, ale její derivaci ve dvou směrech UV souřadnic. Rovná plocha textury tedy nemá na stínování žádný vliv, zatímco prudký přechod z tmavé do světlé vytvoří výraznou hranu.

Z toho plyne praktické pravidlo: v bump mapě rozhoduje kontrast mezi sousedními pixely, ne absolutní jas. Rovnoměrné zesvětlení celé textury nezmění vzhled vůbec, kdežto rozmazání detailu hrany okamžitě změkčí.

Bump, normal a displacement vedle sebe

TypObsah kanálůMění geometrii
Bump mapajeden kanál, výškane
Normal mapatři kanály, vektor normályne
Displacement mapajeden kanál, výškaano, posouvá vrcholy

Normal mapa nese hotový vektor a je proto rychlejší i přesnější, hlavně u detailu zapečeného z high-poly modelu. Bump mapa je zato snadno ručně malovatelná a čitelná okem, což se hodí u procedurálních materiálů. Displacement dává skutečný tvar, ale za cenu husté sítě nebo teselace.

Kde iluze praskne

Bump mapa selže všude, kde by měl reliéf zasáhnout do tvaru. Obrys objektu zůstane dokonale rovný, takže cihlová zeď při pohledu zboku vypadá jako papír. Nerovnosti nevrhají vlastní stíny na sebe ani nezakrývají jedna druhou, což je znát při ostrém světle pod malým úhlem. Chybí i parallax, takže při pohybu kamery se detail nechová jako hmota s hloubkou.

Pro malé, husté a mělké struktury tyto nedostatky nikdo nepozná a bump mapa zůstává nejlevnějším způsobem, jak dostat do materiálu mikrodetail. Pro hluboké drážky, nýty nebo dlažební kostky u kamery je namístě normal mapa v kombinaci s displacementem nebo rovnou modelovaná geometrie.

Příklady z praxe

  1. Omítka v architektonické vizualizaci

    Stěna je jediný obdélník se dvěma trojúhelníky. Do materiálu se připojí šedotónový sken hrubé omítky jako bump mapa s malou intenzitou, řádově setiny metru. Render dostane věrohodnou strukturu povrchu bez jediného vrcholu navíc a scéna se stovkami stěn zůstane lehká.

  2. Výpočet vychýlené normály ve fragment shaderu

    Shader načte výšku ve třech bodech, dopočítá gradient v UV směrech a tímto gradientem nakloní původní normálu. Krok texelSize odpovídá jednomu pixelu bump mapy, intenzita řídí sílu efektu. Snížení intenzity na nulu vrátí hladké stínování.

    float hL = texture(bumpMap, uv - vec2(texelSize.x, 0.0)).r;
    float hR = texture(bumpMap, uv + vec2(texelSize.x, 0.0)).r;
    float hD = texture(bumpMap, uv - vec2(0.0, texelSize.y)).r;
    float hU = texture(bumpMap, uv + vec2(0.0, texelSize.y)).r;
    
    vec3 gradient = vec3((hL - hR) * intensity, (hD - hU) * intensity, 1.0);
    vec3 N = normalize(TBN * gradient);

Časté omyly

MýtusBump mapa přidá modelu detail, takže nepotřebuju hustou síť.
Ve skutečnostiBump mapa ovlivňuje pouze stínování uvnitř plochy. Silueta objektu zůstane přesně taková, jakou určuje polygonální síť, a při pohledu z boku iluze zmizí.
MýtusBump mapa a normal mapa jsou dvě jména pro totéž.
Ve skutečnostiBump mapa je jednokanálová výška, ze které se normála teprve dopočítává. Normal mapa už obsahuje hotový vektor ve třech kanálech, je přesnější a zvládne i nerovnosti se zkoseným směrem, které z výšky nevyplynou.
MýtusModrofialovou texturu z bakingu můžu použít jako bump mapu.
Ve skutečnostiModrofialová textura je tangent-space normal mapa a do slotu pro bump mapu nepatří. Renderer by její kanály interpretoval jako výšku a stínování by vyšlo chybně; většina nástrojů proto nabízí oddělené vstupy.

Časté dotazy

Jak vyrobit bump mapu z fotografie materiálu?
Bump mapu lze z fotografie odvodit převodem do stupňů šedi, ale samotný jas není výška. Fotografie obsahuje zapečené stíny a barevné skvrny, které se pak projeví jako falešné hrbolky. Praktický postup je odstranit nerovnoměrné osvětlení, potlačit barevné variace, ponechat jen strukturu povrchu a výsledek zkontrolovat renderem se světlem pod ostrým úhlem. U pravidelných materiálů, jako je dlažba nebo pletivo, bývá spolehlivější bump mapu namalovat nebo vygenerovat proceduráně než ji dolovat z fotky.
Proč bump mapa v renderu skoro není vidět?
Nejčastější příčinou je příliš nízká intenzita ve vztahu k měřítku scény, protože hodnota se obvykle zadává v jednotkách modelu. Druhou příčinou bývá plošné, měkké osvětlení: bump mapa se projeví jen tam, kde světlo dopadá pod úhlem, takže rovnoměrná HDRI obloha efekt téměř vymaže. Zkontrolovat je vhodné také barevný prostor textury, která má být načtena jako nelineární data, a zda není textura zmenšena mipmapami natolik, že se detail vyhladil.
Jde bump mapu použít v reálném čase ve hře nebo na webu?
Bump mapa se v reálném čase používá, ale bývá nahrazena normal mapou. Důvodem je výkon: bump mapa vyžaduje několik čtení textury na fragment kvůli dopočtu gradientu, kdežto normal mapa stačí s jedním čtením. Ve WebGL a WebGPU knihovnách existuje samostatný bumpMap slot a hodí se pro rychlý mikrodetail nebo pro materiály generované proceduráně. Pro produkční herní obsah zůstává standardem normal mapa zapečená z high-poly modelu.
Kdy se vyplatí místo bump mapy sáhnout po displacementu?
Displacement se vyplatí tam, kde má být reliéf viditelný na obrysu objektu, kde má vrhat vlastní stín nebo kde po povrchu přejíždí kamera zblízka. Typicky jde o dlažební kostky, hrubě tesaný kámen, terén nebo kůru stromu v popředí. Cenou je výrazně vyšší nárok na paměť a čas, protože renderer musí síť teselovat na hustotu srovnatelnou s rozlišením textury. Běžná praxe kombinuje obojí: displacement nese velké tvary, bump nebo normal mapa dodává jemnou strukturu.

Zdroje

  1. Bump mapping(otevře se v novém okně)Wikipedia
  2. OpenGL Shading Language(otevře se v novém okně)Khronos Group
  3. Simulation of wrinkled surfaces(otevře se v novém okně)ACM, 1978

Související pojmy

Potřebujete to vyřešit v praxi?

Poradíme, jak na to ve vašem projektu

Vysvětlit pojem je jedna věc, navrhnout kolem něj funkční řešení druhá. Ozvěte se a probereme, co dává smysl u vás.