Stínování s proměnlivou rychlostí (VRS)
Motivace pro VRS
Vzhledem k omezení výkonu si renderer grafiky nemůže vždy dovolit poskytovat stejnou úroveň kvality pro každou část jeho výstupního obrázku. Stínování proměnlivé rychlosti (nebo hrubé stínování pixelů) je mechanismus, který umožňuje přidělit výkon a výkon vykreslování rychlostí, která se liší podle vykresleného obrázku.
V některých případech lze míru stínování snížit s malým nebo žádným snížením kvalitu určitého výstupu; což vede ke zlepšení výkonu, které je v podstatě bezplatné.
Bez VRS – multi-sample anti-aliasing with supersampling
Bez stínování s proměnnou rychlostí je jediným způsobem řízení rychlosti stínování s více ukázkovými anti-aliasy (MSAA) s prováděním založeným na vzorku (označované také jako supersampling).
MSAA je mechanismus pro snížení geometrického aliasování a zlepšení kvality vykreslování obrázku ve srovnání s tím, že nepoužívá msaa. Počet vzorků MSAA, který může být 1x, 2x, 4x, 8x nebo 16x, určuje počet vzorků přidělených na cílový pixel vykreslení. Pokud je cíl přidělen, musí být předem známý počet vzorků MSAA a potom ho nelze změnit.
Supersampling způsobí, že se shader pixelů vyvolá jednou za vzorek s vyšší kvalitou, ale také vyššími náklady na výkon v porovnání se spouštěním pixelů.
Vaše aplikace může řídit rychlost stínování výběrem mezi spouštěním na pixelech nebo msaa-with-supersampling. Tyto dvě možnosti neposkytují velmi jemné řízení. Můžete také chtít nižší míru stínování pro určitou třídu objektů v porovnání se zbytkem obrázku. Takové objekty můžou zahrnovat objekt za prvkem HUD nebo průhlednost, rozostření (hloubku pole, pohyb atd.) nebo optické zkreslení z důvodu optického zkreslení v důsledku optického zobrazení vr. Ale to by nebylo možné, protože kvalita stínování a náklady jsou pevné na celém obrázku.
Stínování s proměnlivou rychlostí (VRS)
Model stínování s proměnlivou rychlostí (VRS) rozšiřuje supersampling-with-MSAA na opačný směr "hrubý pixel" přidáním konceptu hrubého stínování. Toto je místo, kde lze stínování provádět s frekvencí hrubější než pixel. Jinými slovy, skupina pixelů může být stínována jako jedna jednotka a výsledek se pak vysílá do všech vzorků ve skupině.
Rozhraní API hrubého stínování umožňuje vaší aplikaci určit počet pixelů, které patří do stínované skupiny, nebo hrubých pixelů. Po přidělení cíle vykreslení můžete změnit hrubou velikost pixelů. Různé části obrazovky nebo různé průchody kreslení tedy můžou mít různou míru stínování.
Následuje tabulka popisující, která úroveň MSAA je podporována s hrubou velikostí pixelů pro platformy, které podporují hrubé stínování:
- U buněk označených Y je tato kombinace povolená.
- U buněk označených Capje tato kombinace podmíněně povolená na základě limitu (AdditionalShadingRatesSupported).
- U buněk, které jsou prázdné, není tato kombinace podporována.
- U buněk s polotónovým stínem je tato kombinace nepodporovaná, a zahrnuje sledování více než 16 vzorků na vyvolání shaderu pixelů. Pro sledování více než 16 vzorků existují další bariéry pro zarovnání hardwaru pro podporu v porovnání s ostatními případy.
Úrovně funkcí
Implementace VRS má dvě úrovně a dvě možnosti, na které se můžete dotazovat. Každá úroveň je podrobněji popsána za tabulkou.
Vrstva 1
- Míru stínování lze zadat pouze na bázi kreslení; nic víc členitějšího.
- Míra stínování platí jednotně na to, co je vykresleno nezávisle na tom, kde leží v cíli vykreslení.
Vrstva 2
- Míru stínování je možné zadat na bázi kreslení, stejně jako v vrstvě 1. Lze jej také určit kombinací per-draw basis a of:
- Sémantika z každého vyvolání vrcholu a
- obrázek místa na obrazovce.
- Míra stínování ze tří zdrojů se zkombinuje pomocí sady kombinátorů.
- Velikost dlaždice s obrázkem na obrazovce je 16 × 16 nebo menší.
- Míra stínování, kterou vaše aplikace požaduje, je zaručena, že bude doručována přesně (pro přesnost dočasných a dalších filtrů obnovení).
- SV_ShadingRate vstup PS se podporuje.
- Míra stínování vrcholu (označovaná také jako míra stínování podle primitiva) je platná, pokud se použije jeden bod zobrazení a
SV_ViewportArrayIndex
není zapsán do. - Rychlost vrcholu pro vyvolání vrcholu lze použít s více než jedním zobrazením, pokud SupportsPerVertexShadingRateWithMultipleViewports schopnost je nastavena na
true
. V takovém případě lze tuto sazbu použít při zápisuSV_ViewportArrayIndex
.
Seznam možností
-
AdditionalShadingRatesSupported
- Logický typ.
- Určuje, zda jsou podporovány velikosti 2x4, 4x2 a 4x4 hrubých pixelů pro vykreslování s jedním vzorkem; a zda je podporována hrubá velikost pixelů 2x4 pro 2x MSAA.
-
supportsPerVertexShadingRateWithMultipleViewports
- Logický typ.
- Určuje, jestli se dá použít více než jedno zobrazení se stínovací rychlostí jednotlivých vrcholů (označovaných také jako primitivní).
Určení rychlosti stínování
Pro flexibilitu aplikací existuje celá řada mechanismů, které umožňují řídit rychlost stínování. Různé mechanismy jsou k dispozici v závislosti na úrovni hardwarových funkcí.
Seznam příkazů
Toto je nejjednodušší mechanismus nastavení rychlosti stínování. Je k dispozici na všech úrovních.
Aplikace může zadat hrubou velikost pixelů pomocí ID3D12GraphicsCommandList5::RSSetShadingRate metoda. Toto rozhraní API přebírá jeden argument výčtu. Rozhraní API poskytuje celkovou kontrolu nad úrovní kvality vykreslování – schopnost nastavit míru stínování na základě kreslení.
Hodnoty pro tento stav jsou vyjádřeny prostřednictvím D3D12_SHADING_RATE výčtu.
Podpora hrubé velikosti pixelů
Stínování 1x1, 1x2, 2x1 a 2x2 jsou podporovány na všech úrovních.
K dispozici je funkce, AdditionalShadingRatesSupported, označující, zda jsou na zařízení podporovány 2x4, 4x2 a 4x4.
Obrázek prostoru obrazovky (založený na obrázku)
Na úrovni 2 a vyšší můžete určit rychlost stínování pixelů pomocí obrázku s prostorem na obrazovce.
Obrázek prostoru obrazovky umožňuje vaší aplikaci vytvořit obrázek "masky s podrobnostmi úrovně podrobností "LOD" označující oblasti proměnlivé kvality, jako jsou oblasti, které budou pokryty rozostřením pohybu, rozostřením hloubky pole, průhlednými objekty nebo prvky uživatelského rozhraní HUD. Rozlišení obrázku je v bloku maker; není v rozlišení cíle vykreslení. Jinými slovy, data o rychlosti stínování se zadává v členitosti dlaždic 8x8 nebo 16 × 16 pixelů, jak je znázorněno velikostí dlaždice VRS.
Velikost dlaždice
Vaše aplikace se může dotazovat na rozhraní API, aby načetla podporovanou velikost dlaždice VRS pro své zařízení.
Dlaždice jsou čtvercové a velikost odkazuje na šířku nebo výšku dlaždice v texelech.
Pokud hardware nepodporuje stínování proměnlivé rychlosti vrstvy 2, vrátí dotaz na schopnost pro velikost dlaždice hodnotu 0.
Pokud hardwarový podporuje stínování proměnlivé rychlosti vrstvy 2, je velikost dlaždice jednou z těchto hodnot.
- 8
- 16
- 32
Velikost obrázku místa na obrazovce
Pro cíl vykreslení velikosti {rtWidth, rtHeight} s použitím dané velikosti dlaždice s názvem VRSTileSize, obrázek místa na obrazovce, který ji bude pokrýt, je z těchto dimenzí.
{ ceil((float)rtWidth / VRSTileSize), ceil((float)rtHeight / VRSTileSize) }
Obrázek místa na obrazovce vlevo nahoře (0, 0) je uzamčený do levého horního rohu cíle vykreslení (0, 0).
Pokud chcete vyhledat souřadnici dlaždice (x,y), která odpovídá určitému umístění v cíli vykreslení, vydělte souřadnice prostoru okna (x, y) velikostí dlaždice bez ohledu na desetinné bity.
Pokud je obrázek místa na obrazovce větší, než musí být pro daný cíl vykreslení, nepoužijí se nadbytečné části vpravo nebo dole.
Pokud je obrázek prostoru na obrazovce pro daný cíl vykreslení příliš malý, všechny pokusy o čtení z obrázku nad rámec jeho skutečných rozsahů poskytují výchozí míru stínování 1x1. Důvodem je to, že vlevo nahoře na obrázku obrazovky (0, 0) je uzamčený do levého horního rohu cíle vykreslení (0, 0) a "čtení nad rozsahy cíle vykreslení" znamená čtení příliš velkých hodnot pro x a y.
Formát, rozložení, vlastnosti prostředku
Formát této plochy je jednokanálový 8bitový povrch (DXGI_FORMAT_R8_UINT).
Prostředek je dimenze TEXTURE2D.
Nedá se matici ani napodobovat. Musí mít explicitně jednu úroveň mip.
Má počet vzorků 1 a 0 kvality vzorku.
Má rozložení textury UNKNOWN. Implicitně nemůže být rozložení hlavního řádku, protože křížový adaptér není povolený.
Očekávaným způsobem, jakým jsou vyplněna data obrázku s prostorem obrazovky, je buď
- Zápis dat pomocí výpočetního shaderu; obrázek prostoru obrazovky je vázán jako UAV nebo
- Zkopírujte data na obrázek místa na obrazovce.
Při vytváření obrázku prostoru na obrazovce jsou tyto příznaky povolené.
- ŽÁDNÝ
- ALLOW_UNORDERED_ACCESS
- DENY_SHADER_RESOURCE
Tyto příznaky nejsou povolené.
- ALLOW_RENDER_TARGET
- ALLOW_DEPTH_STENCIL
- ALLOW_CROSS_ADAPTER
- ALLOW_SIMULTANEOUS_ACCESS
- VIDEO_DECODE_REFERENCE_ONLY
Typ haldy prostředku nemůže být UPLOAD ani READBACK.
Prostředek nemůže být SIMULTANEOUS_ACCESS. Prostředek nesmí být mezi adaptéry.
Data
Každý bajt obrázku prostoru obrazovky odpovídá hodnotě D3D12_SHADING_RATE výčtu.
Stav prostředku
Prostředek musí být převeden do stavu jen pro čtení, pokud se používá jako obrázek místa na obrazovce. Pro tento účel je definován stav jen pro čtení, D3D12_RESOURCE_STATE_SHADING_RATE_SOURCE.
Prostředek image se převést z tohoto stavu, aby se znovu zapisovatel.
Nastavení obrázku
Obrázek místa na obrazovce pro určení rychlosti shaderu je nastavený v seznamu příkazů.
Prostředek, který byl nastaven jako zdroj frekvence stínování, nelze číst ani zapisovat z žádné fáze shaderu.
Obrázek null
prostoru na obrazovce lze nastavit pro určení frekvence shaderu. To má vliv, že se 1x1 konzistentně používá jako příspěvek z obrázku prostoru obrazovky. Obrázek místa na obrazovce lze zpočátku považovat za nastavený na null
.
Povýšení a rozpad
Prostředek obrázku s prostorem obrazovky nemá žádné zvláštní důsledky týkající se povýšení nebo rozkladu.
Atribut podle primitivního atributu
Atribut podle primitivního atributu přidá schopnost určit termín míry stínování jako atribut z vyvolání vrcholu. Tento atribut je plochý – to znamená, že se rozšíří na všechny pixely v aktuálním trojúhelníku nebo primitivu čáry. Použití atributu podle primitivního atributu umožňuje jemně odstupňovanou kontrolu kvality obrázku v porovnání s jinými specifikátory frekvence stínování.
Atribut per-primitive je settable sémantic pojmenovaný SV_ShadingRate
.
SV_ShadingRate
existuje jako součást model shaderu HLSL 6.4.
Pokud sada VS nebo GS SV_ShadingRate
, ale VRS není povolená, nemá sémantické nastavení žádný vliv. Pokud pro SV_ShadingRate
není zadaná žádná hodnota pro primitivu, předpokládá se jako primitivní příspěvek hodnota shadingu 1x1.
Kombinování faktorů míry stínování
Pomocí tohoto diagramu se používají různé zdroje frekvence stínování.
Každá dvojice A a B se zkombinuje pomocí kombinátoru.
* Při zadávání frekvence shaderu podle atributu vrcholu.
- Pokud se použije shader geometrie, lze pomocí této hodnoty určit rychlost stínování.
- Pokud není použit shader geometrie, je stínovací rychlost určena vyvoláním vrcholu.
Seznam kombinátorů
Podporují se následující kombinátory. Použití kombinátoru (C) a dvou vstupů (A a B).
- předávací. C.xy = A.xy.
- přepsání. C.xy = B.xy.
- vyšší kvality. C.xy = min(A.xy; B.xy).
- nižší kvality. C.xy = max(A.xy; B.xy).
- Použít náklady B vzhledem kA . C.xy = min(maxRate, A.xy + B.xy).
kde maxRate
je největší povolená dimenze hrubého pixelu na zařízení. To by bylo
-
D3D12_AXIS_SHADING_RATE_2X (tj. hodnota 1), pokud additionalShadingRatesSupported je
false
. -
D3D12_AXIS_SHADING_RATE_4X (tj. hodnota 2), pokud additionalShadingRatesSupported je
true
.
Volba kombinátoru pro stínování proměnlivé rychlosti je nastavena v seznamu příkazů prostřednictvím ID3D12GraphicsCommandList5::RSSetShadingRate.
Pokud se nikdy nenastaví žádné kombinátory, zůstanou ve výchozím nastavení, což je PASSTHROUGH.
Pokud je zdrojem kombinační funkce D3D12_AXIS_SHADING_RATE, která není v tabulce podpory povolená, je vstup sanitován na míru stínování, která je podporována.
Pokud výstup kombinátoru neodpovídá rychlosti stínování podporované na platformě, je výsledek sanitován na míru stínování, která je podporovaná.
Výchozí stav a vymazání stavu
Všechny zdroje sazeb stínování, konkrétně
- rychlost zadanou stavem kanálu (zadaná v seznamu příkazů),
- frekvence určená místem na obrazovce a
- atribut per-primitive
mají výchozí hodnotu D3D12_SHADING_RATE_1X1. Výchozí kombinátory jsou {PASSTHROUGH, PASSTHROUGH}.
Pokud není zadán žádný obrázek místa na obrazovce, je z tohoto zdroje odvozena rychlost stínování 1x1.
Pokud není zadán žádný atribut podle primitivního atributu, je z tohoto zdroje odvozena míra stínování 1x1.
ID3D12CommandList::ClearState resetuje výchozí rychlost zadanou podle stavu kanálu a výběr obrázku místa na obrazovce na výchozí hodnotu bez obrázku prostoru obrazovky.
Dotazování rychlosti stínování pomocí SV_ShadingRate
Je užitečné vědět, jaká míra stínování byla vybrána hardwarem při vyvolání shaderu pixelů. To může v kódu PS povolit různé optimalizace. Systémová proměnná ps-only, SV_ShadingRate
, poskytuje informace o rychlosti stínování.
Typ
Typ této sémantické je uint.
Interpretace dat
Data se interpretují jako hodnota D3D12_SHADING_RATE výčtu.
Pokud se nepoužívá VRS
Pokud se nepoužívá hrubé stínování pixelů, SV_ShadingRate
se vrátí jako hodnota 1x1 označující jemné pixely.
Chování při spouštění na základě vzorku
Kompilace pixelového shaderu selže, pokud zadává SV_ShadingRate
a používá také spouštění založené na vzorku – například zadáním SV_SampleIndex
nebo použitím klíčového slova interpolace vzorku.
Poznámky týkající se odloženého stínování
Odložené průchody osvětlení aplikace stínování můžou potřebovat vědět, jaká míra stínování byla použita pro kterou oblast obrazovky. Je to tak, aby dispečery osvětlení mohly spouštět hrubší rychlostí. K tomu lze použít
SV_ShadingRate
proměnnou, pokud je zapsána do gbufferu.
Hloubka a vzorník
Při použití hrubého stínování pixelů se při plném rozlišení vzorku vždy vypočítají hloubkové a vzorníky a pokrytí.
Použití požadované míry stínování
U všech úrovní se očekává, že pokud se požaduje rychlost stínování a podporuje se v kombinaci na úrovni zařízení a MSAA, pak se jedná o rychlost stínování poskytovaná hardwarem.
Požadovaná míra stínování znamená míru stínování vypočítanou jako výstup kombinátorů (viz část Kombinování faktorů míry stínování v tomto tématu).
Podporovaná rychlost stínování je 1x1, 1x2, 2x1 nebo 2x2 v operaci vykreslování, kde je počet vzorků menší nebo roven čtyřem. Pokud je funkce AdditionalShadingRatesSupportedtrue
, pak jsou podporované i stínovací frekvence 2x4, 4x2 a 4x4 pro některé počty vzorků (viz tabulka v S stínováním proměnných (VRS) části v tomto tématu).
Deriváty prostoru obrazovky
Výpočty přechodů pixelů na sousední pixely jsou ovlivněny hrubým stínováním pixelů. Když se například použijí hrubé pixely 2x2, bude přechod ve srovnání s hrubými pixely použit dvakrát. Vaše aplikace může chtít upravit shadery tak, aby to kompenzovala – nebo ne, v závislosti na požadované funkčnosti.
Vzhledem k tomu, že mips jsou vybrány na základě derivátu prostoru obrazovky, použití hrubého stínování pixelů ovlivňuje výběr mip. Použití hrubého stínování pixelů způsobuje výběr méně podrobných mips v porovnání s tím, kdy se nepoužívají hrubé pixely.
Interpolace atributů
Vstupy do shaderu pixelů mohou být interpolovány na základě jejich zdrojových vrcholů. Protože stínování proměnlivé rychlosti ovlivňuje oblasti cíle napsané jednotlivými vyvoláním shaderu pixelů, interaguje s interpolací atributů. Tři typy interpolace jsou střed, centroid a vzorek.
Střed
Umístění interpolace středu hrubého pixelu je geometrický střed celé hrubé oblasti pixelů.
SV_Position
se vždy interpoluje na střed hrubé oblasti pixelů.
Těžiště
Při použití hrubého stínování pixelů s MSAA se pro každý jemný pixel stále zapisuje do úplného počtu vzorků přidělených pro úroveň MSAA cíle. Umístění interpolace centroidu proto bude zvažovat všechny vzorky pro jemné pixely v hrubých pixelech. To znamená, že umístění interpolace centroidu je definováno jako první pokrytý vzorek v rostoucím pořadí indexu vzorku. Efektivní pokrytí vzorku je and-ed s odpovídajícím bitem rastrového stavu SampleMask.
Poznámka
Při použití hrubého stínování pixelů na vrstvě 1 je vzorková maska vždy úplná maska. Pokud je ukázková maska nakonfigurovaná tak, aby nebyla úplná maska, je hrubé stínování pixelů ve vrstvě 1 zakázané.
Spouštění na základě ukázek
Spouštění založené na vzorku nebo supervzorkující, což je způsobeno použitím funkce interpolace vzorku, lze použít s hrubým stínováním pixelů a způsobit vyvolání shaderu pixelů pro každý vzorek. Pro cíle počtu vzorků N se shader pixelů vyvolá nkrát na jemný pixel.
EvaluateAttributeSnapped
Vnitřní objekty modelu vyžádané replikace nejsou kompatibilní s hrubým stínováním pixelů na vrstvě 1. Pokud se pokusíte použít vnitřní objekty modelu pro vyžádání změn s hrubým stínováním pixelů na vrstvě 1, hrubé stínování pixelů se automaticky zakáže.
Vnitřní EvaluateAttributeSnapped
je možné použít s hrubým stínováním pixelů na vrstvě 2. Jeho syntaxe je stejná jako vždy.
numeric EvaluateAttributeSnapped(
in attrib numeric value,
in int2 offset);
Pro kontext má EvaluateAttributeSnapped
parametr posunu se dvěma poli. Při použití bez hrubého stínování pixelů se použijí pouze čtyři bity nižšího řádu z plné třiceti dvou. Tyto čtyři bity představují rozsah [-8, 7]. Tato oblast zahrnuje mřížku o rozměrech 16×16 v pixelech. Rozsah je takový, že horní a levé okraje pixelu jsou zahrnuty a dolní a pravé okraje nejsou. Posun (-8, -8) je v levém horním rohu a posun (7, 7) je v pravém dolním rohu. Odsazení (0, 0) je středem pixelu.
Při použití s hrubým stínováním pixelů je EvaluateAttributeSnapped
parametr posunu schopen určit širší rozsah umístění. Parametr posunu vybere mřížku 16x16 pro každý jemný pixel a existuje několik jemných pixelů. Výrazný rozsah a následný počet použitých bitů závisí na přibližné velikosti pixelů. Horní a levé okraje hrubého pixelu jsou zahrnuty a dolní a pravé okraje nejsou.
Následující tabulka popisuje interpretaci parametru posunu EvaluateAttributeSnapped
pro každou hrubou velikost pixelů.
Rozsah posunu EvaluateAttributeSnapped
Hrubá velikost pixelů | Indexovatelný rozsah | Velikost reprezentovatelného rozsahu | Počet potřebných bitů {x, y} | Binární maska použitelných bitů |
---|---|---|---|---|
1x1 (v pořádku) | {[-8, 7], [-8, 7]} | {16, 16} | {4, 4} | {00000000000xxxx, 0000000000xxxx} |
1x2 | {[-8, 7], [-16, 15]} | {16, 32} | {4, 5} | {00000000000xxxx, 00000000000xxxxx} |
2x1 | {[-16, 15], [-8, 7]} | {32, 16} | {5, 4} | {0000000000xxxxx, 0000000000xxxx} |
2x2 | {[-16, 15], [-16, 15]} | {32, 32} | {5, 5} | {0000000000xxxxx, 00000000000xxxxx} |
2x4 | {[-16, 15], [-32, 31]} | {32, 64} | {5, 6} | {0000000000xxxxx, 0000000000xxxxxx} |
4x2 | {[-32, 31], [-16, 15]} | {64, 32} | {6, 5} | {0000000000xxxxxxxx, 0000000000xxxxx} |
4x4 | {[-32, 31], [-32, 31]} | {64, 64} | {6, 6} | {0000000000xxxxxxxx, 000000000xxxxxx} |
Následující tabulky představují vodítko pro převod z pevné čárky na desetinnou čárku a desetinnou čárku. První použitelný bit v binární masce je znaménko a zbytek binární masky se skládá z číselné části.
Schéma čísel pro čtyřibitové hodnoty předávané do EvaluateAttributeSnapped
není specifické pro stínování s proměnlivou rychlostí. Je tu znovu pro úplnost.
Pro čtyřibitové hodnoty.
Binární hodnota | Desetinný | Zlomkový |
---|---|---|
1000 | -0,5f | -8 / 16 |
1001 | -0,4375f | -7 / 16 |
1010 | -0,375f | -6 / 16 |
1011 | -0,3125f | -5 / 16 |
1100 | -0,25f | -4 / 16 |
1101 | -0,1875f | -3 / 16 |
1110 | -0,125f | -2 / 16 |
1111 | -0.0625f | -1 /16 |
0000 | 0.0f | 0 / 16 |
0001 | -0.0625f | 1 / 16 |
0010 | -0,125f | 2 / 16 |
0011 | -0,1875f | 3 / 16 |
0100 | -0,25f | 4 / 16 |
0101 | -0,3125f | 5 / 16 |
0110 | -0,375f | 6 / 16 |
0111 | -0,4375f | 7 / 16 |
Pro 5bitové hodnoty.
Binární hodnota | Desetinný | Zlomkový |
---|---|---|
10000 | -1 | -16 / 16 |
10001 | -0.9375 | -15 / 16 |
10010 | -0.875 | -14 / 16 |
10011 | -0.8125 | -13 / 16 |
10100 | -0.75 | -12 / 16 |
10101 | -0.6875 | -11 / 16 |
10110 | -0.625 | -10 / 16 |
10111 | -0.5625 | -9 / 16 |
11000 | -0.5 | -8 / 16 |
11001 | -0.4375 | -7 / 16 |
11010 | -0.375 | -6 / 16 |
11011 | -0.3125 | -5 / 16 |
11100 | -0.25 | -4 / 16 |
11101 | -0.1875 | -3 / 16 |
11110 | -0.125 | -2 / 16 |
11111 | -0.0625 | -1 / 16 |
00000 | 0 | 0 / 16 |
00001 | 0.0625 | 1 / 16 |
00010 | 0.125 | 2 / 16 |
00011 | 0.1875 | 3 / 16 |
00100 | 0.25 | 4 / 16 |
00101 | 0.3125 | 5 / 16 |
00110 | 0.375 | 6 / 16 |
00111 | 0.4375 | 7 / 16 |
01000 | 0.5 | 8 / 16 |
01001 | 0.5625 | 9 / 16 |
01010 | 0.625 | 10 / 16 |
01011 | 0.6875 | 11 / 16 |
01100 | 0.75 | 12 / 16 |
01101 | 0.8125 | 13 / 16 |
01110 | 0.875 | 14 / 16 |
01111 | 0.9375 | 15 / 16 |
U šestibitových hodnot.
Binární hodnota | Desetinný | Zlomkový |
---|---|---|
100000 | -2 | -32 / 16 |
100001 | -1.9375 | -31 / 16 |
100010 | -1.875 | -30 / 16 |
100011 | -1.8125 | -29 / 16 |
100100 | -1.75 | -28 / 16 |
100101 | -1.6875 | -27 / 16 |
100110 | -1.625 | -26 / 16 |
100111 | -1.5625 | -25 / 16 |
101000 | -1.5 | -24 / 16 |
101001 | -1.4375 | -23 / 16 |
101010 | -1.375 | -22 / 16 |
101011 | -1.3125 | -21 / 16 |
101100 | -1.25 | -20 / 16 |
101101 | -1.1875 | -19 / 16 |
101110 | -1.125 | -18 / 16 |
101111 | -1.0625 | -17 / 16 |
110000 | -1 | -16 / 16 |
110001 | -0.9375 | -15 / 16 |
110010 | -0.875 | -14 / 16 |
110011 | -0.8125 | -13 / 16 |
110100 | -0.75 | -12 / 16 |
110101 | -0.6875 | -11 / 16 |
110110 | -0.625 | -10 / 16 |
110111 | -0.5625 | -9 / 16 |
111000 | -0.5 | -8 / 16 |
111001 | -0.4375 | -7 / 16 |
111010 | -0.375 | -6 / 16 |
111011 | -0.3125 | -5 / 16 |
111100 | -0.25 | -4 / 16 |
111101 | -0.1875 | -3 / 16 |
111110 | -0.125 | -2 / 16 |
111111 | -0.0625 | -1 / 16 |
000000 | 0 | 0 / 16 |
000001 | 0.0625 | 1 / 16 |
000010 | 0.125 | 2 / 16 |
000011 | 0.1875 | 3 / 16 |
000100 | 0.25 | 4 / 16 |
000101 | 0.3125 | 5 / 16 |
000110 | 0.375 | 6 / 16 |
000111 | 0.4375 | 7 / 16 |
001000 | 0.5 | 8 / 16 |
001001 | 0.5625 | 9 / 16 |
001010 | 0.625 | 10 / 16 |
001011 | 0.6875 | 11 / 16 |
001100 | 0.75 | 12 / 16 |
001101 | 0.8125 | 13 / 16 |
001110 | 0.875 | 14 / 16 |
001111 | 0.9375 | 15 / 16 |
010000 | 1 | 16 / 16 |
010001 | 1.0625 | 17 / 16 |
010010 | 1.125 | 18 / 16 |
010011 | 1.1875 | 19 / 16 |
010100 | 1.25 | 20 / 16 |
010101 | 1.3125 | 21 / 16 |
010110 | 1.375 | 22 / 16 |
010111 | 1.4375 | 23 / 16 |
011000 | 1.5 | 24 / 16 |
011001 | 1.5625 | 25 / 16 |
011010 | 1.625 | 26 / 16 |
011011 | 1.6875 | 27 / 16 |
011100 | 1.75 | 28 / 16 |
011101 | 1.8125 | 29 / 16 |
011110 | 1.875 | 30 / 16 |
011111 | 1.9375 | 31 / 16 |
Stejně jako u jemných pixelů je mřížka vyhodnocovaných umístění EvaluateAttributeSnapped
při použití hrubého stínování pixelů na střed hrubého pixelu.
SetSamplePositions
Když se rozhraní API ID3D12GraphicsCommandList1::SetSamplePositions použije s hrubým stínováním, rozhraní API nastaví ukázkové pozice pro jemné pixely.
SV_Coverage
Pokud je SV_Coverage
deklarován jako vstup shaderu nebo výstup ve vrstvě 1, je zakázané hrubé stínování pixelů.
Můžete použít SV_Coverage
sémantiku s hrubým stínováním pixelů na vrstvě 2 a odráží, které vzorky cíle MSAA se zapisují.
Při použití hrubého stínování pixelů, což umožňuje vytvoření dlaždice více zdrojových pixelů, maska pokrytí představuje všechny vzorky, které pocházejí z této dlaždice.
Vzhledem k kompatibilitě hrubého stínování pixelů s MSAA se může lišit počet bitů pokrytí, které je potřeba zadat. Například s prostředkem MSAA 4x pomocí D3D12_SHADING_RATE_2x2, každý hrubý pixel zapíše na čtyři jemné pixely a každý jemný pixel má čtyři vzorky. To znamená, že každý hrubý pixel zapisuje celkem 4 × 4 = 16 vzorků.
Počet potřebných bitů pokrytí
Následující tabulka uvádí, kolik bitů pokrytí je potřeba pro každou kombinaci hrubé velikosti pixelů a úrovně MSAA.
Jak je uvedeno v tabulce, není možné použít hrubé pixely k zápisu do více než 16 vzorků najednou pomocí funkce stínování proměnlivé rychlosti vystavené prostřednictvím Direct3D 12. Toto omezení je způsobeno omezeními Direct3D 12 týkajícími se toho, které úrovně MSAA jsou povolené s hrubou velikostí pixelů (viz tabulka v S stínováním proměnlivé rychlosti (VRS) oddílu v tomto tématu).
Řazení a formátování bitů v maskě pokrytí
Bity masky pokrytí odpovídají dobře definovanému pořadí. Maska se skládá z pokrytí z pixelů zleva doprava a pak shora dolů (hlavní sloupec). Bity pokrytí jsou bity sémantické pokrytí s nízkým pořadím a jsou hustě zabalené dohromady.
Následující tabulka ukazuje formát masky pokrytí pro podporované kombinace hrubé velikosti pixelů a úrovně MSAA.
Následující tabulka znázorňuje 2x pixely MSAA, kde každý pixel má dva vzorky indexů 0 a 1.
Umístění popisků vzorků na pixelech je pro ilustrativní účely a nemusí nutně vyjadřovat prostorová umístění vzorků {X, Y} na daném pixelu; zejména vzhledem k tomu, že pozice vzorku lze programově změnit. Na ukázky se odkazuje jejich index založený na 0.
Následující tabulka uvádí 4x pixely MSAA, kde každý pixel má čtyři vzorky indexů 0, 1, 2 a 3.
Odhodit
Při použití sémantické discard
HLSL s hrubým stínováním pixelů se hrubé pixely zahodí.
Rasterizace nezávislá na cíli (TIR)
TIR není podporován při použití hrubého stínování pixelů.
Zobrazení rastrového pořadí (ROV)
Interlocky ROV jsou zadány jako provozní s jemnými pixely členitosti. Pokud se stínování provádí pro každý vzorek, interlocky fungují při vzorkovací členitosti.
Konzervativní rasterizace
S stínováním proměnlivé rychlosti můžete použít konzervativní rasterizaci. Při použití konzervativní rasterizace s hrubým stínováním pixelů, jemné pixely v hrubých pixelech jsou konzervativně rasterizovány tím, že mají plnou pokrytí.
Pokrytí
Při použití konzervativní rasterizace obsahuje sémantika pokrytí úplné masky pro jemné pixely, které jsou pokryty, a 0 pro jemné pixely, které nejsou pokryty.
Svazky
V sadě můžete volat rozhraní API stínování s proměnlivou rychlostí.
Průchody vykreslení
Rozhraní API stínování proměnlivé rychlosti můžete volat v vykreslení.
Volání rozhraní API VRS
Tato další část popisuje způsob, jakým je stínování proměnlivé rychlosti přístupné pro vaši aplikaci prostřednictvím Direct3D 12.
Dotazování schopností
Pokud chcete zadat dotaz na schopnost stínování proměnné adaptéru, zavolejte ID3D12Device::CheckFeatureSupport pomocí D3D12_FEATURE::D 3D12_FEATURE_D3D12_OPTIONS6a zadejte D3D12_FEATURE_DATA_D3D12_OPTIONS6 strukturu, kterou funkce vyplní. Struktura D3D12_FEATURE_DATA_D3D12_OPTIONS6 obsahuje několik členů, včetně jednoho z výčtových typů D3D12_VARIABLE_SHADING_RATE_TIER (D3D12_FEATURE_DATA_D3D12_OPTIONS6::VariableShadingRateTier) a jednoho, který označuje, zda je podporováno zpracování na pozadí (D3D12_FEATURE_DATA_D3D12_OPTIONS6::BackgroundProcessingSupported).
Pokud chcete například zadat dotaz na funkci vrstvy 1, můžete to udělat.
D3D12_FEATURE_DATA_D3D12_OPTIONS6 options;
return
SUCCEEDED(m_device->CheckFeatureSupport(
D3D12_FEATURE_D3D12_OPTIONS6,
&options,
sizeof(options))) &&
options.ShadingRateTier == D3D12_VARIABLE_SHADING_RATE_TIER_1;
Míra stínování
Hodnoty v D3D12_SHADING_RATE výčtu jsou uspořádané tak, aby míry stínování byly snadno rozloženy do dvou os, kde jsou hodnoty každé osy kompaktně reprezentovány v logaritmickém prostoru podle D3D12_AXIS_SHADING_RATE výčtu.
Makro můžete vytvořit, abyste vytvořili dvě míry stínování os do míry stínování, jako je tato.
#define D3D12_MAKE_COARSE_SHADING_RATE(x,y) ((x) << 2 | (y))
D3D12_MAKE_COARSE_SHADING_RATE(
D3D12_AXIS_SHADING_RATE_2X,
D3D12_AXIS_SHADING_RATE_1X)
Platforma také poskytuje tato makra definovaná v d3d12.h
.
#define D3D12_GET_COARSE_SHADING_RATE_X_AXIS(x) ((x) >> 2 )
#define D3D12_GET_COARSE_SHADING_RATE_Y_AXIS(y) ((y) & 3 )
Ty se dají použít k rozesektání a pochopení SV_ShaderRate
.
Poznámka
Tato interpretace dat je zaměřená na popis obrázku prostoru na obrazovce, který lze manipulovat shadery. To je popsáno dále v částech výše. Neexistuje ale důvod, proč nemáte konzistentní definici hrubých velikostí pixelů, které se mají použít všude, včetně nastavení rychlosti stínování na úrovni příkazů.
Nastavení rychlosti stínování na úrovni příkazů a kombinátorů
Rychlost stínování a volitelně kombinátory se zadají prostřednictvím metody ID3D12GraphicsCommandList5::RSSetShadingRate metody. Pro základní míru stínování předáte D3D12_SHADING_RATE hodnotu a volitelnou matici D3D12_SHADING_RATE_COMBINER hodnot.
Příprava obrázku místa na obrazovce
Stav prostředků jen pro čtení, který určuje použitelnou míru stínování obrázku, je definován jako D3D12_RESOURCE_STATES::D 3D12_RESOURCE_STATE_SHADING_RATE_SOURCE.
Nastavení obrázku prostoru na obrazovce
Obrázek prostoru obrazovky zadáte prostřednictvím ID3D12GraphicsCommandList5::RSSetShadingRateImage metoda.
m_commandList->RSSetShadingRateImage(screenSpaceImage);
Dotazování na velikost dlaždice
Velikost dlaždice můžete dotazovat z D3D12_FEATURE_DATA_D3D12_OPTIONS6::ShadingRateImageTileSize členu. Viz výše možnosti dotazování.
Načte se jedna dimenze, protože vodorovné a svislé dimenze jsou vždy stejné. Pokud je schopnost systému D3D12_SHADING_RATE_TIER_NOT_SUPPORTED, vrátí se velikost dlaždice 0.