Mapování stínů - Shadow mapping

Scéna se stínovým mapováním
Scéna bez stínů

Stínové mapování nebo stínová projekce je proces, pomocí kterého jsou stíny přidávány do 3D počítačové grafiky . Tento koncept představil Lance Williams v roce 1978 v dokumentu s názvem „Vrhání zakřivených stínů na zakřivené povrchy“. Od té doby se používá jak v předem vykreslených scénách, tak ve scénách v reálném čase v mnoha konzolových a počítačových hrách.

Stíny se vytvářejí testováním, zda je pixel viditelný ze světelného zdroje, porovnáním pixelu se z-bufferem nebo hloubkovým obrazem pohledu zdroje světla, uloženého ve formě textury .

Princip stínu a stínové mapy

Pokud byste se dívali ven ze zdroje světla, všechny objekty, které vidíte, by se objevily ve světle. Cokoli za těmi objekty by však bylo ve stínu. Toto je základní princip použitý k vytvoření stínové mapy. Pohled světla je vykreslen a ukládá hloubku každého povrchu, který vidí (mapa stínů). Dále je vykreslena pravidelná scéna s porovnáním hloubky každého nakresleného bodu (jako by byl viděn světlem, nikoli okem) s touto hloubkovou mapou.

Tato technika je méně přesná než objemy stínů , ale stínová mapa může být rychlejší alternativou v závislosti na tom, kolik času vyplnění je pro každou techniku ​​v konkrétní aplikaci zapotřebí, a proto může být vhodnější pro aplikace v reálném čase. Stínové mapy navíc nevyžadují použití dalšího vyrovnávací paměti vzorníku a lze je upravit tak, aby vytvářely stíny s měkkým okrajem. Na rozdíl od stínových svazků je však přesnost stínové mapy omezena jejím rozlišením.

Přehled algoritmů

Vykreslení stínované scény zahrnuje dva hlavní kroky kresby. První vytváří samotnou stínovou mapu a druhá ji aplikuje na scénu. V závislosti na implementaci (a počtu světel) to může vyžadovat dva nebo více tahů kresby.

Vytvoření stínové mapy

Scéna vykreslená ze světelného pohledu.
Scéna z pohledu světla, hloubková mapa.

První krok vykresluje scénu z pohledu světla. U bodového světelného zdroje by pohled měl být perspektivní projekcí tak širokou, jak je požadovaný úhel účinku (bude to jakýsi čtvercový bodový reflektor). Pro směrové světlo (např. To ze Slunce ) by měla být použita ortografická projekce .

Z tohoto vykreslení se extrahuje a uloží vyrovnávací paměť hloubky. Protože jsou relevantní pouze informace o hloubce, je běžné vyhnout se aktualizaci vyrovnávacích pamětí barev a zakázat všechny výpočty osvětlení a textur pro toto vykreslování, aby se ušetřil čas kreslení. Tato mapa hloubky je často uložena jako textura v grafické paměti.

Tuto hloubkovou mapu je třeba aktualizovat vždy, když dojde ke změnám světla nebo objektů ve scéně, ale lze ji znovu použít v jiných situacích, například v situacích, kdy se pohybuje pouze pozorovací kamera. (Pokud existuje více světel, musí být pro každé světlo použita samostatná mapa hloubky.)

V mnoha implementacích je praktické vykreslit na stínovou mapu pouze podmnožinu objektů ve scéně, aby se ušetřil čas potřebný k překreslení mapy. Na vykreslování stínové mapy lze také použít posun hloubky, který objekty posouvá od světla, ve snaze vyřešit problémy sešívání, kde je hodnota mapy hloubky blízká hloubce kreslené plochy (tj. Vrhání stínů povrchu) v dalším kroku. Alternativně je někdy k podobnému výsledku použito vyřazení čelních ploch a pouze vykreslení zadní části objektů na mapu stínů.

Stínění scény

Druhým krokem je nakreslit scénu z obvyklého pohledu kamery pomocí stínové mapy. Tento proces má tři hlavní složky, první je najít souřadnice objektu při pohledu ze světla, druhý je test, který porovnává tuto souřadnici s hloubkovou mapou, a nakonec, jakmile je objekt dokončen, musí být nakreslen buď ve stínu nebo ve světle.

Souřadnice světelného prostoru

Vizualizace hloubkové mapy promítnuté na scénu

