Direct3D 11.3 Konzervativní rasterizace
Konzervativní rasterizace přidává určitou jistotu k vykreslování pixelů, což je užitečné zejména pro algoritmy detekce kolizí.
Přehled
Konzervativní rasterizace znamená, že všechny pixely, které jsou alespoň částečně pokryty vykresleným primitivem, jsou rasterizovány, což znamená, že je vyvolán shader pixelů. Normální chování je vzorkování, které se nepoužívá, pokud je povolena konzervativní rasterizace.
Konzervativní rasterizace je užitečná v řadě situací, včetně jistoty při detekci kolizí, okluzování a detekce viditelnosti.
Například následující obrázek znázorňuje zelený trojúhelník vykreslený pomocí konzervativní rasterizace. Hnědá oblast se označuje jako "oblast nejistoty" – oblast, kde se zaokrouhlují chyby a další problémy, přidávají určité nejistoty do přesných rozměrů trojúhelníku. Červené trojúhelníky v každém vrcholu ukazují, jak se počítá oblast nejistoty. Velké šedé čtverce zobrazují pixely, které budou vykresleny. Růžové čtverečky zobrazují pixely vykreslené pomocí "levého horního pravidla", které se přehrávají jako hrana trojúhelníku protíná okraj pixelů. Mohou existovat falešně pozitivní (pixely nastavené, které by neměly být), které systém normálně, ale ne vždy cull.
Interakce s kanálem
Mnoho podrobností o tom, jak konzervativní rasterizace komunikuje s grafickým kanálem, najdete v tématu D3D12 Konzervativní rasterizace.
Podrobnosti implementace
Typ rasterizace podporované v Direct3D 12 se někdy označuje jako "přehodnocená konzervativní rasterizace". Existuje také koncept "podceňované konzervativní rasterizace", což znamená, že pouze pixely, které jsou plně pokryty vykresleným primitivem, jsou rasterizovány. Podceněné informace o konzervativní rasterizaci jsou dostupné prostřednictvím shaderu pixelů prostřednictvím použití vstupních dat pokrytí a jako režim rastrování je k dispozici pouze přehodnocená konzervativní rasterizace.
Pokud některá část primitivního objektu překrývá pixel, považuje se tento pixel za pokrytý a je pak rastrový. Když hrana nebo roh primitivního objektu spadá podél okraje nebo rohu pixelu, je použití levého horního pravidla specifické pro implementaci. U implementací, které podporují degenerační trojúhelníky, však degenerační trojúhelník podél okraje nebo rohu musí pokrýt alespoň jeden pixel.
Konzervativní rasterizace implementace se mohou lišit na různých hardwarech a vytvářejí falešně pozitivní výsledky, což znamená, že se mohou nesprávně rozhodnout, že pixely jsou pokryty. K tomu může dojít z důvodu podrobností specifických pro implementaci, jako jsou primitivní rostoucí chyby nebo chyby přichycení, které jsou součástí souřadnic vrcholů s pevným bodem použitými v rasterizaci. Důvodem falešně pozitivních výsledků (s ohledem na souřadnice vrcholů s pevným bodem) jsou platné, protože některé falešně pozitivní výsledky jsou potřeba k tomu, aby implementace mohla provádět vyhodnocení pokrytí proti přichyceným vrcholům (tj. souřadnic vrcholů, které byly převedeny z plovoucí desetinné čárky na 16,8 pevný bod použitý v rasterizátoru), ale respektujte pokrytí vytvořené původními souřadnicemi vrcholu s plovoucí desetinnou čárkou.
Konzervativní implementace rasterizace nevytvářejí falešně negativní výsledky s ohledem na souřadnice vrcholů s plovoucí desetinnou čárkou pro negenerované primitivy po přichycení: pokud jakákoli část primitivního objektu překrývá jakoukoli část pixelu, je tento pixel rastrový.
Trojúhelníky, které jsou degenerované (duplicitní indexy v vyrovnávací paměti indexu nebo kolineární v 3D) nebo se degenerují po převodu s pevným bodem (kolineární vrcholy v rastrovém systému), mohou nebo nemusí být culovány; obě jsou platné chování. Degenerované trojúhelníky musí být považovány za protilehlé, takže pokud je určité chování vyžadováno aplikací, může použít zpětné odvrácení nebo testování přední strany. Degenerované trojúhelníky používají hodnoty přiřazené vrcholu 0 pro všechny interpolované hodnoty.
Kromě možnosti, že hardware tuto funkci nepodporuje, existují tři úrovně hardwarové podpory.
- Vrstva 1 podporuje 1/2 pixelové oblasti nejistoty a bez degenerací po přichycení. To je vhodné pro dlaždicové vykreslování, texturový atlas, generování světlých map a stínové mapy pod pixely.
- Úroveň 2 přidává degenerované po přichycení a 1/256 oblastí nejistoty. Přidává také podporu akcelerace algoritmu založeného na procesoru (například voxelizace).
- Úroveň 3 přidává 1/512 oblastí nejistoty, vnitřní pokrytí vstupu a podporuje omezování okluze. Pokrytí vstupu přidá novou hodnotu
SV_InnerCoverage
do jazyka HLSL (High Level Shading Language). Jedná se o 32bitové skalární celé číslo, které lze zadat na vstupu do shaderu pixelů a představuje podceněné konzervativní rasterizační informace (to znamená, zda je zaručeno pixel -to-be-plně pokryto).
Souhrn rozhraní API
Následující metody, struktury, výčty a pomocné třídy odkazují na konzervativní rasterizaci:
- D3D11_RASTERIZER_DESC2 : struktura, která obsahuje popis rasterizátoru a označuje třídu pomocné rutiny CD3D12_RASTERIZER_DESC2 pro vytváření popisů rasterizátoru.
- D3D11_CONSERVATIVE_RASTERIZATION_MODE: výčtové hodnoty pro režim (zapnuto nebo vypnuto).
- D3D11_FEATURE_DATA_D3D11_OPTIONS2: struktura držící úroveň podpory.
- D3D11_CONSERVATIVE_RASTERIZATION_TIER: výčtové hodnoty pro každou úroveň podpory hardwaru.
- ID3D11Device::CheckFeatureSupport: metoda pro přístup k podporovaným funkcím.