Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Mnohoúhelníky, které jsou koplanární ve 3D prostoru, lze vytvořit tak, aby vypadaly, jako by nebyly koplanární přidáním zkreslení z (nebo hloubkové předsudky) do každého z.
Jedná se o techniku, která se běžně používá k zajištění správného zobrazení stínů ve scéně. Například stín na zdi bude mít pravděpodobně stejnou hloubkovou hodnotu jako stěna. Pokud aplikace nejprve vykreslí zeď a pak stín, nemusí být stín viditelný nebo můžou být viditelné artefakty hloubky.
Aplikace může pomoct zajistit správné vykreslení koplanárních mnohoúhelníků přidáním zkreslení (z DepthBias člen D3D11_RASTERIZER_DESC1) do hodnot z, které systém používá při vykreslování sad kosplanárních mnohoúhelníků. Mnohoúhelníky s větší hodnotou z budou nakresleny před mnohoúhelníky s menší hodnotou z.
Existují dvě možnosti výpočtu hloubkové předsudky.
Pokud má hloubková vyrovnávací paměť, která je aktuálně vázána na fázi fúze výstupu, má formát UNORM nebo není vázána žádná vyrovnávací paměť hloubky, hodnota zkreslení se vypočítá takto:
Bias = (float)DepthBias * r + SlopeScaledDepthBias * MaxDepthSlope;kde r je minimální reprezentovatelná hodnota > 0 ve formátu hloubkové vyrovnávací paměti převedena na float32. Hodnoty DepthBias a SlopeScaledDepthBias jsou členy struktury D3D11_RASTERIZER_DESC1. Hodnota MaxDepthSlope je maximální vodorovná a svislá sklony hodnoty hloubky v pixelu.
Pokud je vyrovnávací paměť hloubky s plovoucí desetinnou čárkou vázána na fázi fúzování výstupu, vypočítá se hodnota předsudku takto:
Bias = (float)DepthBias * 2**(exponent(max z in primitive) - r) + SlopeScaledDepthBias * MaxDepthSlope;kde r je počet bitů mantisy v reprezentaci s plovoucí desetinou čárkou (s výjimkou skrytého bitu); Například 23 pro float32.
Hodnota předsudku se pak uchytí takto:
if(DepthBiasClamp > 0)
Bias = min(DepthBiasClamp, Bias)
else if(DepthBiasClamp < 0)
Bias = max(DepthBiasClamp, Bias)
Hodnota zkreslení se pak použije k výpočtu hloubky pixelů.
if ( (DepthBias != 0) || (SlopeScaledDepthBias != 0) )
z = z + Bias
Operace hloubkové předsudky se vyskytují na vrcholech po výřezu, a proto nemá žádný vliv na geometrické výřezy. Hodnota předsudku je konstantní pro danou primitivní hodnotu a je přidána k hodnotě z pro každý vrchol před nastavením interpolátoru. Pokud používáte úrovně funkcí 10,0 a vyšší, všechny výpočty předsudků se provádějí pomocí aritmetické aritmetické 32bitové plovoucí desetiny. Předsudky se nepoužijí u žádných primitiv bodů nebo čar s výjimkou čar nakreslených v režimu drátového modelu.
Jedním z artefaktů se stíny založenými na stínové vyrovnávací paměti je stínové akné nebo samotné stínování povrchu kvůli menším rozdílům mezi hloubkovou výpočtů v shaderu a hloubkou stejného povrchu ve stínové vyrovnávací paměti. Jedním ze způsobů, jak to zmírnit, je použití DepthBias a SlopeScaledDepthBias při vykreslování stínové vyrovnávací paměti. Cílem je dostatečně odsunout povrchy při vykreslování vyrovnávací paměti stínu tak, aby výsledek porovnání (mezi vyrovnávací pamětí stínu z a shaderem z) byl konzistentní napříč povrchem a vyhnul se místnímu samostínování.
Použití DepthBias a SlopeScaledDepthBias může způsobit nové problémy vykreslování, když mnohoúhelník zobrazený v extrémně ostrém úhlu způsobí, že rovnice sklonu vygeneruje velmi velkou hodnotu z. To v důsledku posune mnohoúhelník extrémně daleko od původního povrchu ve stínové mapě. Jedním ze způsobů, jak zmírnit tento konkrétní problém, je použít DepthBiasClamp, který poskytuje horní mez (kladné nebo záporné) o velikosti vypočítané z předsudky.
Související témata
-
fázeOutput-Merger