Objem stínu - Shadow volume

Příklad stínování šablony Carmacka v Doom 3 .

Shadow volume je technika používaná ve 3D počítačové grafice k přidávání stínů k vykreslené scéně. Poprvé byly navrženy Frankem Crowem v roce 1977 jako geometrie popisující 3D tvar oblasti uzavřené ze světelného zdroje. Stínový svazek rozděluje virtuální svět na dvě části: oblasti, které jsou ve stínu, a oblasti, které nejsou.

Implementace stencil bufferu stínových svazků je obecně považována za nejpraktičtější stínovací techniku ​​v reálném čase pro všeobecné použití pro použití na moderním 3D grafickém hardwaru. To bylo propagováno v videohry Doom 3 , a určitá obměna techniky používané v této hře se stala známou jako Carmack je vzad .

Stínové svazky se spolu s úctyhodnějším mapováním stínů staly oblíbeným nástrojem pro stínování v reálném čase . Hlavní výhodou stínových svazků je, že jsou přesné k pixelu (ačkoli mnoho implementací má menší problém se samotným stínováním podél okraje siluety, viz konstrukce níže), zatímco přesnost stínové mapy závisí na paměti textury, která mu byla přidělena stejně jako úhel, pod kterým jsou stíny vrženy (v některých úhlech nevyhnutelně trpí přesnost stínové mapy). Technika však vyžaduje vytvoření stínové geometrie, která může být náročná na CPU (v závislosti na implementaci). Výhodou stínového mapování je, že je často rychlejší, protože polygony objemu stínu jsou často velmi velké, pokud jde o prostor na obrazovce, a vyžadují spoustu času vyplnění (zejména u konvexních objektů), zatímco stínové mapy toto omezení nemají.

Konstrukce

Aby bylo možné vytvořit stínový svazek, promítněte paprsek ze světelného zdroje přes každý vrchol v objektu vrhajícího stín do nějakého bodu (obvykle v nekonečnu). Tyto projekce společně vytvoří svazek; jakýkoli bod uvnitř tohoto svazku je ve stínu, vše venku je osvětleno světlem.

U polygonálního modelu je objem obvykle tvořen klasifikací každé plochy v modelu buď směrem k světelnému zdroji, nebo směrem od světelného zdroje. Sada všech okrajů, které spojují čelní a vnější stranu, tvoří siluetu vzhledem ke zdroji světla. Okraje tvořící siluetu jsou vytaženy směrem od světla, aby se vytvořily tváře objemu stínu. Tento svazek musí přesahovat rozsah celé viditelné scény; často se rozměry stínového svazku rozšiřují do nekonečna, aby se toho dosáhlo (viz optimalizace níže.) Aby se vytvořil uzavřený svazek, musí být zakryty přední a zadní konec tohoto vysunutí. Tyto krytiny se nazývají „čepice“. V závislosti na metodě použité pro objem stínu může být přední část zakryta samotným objektem a zadní část může být někdy vynechána (viz hloubkový průchod níže).

Existuje také problém se stínem, kde jsou tváře podél okraje siluety relativně mělké. V tomto případě bude stín, který na sebe objekt vrhá, ostrý a odhalí jeho polygonální fazety, zatímco obvyklý model osvětlení bude mít postupnou změnu osvětlení podél fazety. To zanechává v blízkosti okraje siluety hrubý artefakt stínu, který je obtížné opravit. Zvýšení hustoty polygonů problém minimalizuje, ale neodstraní. Pokud je přední část svazku stínů omezena, může být celý svazek stínů mírně odsazen od světla, aby se odstranily případné protínající se stíny ve vzdálenosti odsazení okraje siluety (toto řešení se běžněji používá v mapování stínů ).

Základní kroky pro vytvoření svazku stínů jsou:

  1. Najděte všechny hrany siluety (hrany, které oddělují přední a zadní plochy)
  2. Roztáhněte všechny hrany siluety ve směru od zdroje světla
  3. Přidejte přední kryt a / nebo zadní kryt na každý povrch, abyste vytvořili uzavřený objem (nemusí být nutné, v závislosti na použité implementaci)
Ilustrace svazků stínů. Obrázek výše vlevo ukazuje scénu zastíněnou pomocí stínových svazků. Vpravo jsou svazky stínů zobrazeny v drátovém modelu. Všimněte si, jak stíny tvoří velkou kuželovitou plochu směřující od zdroje světla (jasný bílý bod).

Implementace vyrovnávací paměti vzorníku

