displejsment mapaTakéDisplacement mapping, Výšková mapa posunu, Disp mapaPokročilý
Definice
Displacement mapa je textura, jejíž hodnoty určují, o kolik se má každý bod povrchu 3D modelu fyzicky posunout podél normály. Na rozdíl od normálové mapy tedy mění skutečnou geometrii: vzniká reliéf s vlastním obrysem, správným stínem i samostíněním. Vyžaduje ale hustou síť trojúhelníků nebo tesselaci přímo na GPU.
Než se na to spolehnete: Vector displacement se v praxi ukládá nejčastěji v EXR, ale konkrétní formát se liší podle rendereru (Arnold, Cycles, RenderMan); text to proto uvádí jako typickou volbu, ne jako pravidlo. Odkaz na docs.blender.org je na kořen manuálu, nikoli na konkrétní stránku displacementu.
Co displacement mapa dělá s geometrií
Displacement mapa je obvykle jednokanálová textura (heightmap), kde hodnota pixelu znamená vzdálenost. Renderer nebo shader načte hodnotu na daných UV souřadnicích, přepočítá ji na jednotky scény a posune vrchol povrchu ve směru jeho normály. Rovná plocha se tak promění ve skutečně nerovný povrch: dlažba má vystouplé kostky, kůra stromu má rýhy, terén má kopce.
Klíčové slovo je „skutečně“. Zatímco normálová mapa jen ohýbá vektory použité při výpočtu osvětlení, displacement mění pozice bodů. Proto reliéf vidíte i na siluetě modelu, vrhá stín na sebe sama a při pohledu ze strany nezmizí.
Proč to není zadarmo
Posunout se dá jen to, co existuje. Pokud má plocha čtyři vrcholy, displacement mapa s tisíci detaily nemá co posouvat. Geometrii je nutné rozdělit: buď předem v polygonální síti (subdivision), nebo za běhu tesselací na GPU. Obojí stojí paměť a výkon, a čím jemnější detail chcete, tím víc trojúhelníků potřebujete.
Z toho plyne praktické dělení práce. Ve filmové a offline produkci se displacement počítá při renderu z husté sítě a jde o standardní nástroj. V realtime enginech se používá střídmě: na terén, na blízké povrchy a na LOD úrovně blízko kamery, jinde ho nahradí normálová mapa nebo parallax occlusion mapping.
Vector displacement
Běžná displacement mapa posouvá jen podél normály, takže neumí převisy: houbu, oblou nýtku ohnutou do strany. Vector displacement ukládá do tří kanálů celý vektor posunu (XYZ), takže bod může jít libovolným směrem. Takové mapy se ukládají v 16bitovém nebo 32bitovém formátu, typicky EXR, protože 8 bitů na kanál by způsobilo viditelné schody.
Vazba na UV a bit depth
Displacement se čte přes UV mapování, takže švy v UV se projeví jako trhliny v geometrii. Stejně tak 8bitová PNG mapa má jen 256 úrovní výšky; na jemném terénu z toho vzniknou terasy. Pro displacement se proto téměř vždy volí 16bitový nebo plovoucí formát.
Odkud se displacement mapy berou
Nejčastěji vznikají tzv. bakingem: umělec vymodeluje vysokopolygonální model v sochařském nástroji, a ten se promítne na nízkopolygonální verzi jako textura rozdílu. Druhou cestou jsou procedurální mapy generované šumem přímo v shaderu, typické pro terén a vodní hladinu. Třetí zdroj tvoří skenovaná data, například výškopis krajiny nebo fotogrammetrie materiálů.
Jak se liší od bump a normálové mapy
- Bump mapa: šedotónová, upravuje jen normálu pro osvětlení, geometrie zůstává rovná.
- Normálová mapa: barevná (RGB jako XYZ normály), přesnější než bump, ale opět bez změny obrysu.
- Displacement mapa: mění pozice vrcholů, ovlivňuje siluetu, stín i kolizi s okolím.
V produkci se kombinují: displacement nese hrubý tvar, normálová mapa dodá jemný detail, který by vyžadoval nesmyslně hustou síť. Nastavení se řídí v shaderu nebo v materiálu rendereru.
Příklady z praxe
Dlažba v architektonické vizualizaci
Plocha chodníku má v materiálu displacement mapu z fotogrammetrického skenu dlažebních kostek. Bez subdivize vypadá plocha rovně, po zapnutí adaptivní subdivize v rendereru se kostky vysunou a začnou vrhat stíny do spár. Na okraji chodníku je vidět nerovný obrys, což normálová mapa nedokáže.
Posun vrcholů ve vertex shaderu
V realtime enginu se výška terénu čte z 16bitové heightmapy přímo ve vertex shaderu. Textura se vzorkuje pomocí textureLod, protože ve vertex fázi neexistují automatické derivace pro výběr mipmapy. Škálovací konstanta převádí normalizovanou hodnotu 0 až 1 na metry ve scéně.
#version 330 core layout(location = 0) in vec3 aPos; layout(location = 1) in vec3 aNormal; layout(location = 2) in vec2 aUV; uniform sampler2D uDisplacement; uniform float uScale; // maximalni vyska v metrech uniform mat4 uMVP; void main() { float h = textureLod(uDisplacement, aUV, 0.0).r; vec3 displaced = aPos + aNormal * (h * uScale); gl_Position = uMVP * vec4(displaced, 1.0); }
Časté omyly
- MýtusDisplacement mapa a normálová mapa dělají v podstatě totéž, jen jinak vypadají.
- Ve skutečnostiNormálová mapa mění pouze vstup do výpočtu osvětlení, geometrie zůstává rovná a na siluetě je detail neviditelný. Displacement mapa posouvá skutečné vrcholy, takže mění obrys, samostínění i to, jak povrch protíná jiné objekty.
- MýtusStačí přiřadit displacement mapu do materiálu a detail se objeví.
- Ve skutečnostiDisplacement potřebuje dost vrcholů, které může posouvat. Bez subdivize sítě nebo tesselace se na modelu se čtyřmi vrcholy neprojeví prakticky nic.
- MýtusNa displacement mapu stačí obyčejné 8bitové PNG jako na diffuse texturu.
- Ve skutečnosti8 bitů dává jen 256 úrovní výšky a na plynulých površích, hlavně na terénu, z toho vzniká viditelné schodovité terasování. Pro displacement se používá 16bitový nebo plovoucí formát, typicky EXR nebo 16bit PNG či TIFF.
Časté dotazy
- Jaký formát a bitovou hloubku zvolit pro displacement mapu?
- Pro displacement mapu se doporučuje minimálně 16 bitů na kanál, ideálně 32bitový float. Praktické volby jsou EXR pro plovoucí čísla a 16bitové PNG nebo TIFF pro celočíselné hodnoty. Osmibitový formát nabízí jen 256 úrovní výšky, což na velkých plynulých plochách vytváří viditelné schody. U vector displacement je vyšší hloubka nutná vždy, protože se ukládá celý vektor posunu ve třech kanálech a chyba se projeví ve všech osách současně.
- Kdy použít displacement mapu místo normálové mapy?
- Displacement mapa se vyplatí tam, kde je detail dostatečně velký na to, aby byl vidět na obrysu objektu nebo aby měl vrhat stín sám na sebe: hluboké spáry dlažby, kamenná zeď zblízka, terén, vlny na vodě. Pro jemnou strukturu, jako jsou póry kůže, škrábance nebo tkanina, stačí normálová mapa, protože rozdíl na siluetě je nepostřehnutelný a náklad na geometrii by byl neúměrný.
- Proč se v displacement mapě objevují trhliny na švech UV?
- Trhliny vznikají tehdy, když sousedící vrcholy patří ke dvěma různým UV ostrovům a každý načte z textury mírně jinou hodnotu výšky. Posun je pak různý a plocha se rozevře. Řešením je zajistit shodné hodnoty na hranách švů, například bakingem s dostatečným paddingem, srovnáním hodnot na okrajích ostrovů, použitím bezešvého procedurálního zdroje nebo mapováním, které švy vede přes místa se stejnou výškou.
- Zpomaluje displacement mapa render výrazně?
- Displacement mapa zatěžuje především paměť a čas přípravy geometrie, ne samotné texturování. Adaptivní subdivize v offline rendererech dokáže vytvořit miliony mikropolygonů na jeden objekt, což mnohonásobně zvedne paměťovou stopu. V realtime enginu je limitem propustnost tesselační jednotky a počet vzorků textury ve vertex fázi. Náklad se dá držet na uzdě omezením displacementu na blízké objekty a použitím normálové mapy pro vzdálenější úrovně detailu.
Zdroje
- Displacement mapping(otevře se v novém okně)
- Blender Manual(otevře se v novém okně)
- OpenGL Registry(otevře se v novém okně)
- Bump mapping(otevře se v novém okně)