Mapování stínů - Shadow mapping
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
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
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
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
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ů:
- 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.
- 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.
- 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í
- PSSM „Parallel Split“ https://developer.nvidia.com/gpugems/GPUGems3/gpugems3_ch10.html
- CSM „Cascaded“ http://developer.download.nvidia.com/SDK/10.5/opengl/src/cascaded_shadow_maps/doc/cascaded_shadow_maps.pdf
Pokřivení
- LiSPSM „Perspektiva světelného prostoru“ https://www.cg.tuwien.ac.at/research/vr/lispsm/
- TSM „Trapezoid“ http://www.comp.nus.edu.sg/~tants/tsm.html
- „Perspektiva“ PSM http://www-sop.inria.fr/reves/Marc.Stamminger/psm/
- CSSM „Camera Space“ http://bib.irb.hr/datoteka/570987.12_CSSM.pdf
Vyhlazování
- PCF „Procentní bližší filtrování“ https://developer.nvidia.com/gpugems/GPUGems/gpugems_ch11.html
Filtrování
- ESM „Exponenciální“ http://www.cad.zju.edu.cn/home/jqfeng/papers/Exponential%20Soft%20Shadow%20Mapping.pdf
- CSM „Konvoluce“ https://doclib.uhasselt.be/dspace/bitstream/1942/8040/1/3227.pdf
- „Variance“ VSM http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.104.2569&rep=rep1&type=pdf
- SAVSM „Summed Area Variance“ https://developer.nvidia.com/gpugems/gpugems3/part-ii-light-and-shadows/chapter-8-summed-area-variance-shadow-maps
- SMSR „Revektorizace siluety stínové mapy“ http://bondarev.nl/?p=326
Měkké stíny
- PCSS „Procenta blíže“ http://developer.download.nvidia.com/shaderlibrary/docs/shadow_PCSS.pdf
- SSSS „Měkké stíny prostoru obrazovky“ http://www.crcnetbase.com/doi/abs/10.1201/b10648-36
- FIV "Fullsphere Irradiance Vector" http://getlab.org/publications/FIV/
Roztříděný
- ASM „Adaptivní“ http://www.cs.cornell.edu/~kb/publications/ASM.pdf
- AVSM „Adaptive Volumetric“ https://web.archive.org/web/20101208213624/http://visual-computing.intel-research.net/art/publications/avsm/
- CSSM „Camera Space“ http://free-zg.t-com.hr/cssm/
- DASM „Deep Adaptive“
- DPSM „Dual Paraboloid“ http://sites.google.com/site/osmanbrian2/dpsm.pdf
- „Hluboký“ DSM http://graphics.pixar.com/library/DeepShadows/paper.pdf
- FSM „Vpřed“ http://www.cs.unc.edu/~zhangh/technotes/shadow/shadow.ps
- LPSM „Logaritmický“ http://gamma.cs.unc.edu/LOGSM/
- MDSM „Multiple Depth“ http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.59.3376&rep=rep1&type=pdf
- RTW „přímočarý“ http://www.cspaul.com/wiki/doku.php?id=publications:rosen.2012.i3d
- RMSM "Resolution Matched" http://www.idav.ucdavis.edu/func/return_pdf?pub_id=919
- SDSM „Ukázková distribuce“ https://web.archive.org/web/20101208212121/http://visual-computing.intel-research.net/art/publications/sdsm/
- SPPSM „Perspectating Plane Perspective“ http://image.diku.dk/projects/media/morten.mikkelsen.07.pdf
- SSSM „Stínová silueta“ http://graphics.stanford.edu/papers/silmap/silmap.pdf
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é
- Objem stínu , další stínovací technika
- Ray casting , pomalejší technika často používaná při sledování paprsku
- Mapování fotonů , mnohem pomalejší technika schopná velmi realistického osvětlení
- Radiosity , další velmi pomalá, ale velmi realistická technika
Další čtení
- Hladké přechody Penumbra se stínovými mapami Willem H. de Boer
- Mapování stínů vpřed provádí test stínů v prostoru očí, nikoli ve světelném prostoru, aby byl přístup k texturám sekvenčnější.
Reference
-
^ 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 ) - ^ 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.
-
^ "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 ) -
^ 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 ) -
^ 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 ) - ^ 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 .
- ^ "Shadow Map Antialiasing" . NVidia . Citováno 2008-02-14 .
-
^ 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 ) - ^ William Donnelly; Andrew Lauritzen. „Stínové mapy odchylek“ . Citováno 2008-02-14 .
- ^ http://msdn.microsoft.com/en-us/library/windows/desktop/ee416324(v=vs.85).aspx
- ^ http://msdn.microsoft.com/en-us/library/windows/desktop/ee416307(v=vs.85).aspx
- ^ http://dl.acm.org/citation.cfm?doid=1111411.1111440