Po Crowovi v roce 1991 Tim Heidmann ukázal, jak používat vyrovnávací paměť šablon k dostatečně rychlému vykreslení stínů se stínovými objemy pro použití v reálném čase. Existují tři běžné varianty této techniky, hloubkový průchod , hloubkový neúspěch a exkluzivní nebo , ale všechny používají stejný proces:

  1. Vykreslete scénu, jako by byla úplně ve stínu.
  2. Pro každý světelný zdroj:
    1. Pomocí informací o hloubce z této scény vytvořte masku ve vyrovnávací paměti šablony, která má díry pouze tam, kde viditelný povrch není ve stínu.
    2. Znovu vykreslete scénu, jako by byla úplně osvětlena, pomocí vyrovnávací paměti pro šablony zakryjte stínované oblasti. Pro přidání tohoto vykreslení na scénu použijte aditivní míchání.

Rozdíl mezi těmito třemi metodami nastává při generování masky ve druhém kroku. Některé zahrnují dva průchody a jiné pouze jeden; některé vyžadují menší přesnost ve vzorkovací vyrovnávací paměti.

Stínové svazky mají tendenci pokrýt velké části viditelné scény a ve výsledku spotřebovávají cenný čas rasterizace (čas plnění) na 3D grafickém hardwaru. K tomuto problému se přidává složitost objektů vrhajících stín, protože každý objekt může na obrazovce vrhat svůj vlastní objem stínů jakékoli potenciální velikosti. Viz optimalizace níže pro diskusi o technikách používaných v boji proti problému s časem vyplnění.

Hloubkový průchod

Heidmann navrhl, že pokud byly přední povrchy a zadní povrchy stínů vykresleny v samostatných průchodech, počet předních ploch a zadních ploch před objektem lze spočítat pomocí vyrovnávací paměti vzorníku. Pokud je povrch objektu ve stínu, bude mezi ním a okem více čelních stínových povrchů než zadní povrchových stínů. Pokud jsou však jejich počty stejné, povrch objektu není ve stínu. Generování šablony masky funguje následovně:

  1. Zakázat zápisy do vyrovnávací paměti hloubky a barev.
  2. Použijte utracení zadní strany .
  3. Nastavit operaci šablony na přírůstek hloubky (počítat pouze stíny před objektem).
  4. Vykreslete svazky stínů (kvůli vyřazení jsou vykresleny pouze jejich přední strany).
  5. Použijte utracení zepředu.
  6. Nastavte operaci šablony na snížení hloubky.
  7. Vykreslete svazky stínů (vykreslí se pouze jejich zadní plochy).

Poté, co je toho dosaženo, budou všechny osvětlené povrchy odpovídat 0 ve vzorkovacím bufferu, kde jsou počty předních a zadních povrchů všech objemů stínů mezi okem a tímto povrchem stejné.

Tento přístup má problémy, když je oko samotné uvnitř objemu stínu (například když se světelný zdroj pohybuje za objektem). Z tohoto pohledu oko vidí zadní plochu tohoto stínu dříve než cokoli jiného, ​​a to přidává zkreslení -1 k celé vyrovnávací paměti šablon, což efektivně invertuje stíny. To lze napravit přidáním povrchu „čepice“ k přední části objemu stínu směřujícího k oku, například k přední ořezové rovině . Existuje další situace, kdy oko může být ve stínu svazku vrženého objektem za kamerou, který také musí být nějak omezen, aby se zabránilo podobnému problému. U většiny běžných implementací, protože je obtížné dosáhnout správného omezení hloubkového průchodu, může být pro tyto zvláštní situace licencována metoda hloubkového selhání (viz níže). Alternativně je možné dát vyrovnávací paměti šablony zkreslení +1 pro každý svazek stínů, ve kterém je kamera uvnitř, i když detekce může být pomalá.

Existuje další potenciální problém, pokud vyrovnávací paměť vzorníku nemá dostatek bitů pro přizpůsobení počtu stínů viditelných mezi okem a povrchem objektu, protože používá aritmetiku nasycení . (Pokud místo toho použili aritmetické přetečení , problém by byl nevýznamný.)

Hloubkové testování je také známé jako testování z-pass , protože hloubkový buffer se často označuje jako z-buffer.

Hloubka selhala