Aby bylo možné testovat bod na hloubkové mapě, musí být jeho poloha v souřadnicích scény transformována do ekvivalentní polohy, jak ji vidí světlo. Toho je dosaženo násobením matice . Umístění objektu na obrazovce je určeno obvyklou transformací souřadnic , ale pro umístění objektu ve světelném prostoru je nutné vygenerovat druhou sadu souřadnic.

Matice použitá k transformaci souřadnic světa na souřadnice pohledu světla je stejná jako ta, která byla použita k vykreslení stínové mapy v prvním kroku (v OpenGL je to produkt matice zobrazení modelu a projekce). To vytvoří sadu homogenních souřadnic, které potřebují perspektivní dělení ( viz 3D projekce ), aby se staly normalizovanými souřadnicemi zařízení , ve kterých každá složka ( x , y nebo z ) spadá mezi −1 a 1 (pokud je viditelná ze světla Pohled). Mnoho implementací (například OpenGL a Direct3D ) vyžaduje další násobení matice měřítka a předpětí pro mapování těchto hodnot −1 až 1 na 0 až 1, což jsou obvyklejší souřadnice pro vyhledávání hloubkové mapy (mapy textur). Toto škálování lze provést před rozdělením perspektivy a snadno se složí do předchozího výpočtu transformace vynásobením této matice následujícím:

Pokud se to provádí pomocí shaderu nebo jiného grafického hardwarového rozšíření, tato transformace se obvykle použije na úrovni vrcholů a vygenerovaná hodnota se interpoluje mezi další vrcholy a předá se na úroveň fragmentu.

Test hloubkové mapy

Selhání testu hloubkové mapy.

Jakmile jsou nalezeny souřadnice světelného prostoru, hodnoty x a y obvykle odpovídají umístění v textuře mapy hloubky a hodnota z odpovídá její přidružené hloubce, kterou lze nyní testovat na mapě hloubky.

Pokud je hodnota z větší než hodnota uložená v hloubkové mapě na příslušném ( x , y ) místě, je objekt považován za za okluzivním objektem a měl by být označen jako selhání , které má kresba vykreslit ve stínu proces. V opačném případě by měl být nakreslen rozsvícen.

Pokud umístění ( x , y ) spadá mimo mapu hloubky, musí se programátor buď rozhodnout, že by povrch měl být ve výchozím nastavení osvětlený nebo stínovaný (obvykle svítí).

V implementaci shaderu by byl tento test proveden na úrovni fragmentu. Je také třeba věnovat pozornost výběru typu úložiště map textur, které má hardware používat: pokud nelze provést interpolaci, zdá se, že stín má ostrý, zubatý okraj (efekt, který lze snížit pomocí větší stínové mapy řešení).

Je možné upravit test hloubkové mapy tak, aby vytvářel stíny s měkkou hranou, pomocí řady hodnot (založených na blízkosti okraje stínu), spíše než jednoduše projít nebo selhat.

Techniku ​​stínového mapování lze také upravit tak, aby na osvětlené oblasti nakreslila texturu a simulovala tak efekt projektoru . Obrázek nahoře s titulky „vizualizace hloubkové mapy promítané na scénu“ je příkladem takového procesu.

Kreslení scény

Závěrečná scéna vykreslená s okolními stíny.

Kreslení scény pomocí stínů lze provést několika různými způsoby. Pokud jsou k dispozici programovatelné shadery , test hloubkové mapy může být proveden fragmentovým shaderem, který jednoduše vykreslí objekt ve stínu nebo se rozsvítí v závislosti na výsledku a vykreslí scénu v jednom průchodu (po počátečním předchozím průchodu pro generování stínové mapy) .

Pokud shadery nejsou k dispozici, musí být provedení testu hloubkové mapy obvykle implementováno některým hardwarovým rozšířením (například GL_ARB_shadow ), které obvykle neumožňují volbu mezi dvěma modely osvětlení (osvětlené a stínované) a vyžadují více vykreslovacích průchodů:

  1. Vykreslete celou scénu ve stínu. U nejběžnějších modelů osvětlení ( viz model Phongova odrazu ) by to mělo být technicky provedeno pouze s použitím okolní složky světla, ale toto je obvykle upraveno tak, aby zahrnovalo také tlumené difúzní světlo, aby se zabránilo zakřivení ploch ve stínu.
  2. Povolte test hloubkové mapy a vykreslete scénu. Oblasti, kde test hloubkové mapy selže, nebudou přepsány a zůstanou ve stínu.
  3. Pro každé další světlo může být použit další průchod, přičemž pomocí aditivního míchání se spojí jejich účinek s již nakreslenými světly. (Každý z těchto průchodů vyžaduje další předchozí průchod ke generování přidružené stínové mapy.)

