Stínové mapování - Shadow mapping


Stínové mapování nebo stínová projekce je proces, kterým stíny jsou přidány do 3D počítačová grafika. Tento koncept představil Lance Williams v roce 1978, v článku nazvaném „Vrhání zakřivených stínů na zakřivené povrchy“. Od té doby se používá v předrenderovaných i realtime scénách v mnoha konzolových a počítačových hrách.
Stíny jsou vytvářeny testováním, zda a pixel je viditelný ze světelného zdroje porovnáním pixelu s a z-buffer[1] nebo hloubka obrázek pohledu světelného zdroje uložený ve formě a textura.
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ěmito objekty by však bylo ve stínu. Toto je základní princip používaný k vytvoření stínové mapy. Pohled na světlo je vykreslen a ukládá hloubku každého povrchu, který vidí (stínová mapa). Dále se vykreslí běžná scéna porovnáním hloubky každého nakresleného bodu (jako by ji bylo vidět světlo, nikoli oko) s touto hloubkovou mapou.
Tato technika je méně přesná než stínové objemy, ale stínová mapa může být rychlejší alternativou v závislosti na tom, kolik času je zapotřebí pro kteroukoli techniku v konkrétní aplikaci, 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ších vyrovnávací paměť šablony 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 kreslení. 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 průchodů kreslení.
Vytváření stínové mapy


První krok vykreslí scénu z pohledu světla. U bodového zdroje světla by měl být pohled a perspektivní projekce stejně široký jako požadovaný úhel účinku (bude to jakýsi čtvercový bodový reflektor). Pro směrové světlo (např. To z slunce ), an pravopisná projekce by měly být použity.
Z tohoto vykreslení se extrahuje a uloží hloubková vyrovnávací paměť. Protože jsou relevantní pouze informace o hloubce, je běžné vyhnout se aktualizaci vyrovnávacích pamětí barev a deaktivovat všechny výpočty osvětlení a textury pro toto vykreslení, aby se ušetřil čas kreslení. Tento hloubková mapa je často uložen jako textura v grafické paměti.
Tuto hloubkovou mapu je třeba aktualizovat, kdykoli 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á hloubková mapa.)
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. Při vykreslování stínové mapy může být také použito posunutí hloubky, které posune objekty od světla, ve snaze vyřešit šití problémy, kde se hodnota hloubkové mapy blíží hloubce kresleného povrchu (tj. povrchu vrhajícího stíny) v dalším kroku. Alternativně se pro podobný výsledek někdy používá utracení předních ploch a pouze vykreslení zadní části objektů do stínové mapy.
Stínování scény
Druhým krokem je nakreslit scénu z obvyklého Fotoaparát hledisko, použití stínové mapy. Tento proces má tři hlavní součásti, první je nalezení souřadnic objektu při pohledu ze světla, druhým je test, který porovnává tuto souřadnici s hloubkovou mapou, a nakonec, jakmile je splněn, musí být objekt nakreslen buď v ve stínu nebo ve světle.
Souřadnice světelného prostoru

Aby bylo možné otestovat bod proti hloubkové mapě, musí být jeho poloha v souřadnicích scény transformována do ekvivalentní polohy, jak je vidět světlo. Toho je dosaženo pomocí násobení matic. Umístění objektu na obrazovce je určeno obvyklým způsobem transformace souřadnic, ale k vyhledání objektu ve světelném prostoru musí být vygenerována druhá sada souřadnic.
Matice použitá k transformaci světových souřadnic na souřadnice pohledu světla je stejná jako matice použitá k vykreslení stínové mapy v prvním kroku (pod OpenGL toto je produkt modelové matice a projekční matice). Tím se vytvoří sada homogenní souřadnice které potřebují perspektivní rozdělení (vidět 3D projekce ) stát se normalizované souřadnice zařízení, ve kterém každá složka (X, ynebo z) spadá mezi −1 a 1 (je-li to viditelné ze světelného pohledu). Mnoho implementací (například OpenGL a Direct3D ) vyžadují další měřítko a zkreslení násobení matice pro mapování těchto hodnot −1 na 1 na 0 až 1, což jsou obvyklejší souřadnice pro vyhledávání hloubkové mapy (textury). Toto škálování lze provést před rozdělením perspektivy a lze jej snadno složit do předchozího výpočtu transformace vynásobením této matice následujícím způsobem:
Pokud je to provedeno pomocí a shader nebo jiné grafické hardwarové rozšíření, tato transformace se obvykle aplikuje na úrovni vrcholů a vygenerovaná hodnota se interpoluje mezi jinými vrcholy a předává se na úroveň fragmentů.
Test hloubkové mapy