Kolem roku 2000 několik lidí zjistilo, že Heidmannova metoda může být obrácena do hloubky tak, aby fungovala pro všechny pozice kamery. Místo počítání stínových povrchů před povrchem objektu lze povrchy za ním počítat stejně snadno, se stejným konečným výsledkem. Tím se vyřeší problém s tím, že oko je ve stínu, protože objem stínu mezi okem a objektem se nepočítá, ale zavádí se podmínka, že musí být uzavřen zadní konec objemu stínu, jinak budou stíny chybět tam, kde body objemu zpět do nekonečna.

  1. Zakázat zápisy do vyrovnávací paměti hloubky a barev.
  2. Použijte utracení zepředu.
  3. Nastavte operaci šablony na zvýšení hloubky selhání (počítat pouze stíny za objektem).
  4. Vykreslete stíny.
  5. Použijte utracení zadní strany.
  6. Nastavte operaci šablony na snížení hloubky selhání.
  7. Vykreslete stíny.

Metoda hloubkového selhání má stejné úvahy týkající se přesnosti vyrovnávací paměti vzorníku jako metoda hloubkového průchodu. Podobně jako hloubkový průchod se někdy označuje jako metoda z-selhání .

William Bilodeau a Michael Songy tuto techniku ​​objevili v říjnu 1998 a představili ji na kreativitě, konferenci vývojářů Creative Labs, v roce 1999. Sim Dietrich představil tuto techniku ​​na obou GDC v březnu 1999 a na kreativitě na konci roku 1999. Několik měsíců později, William Bilodeau a Michael Songy podali ve stejném roce americkou patentovou přihlášku pro tuto techniku, US 6384822  , nazvanou „Metoda vykreslování stínů pomocí svazku stínů a vyrovnávací paměti šablon“ vydaná v roce 2002, jejíž platnost vypršela v říjnu 2019. John Carmack z id Software nezávisle objevil algoritmus v roce 2000 během vývoje Doom 3 .

Exkluzivní - nebo

Kterýkoli z výše uvedených typů může být aproximován výlučnou variantou nebo variantou, která se nezabývá správně protínajícími se svazky stínů, ale uloží jeden vykreslovací průchod (pokud není čas na vyplnění) a vyžaduje pouze 1bitovou vyrovnávací paměť vzorníku. Následující kroky se týkají hloubkové verze:

  1. Zakázat zápisy do vyrovnávací paměti hloubky a barev.
  2. Nastavit operaci šablony na XOR při hloubkovém průchodu (otočit na jakýkoli povrch stínu).
  3. Vykreslete stíny.

Optimalizace

  • Jednou z metod, jak urychlit výpočty geometrie svazku stínů, je použít k provedení některých výpočtů existující části vykreslovacího kanálu. Například pomocí homogenních souřadnic lze w- souřadnici nastavit na nulu, aby se bod rozšířil do nekonečna. To by mělo být doprovázeno sledovacím komolím, které má daleko ořezávací rovinu, která sahá až do nekonečna, aby se tyto body přizpůsobily, což se provádí pomocí specializované projekční matice. Tato technika mírně snižuje přesnost vyrovnávací paměti hloubky, ale rozdíl je obvykle zanedbatelný. Podrobnou implementaci viz dokument z roku 2002 „Praktické a robustní stínované svazky stínů pro hardwarově zrychlené vykreslování“ , C. Everitt a M. Kilgard .
  • Rasterizační čas stínových svazků lze zkrátit pomocí hardwarového nůžkového testu k omezení stínů na konkrétní obdélník na obrazovce.
  • NVIDIA implementovala hardwarovou funkci nazvanou hloubkový test, která je navržena k odstranění částí stínových svazků, které neovlivňují viditelnou scénu. (Toto je k dispozici od modelu GeForce FX 5900.) Diskuse o této schopnosti a jejím použití se stínovými objemy byla představena na konferenci vývojářů her v roce 2005.
  • Protože metoda hloubkového selhání nabízí výhodu oproti hloubkovému průchodu pouze ve zvláštním případě, kdy je oko v objemu stínu, je vhodnější tento případ zkontrolovat a použít hloubkový průchod, kdykoli je to možné. Tím se zabrání jak zbytečnému zpětnému zakrytí (a souvisejícímu rastrování) pro případy, kdy je hloubkové selhání zbytečné, tak i problému vhodného čelního zakrytí pro speciální případy hloubkového průchodu.
  • Na novějších kanálech GPU lze ke generování objemů stínů použít shadery geometrie .
  • V systémech, které nepodporují shadery geometrie, lze vrcholové shadery také použít k vytvoření stínových svazků selektivním extrudováním vrcholů, které se již nacházejí v paměti GPU.

Viz také

Reference

externí odkazy

Pokud jde o patenty hloubkového selhání