Ukázkové obrázky v tomto článku používaly rozšíření OpenGL GL_ARB_shadow_ambient k provedení procesu stínové mapy ve dvou průchodech.

Implementace stínové mapy v reálném čase

Jednou z klíčových nevýhod stínového mapování v reálném čase je to, že velikost a hloubka stínové mapy určuje kvalitu konečných stínů. To je obvykle viditelné jako závady aliasingu nebo stínové kontinuity. Jednoduchý způsob, jak překonat toto omezení, je zvětšit velikost stínové mapy, ale kvůli paměťovým, výpočetním nebo hardwarovým omezením to není vždy možné. K obcházení tohoto omezení byly vyvinuty běžně používané techniky pro stínové mapování v reálném čase. Patří sem Cascaded Shadow Maps, Trapezoidal Shadow Maps, Light Space Perspective Shadow maps, nebo Parallel-Split Shadow maps.

Pozoruhodné také je, že generované stíny, i když bez aliasingu, mají tvrdé hrany, což není vždy žádoucí. Aby bylo možné napodobit měkké stíny skutečného světa , bylo vyvinuto několik řešení, a to buď provedením několika vyhledávání na stínové mapě, generováním geometrie určené k emulaci měkké hrany nebo vytvořením nestandardních stínových map hloubky. Jejich pozoruhodnými příklady jsou mapy procentního bližšího filtrování, smoothies a stínové varianty.

Techniky stínového mapování

Jednoduchý

  • SSM „jednoduché“

Štípání

Pokřivení

Vyhlazování

Filtrování

Měkké stíny

Roztříděný

Smíšený

  • Shadow Depth Maps (SDM)
  • Perspektivní stínové mapy (PSM)
  • Stínové mapy perspektivy světelného prostoru (LSPSM)
  • Kaskádové stínové mapy (CSM)
  • Variance Shadow Maps (VSM)

Viz také

Další čtení

Reference

  1. ^ Lance Williams. „Vrhání zakřivených stínů na zakřivené povrchy“ (PDF) . Citováno 2020-12-22 . Citační deník vyžaduje |journal=( nápověda )
  2. ^ Akenine-Mo ̈ller, Tomáš; Haines, Eric; Hoffman, Naty (2018-08-06). Vykreslování v reálném čase, čtvrté vydání . Stiskněte CRC. ISBN 978-1-351-81615-1.
  3. ^ "Kaskádové stínové mapy" (PDF) . NVidia . Citováno 2008-02-14 {{nekonzistentní citace}} Citační deník vyžaduje |journal=( nápověda )CS1 maint: postscript ( odkaz )
  4. ^ Tobias Martin; Tiow-Seng Tan. „Vyhlazování a spojitost s trapézovými stínovými mapami“ . Citováno 2008-02-14 . Citační deník vyžaduje |journal=( nápověda )
  5. ^ Michael Wimmer; Daniel Scherzer; Werner Purgathofer. „Stínové mapy perspektivy světelného prostoru“ . Citováno 2008-02-14 . Citační deník vyžaduje |journal=( nápověda )
  6. ^ Fan Zhang; Hanqiu Sun; Oskari Nyman. „Paralelně dělené stínové mapy na programovatelných GPU“ . Drahokamy GPU 3 . Archivováno od originálu 17. ledna 2010 . Citováno 2008-02-14 .
  7. ^ "Shadow Map Antialiasing" . NVidia . Citováno 2008-02-14 .
  8. ^ Eric Chan, Fredo Durand, Marco Corbetta . „Vykreslování falešných měkkých stínů pomocí smoothies“ . Citováno 2008-02-14 . Citační deník vyžaduje |journal=( nápověda )Správa CS1: více jmen: seznam autorů ( odkaz )
  9. ^ William Donnelly; Andrew Lauritzen. „Stínové mapy odchylek“ . Citováno 2008-02-14 .
  10. ^ http://msdn.microsoft.com/en-us/library/windows/desktop/ee416324(v=vs.85).aspx
  11. ^ http://msdn.microsoft.com/en-us/library/windows/desktop/ee416307(v=vs.85).aspx
  12. ^ http://dl.acm.org/citation.cfm?doid=1111411.1111440

externí odkazy