Jakmile jsou nalezeny souřadnice světelného prostoru, X a y hodnoty obvykle odpovídají umístění v textuře hloubkové mapy a z hodnota odpovídá přidružené hloubce, kterou lze nyní otestovat proti hloubkové mapě.
Pokud z hodnota je větší než hodnota uložená v hloubkové mapě na příslušném (X,y) umístění, objekt je považován za okluzivním objektem a měl by být označen jako a selhání, který bude kreslen ve stínu. Jinak by to mělo být nakresleno osvětlené.
Pokud (X,y) umístění spadá mimo hloubkovou mapu, programátor musí buď rozhodnout, že povrch by měl být ve výchozím nastavení osvětlený nebo stínovaný (obvykle osvětlený).
V shader implementace by se tento test prováděl na úrovni fragmentů. Při výběru typu úložiště texturových map, které má hardware použít, je třeba postupovat opatrně: pokud nelze provést interpolaci, stín bude mít ostrou zubatou hranu (efekt, který lze snížit s větším rozlišením stínové mapy) ).
Je možné upravit test hloubkové mapy tak, aby vytvářel stíny s měkkou hranou pomocí rozsahu 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 kreslila texturu na osvětlené oblasti simulující účinek a projektor. Obrázek nahoře s titulkem „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 je programovatelný shadery jsou k dispozici, test hloubkové mapy lze provést pomocí shaderu fragmentu, který jednoduše nakreslí objekt ve stínu nebo osvětlí v závislosti na výsledku, nakreslí scénu v jednom průchodu (po počátečním dřívějším průchodu pro vygenerování stínové mapy).
Pokud shadery nejsou k dispozici, musí být provedení testu hloubkové mapy obvykle implementováno nějakou hardwarovou příponou (například GL_ARB_shadow ), které obvykle neumožňují volbu mezi dvěma modely osvětlení (osvětlenými a stínovanými) a vyžadují více vykreslovacích pasů:
- Vykreslete celou scénu ve stínu. Pro nejběžnější modely osvětlení (vidět Phongův reflexní model ) toto by 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é rozptýlené světlo, aby se zabránilo tomu, že se zakřivené povrchy budou ve stínu zdát ploché.
- Povolit test hloubkové mapy a vykreslit scénu osvětlenou. Oblasti, kde test hloubkové mapy selže, nebudou přepsány a zůstanou ve stínu.
- Pro každé další světlo lze použít další průchod pomocí aditivní míchání kombinovat 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 OpenGL rozšíření GL_ARB_shadow_ambient dosáhnout procesu stínové mapy ve dvou průchodech.
Stínová implementace 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ů. Toto je obvykle viditelné jako aliasing nebo závady kontinuity stínů. Jednoduchým způsobem, jak překonat toto omezení, je zvětšit velikost stínové mapy, ale vzhledem k 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 mapování stínů v reálném čase. Patří mezi ně Cascaded Shadow Maps,[2] Trapézové stínové mapy,[3] Stínové mapy Perspektivy světelného prostoru,[4] nebo Parallel-Split Shadow mapy.[5]
Pozoruhodné je také to, že generované stíny, i když jsou aliasing zdarma, mají tvrdé hrany, což není vždy žádoucí. Aby bylo možné napodobit měkké stíny v reálném světě, 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 hloubkových stínových map. Pozoruhodné příklady jsou Procentuální bližší filtrování,[6] Smoothies,[7] a mapy Variance Shadow.[8]
Techniky stínového mapování
Jednoduchý
- SSM „jednoduché“
Rozdělení
- PSSM "Parallel Split" https://developer.nvidia.com/gpugems/GPUGems3/gpugems3_ch10.html
- CSM „kaskádově“ http://developer.download.nvidia.com/SDK/10.5/opengl/src/cascaded_shadow_maps/doc/cascaded_shadow_maps.pdf
Deformace
- LiSPSM „Perspektiva světelného prostoru“ https://www.cg.tuwien.ac.at/research/vr/lispsm/
- TSM „lichoběžník“ http://www.comp.nus.edu.sg/~tants/tsm.html
- PSM „Perspektiva“ http://www-sop.inria.fr/reves/Marc.Stamminger/psm/
- CSSM "Camera Space" http://bib.irb.hr/datoteka/570987.12_CSSM.pdf
Vyhlazení
- 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
- VSM "Variance" http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.104.2569&rep=rep1&type=pdf
- SAVSM "Summed Area Variance" http://http.developer.nvidia.com/GPUGems3/gpugems3_ch08.html
- SMSR "Revectorizace 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 v 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
- DSM „hluboký“ 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 "Rectilinear" 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 "Distribuce vzorků" https://web.archive.org/web/20101208212121/http://visual-computing.intel-research.net/art/publications/sdsm/
- SPPSM "Perspektiva oddělovací roviny" http://image.diku.dk/projects/media/morten.mikkelsen.07.pdf
- SSSM "Shadow Silhouette" http://graphics.stanford.edu/papers/silmap/silmap.pdf
Smíšený
- Shadow Depth Maps (SDM)[9]
- Perspektivní stínové mapy (PSM)
- Shadow Space Perspective Shadow Maps (LSPSMs)
- Kaskádové stínové mapy (CSM)[10]
- Varianty stínových map (VSM)[11]
Viz také
- Stínový objem, další stínovací technika
- Ray casting, pomalejší technika často používaná v 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
- Dopředu stínové mapování provádí stínový test spíše v očním prostoru než ve světelném prostoru, aby byl přístup k texturám více sekvenční.
Reference
- ^ Akenine-Mo ̈ller, Tomáš; Haines, Eric; Hoffman, Naty (06.08.2018). Vykreslování v reálném čase, čtvrté vydání. CRC Press. ISBN 978-1-351-81615-1.
- ^ „Kaskádové stínové mapy“ (PDF). NVidia. Citováno 2008-02-14{{nekonzistentní citace}} Citovat deník vyžaduje
| deník =
(Pomoc) - ^ Tobias Martin; Tiow-Seng Tan. „Vyhlazení a kontinuita s lichoběžníkovými stínovými mapami“. Citováno 2008-02-14. Citovat deník vyžaduje
| deník =
(Pomoc) - ^ Michael Wimmer; Daniel Scherzer; Werner Purgathofer. "Shadow Space Perspective Shadow Maps". Citováno 2008-02-14. Citovat deník vyžaduje
| deník =
(Pomoc) - ^ Fan Zhang; Hanqiu Sun; Oskari Nyman. „Paralelně rozdělené stínové mapy na programovatelných GPU“. GPU drahokamy 3. Archivovány od originál dne 17. ledna 2010. Citováno 2008-02-14.
- ^ "Shadow Map Antialiasing". NVidia. Citováno 2008-02-14.
- ^ Eric Chan, Fredo Durand, Marco Corbetta. „Rendering Fake Soft Shadows with Smoothies“. Citováno 2008-02-14. Citovat deník vyžaduje
| deník =
(Pomoc)CS1 maint: více jmen: seznam autorů (odkaz) - ^ William Donnelly; Andrew Lauritzen. „Varianty stínových map“. 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