Megosztás a következőn keresztül:


Direct3D 12 Konzervatív Raszterizálás

A konzervatív raszterizálás némi bizonyosságot ad a képpontmegjelenítéshez, ami különösen az ütközésészlelési algoritmusok esetén hasznos.

Áttekintés

A konzervatív raszterizálás azt jelenti, hogy a renderelt primitív által legalább részben lefedett összes képpont raszterizálva van, ami azt jelenti, hogy a képpontárnyékolót meghívja a rendszer. A normál viselkedés mintavételezés, amely nem használható, ha a konzervatív raszterizálás engedélyezve van.

A konzervatív raszterizálás számos helyzetben hasznos, többek között az ütközésészlelés, az elzáródási selejtezés és a csempés renderelés bizonyosságáért.

Az alábbi ábrán például egy zöld háromszög látható, amely konzervatív raszterizálással jelenik meg, ahogyan az a raszterizátorban is megjelenik (azaz 16,8 rögzített pont csúcspontkoordináta használatával). A barna terület úgynevezett "bizonytalansági régió" - egy fogalmi régió, amely a háromszög kiterjesztett határait jelöli, amely ahhoz szükséges, hogy a raszterizátor primitívje konzervatív legyen az eredeti lebegőpontos csúcspont koordinátái tekintetében. Az egyes csúcspontok piros négyzetei azt mutatják, hogyan számítja ki a bizonytalansági régiót: egy söpört négyzetként.

A nagy szürke négyzetek a renderelendő képpontokat jelenítik meg. A rózsaszín négyzetek a "Top-Left Szabály" használatával renderelt képpontokat jelenítik meg, amelyek akkor kerülnek játékba, amikor a háromszög széle átlépi a képpontok szélét. Lehetnek hamis pozitívak (olyan képpontok, amelyeknek nem kellett volna), amelyeket a rendszer általában, de nem mindig selejtezni fog.

bal felső szabály

Interakciók a folyamattal

Raszterizálási szabályok interakciója

Konzervatív Raszterizálási módban a Raszterizálási szabályok ugyanúgy érvényesek, mint amikor a konzervatív Raszterizálási mód nincs engedélyezve a fent leírt Top-Left szabály és a képpontlefedettség kivételeivel. 16.8 Fixed-Point Raszterizátor pontosságát kell használni.

Azok a képpontok, amelyek nem lennének lefedve, ha a hardver teljes lebegőpontos csúcspontkoordinátát használna, csak akkor vehetők fel, ha egy olyan bizonytalansági régióban vannak, amely nem nagyobb fél képpontnál a rögzített ponttartományban. A jövőbeli hardverek várhatóan elérik a 2. rétegben meghatározott, megszigorított bizonytalansági régiót. Vegye figyelembe, hogy ez a követelmény megakadályozza, hogy a sliver háromszögek a szükségesnél tovább terjednek.

Hasonló érvényes bizonytalansági régió vonatkozik a InnerCoverage is, de szigorúbb, mivel egyetlen implementáció sem igényel nagyobb bizonytalansági régiót ebben az esetben. További részletekért lásd InnerCoverage interakciós.

A belső és külső bizonytalansági régióknak nagyobbnak vagy egyenlőnek kell lenniük, mint a képpont alatti rács fele, vagy a képpont 1/512-ének mérete a rögzített ponttartományban. Ez a minimális érvényes bizonytalansági régió. Az 1/512 a 16,8 rögzítettpontos Raszterizátor koordináta-ábrázolásból származik, valamint a lebegőpontos csúcspont koordinátáinak 16,8 rögzítettpont-koordinátákká való konvertálásakor alkalmazott ciklikusan legközelebbi szabályból. Az 1/512 változhat, ha a Raszterizátor pontossága megváltozik. Ha egy implementáció megvalósítja ezt a minimális bizonytalansági régiót, akkor a Top-Left szabályt kell követnie, amikor a bizonytalansági régió egy széle vagy sarka egy képpont széle vagy sarka mentén esik. A bizonytalansági régió levágott széleit a legközelebbi csúcspontként kell kezelni, ami azt jelenti, hogy két élnek számít: az a kettő, amely a társított csúcsponthoz csatlakozik. Top-Left Szabályra akkor van szükség, ha a minimális bizonytalansági régiót használja, mert ha nem, akkor a konzervatív raszterizálási implementáció nem tudja raszterizálni azokat a képpontokat, amelyeket a konzervatív raszterizálási mód letiltásakor lehet lefedni.

Az alábbi ábra egy érvényes külső bizonytalansági régiót szemléltet, amely a rögzített ponttartományban lévő primitív élei körül négyzetet söpört (azaz a csúcsokat a 16,8 rögzített pont ábrázolása számszerűsíti). A négyzet méretei a külső bizonytalansági régió érvényes méretén alapulnak: a képpont 1/2-ében a négyzet 1 képpont szélességű és magasságú, 1/512 képpontnál a négyzet 1/256 képpont szélességű és magasságú. A zöld háromszög egy adott primitívet jelöl, a piros pontozott vonal a túlbecsült konzervatív raszterizálás határát, a fekete négyzetek a primitív élek mentén söpört négyzetet jelölik, a kék kockás terület pedig a külső bizonytalansági régió:

külső bizonytalansági régió.

Többampling-interakció

Függetlenül attól, hogy hány minta található RenderTarget/DepthStencil felületeken (vagy ForcedSampleCount van-e használatban), az összes mintát a konzervatív raszterizálással raszterizált képpontok fedik le. Az egyes mintahelyeket nem teszteljük, hogy a primitívek közé esnek-e.

SampleMask interakció

A SampleMask Rasterizer State ugyanúgy vonatkozik, mint amikor a konzervatív raszterizálás nincs engedélyezve InputCoverageesetében, de nem érinti a InnerCoverage (azaz nem és nem a InnerCoverageáltal deklarált bemenetbe). Ennek az az oka, hogy InnerCoverage nincs összefüggésben azzal, hogy az MSAA-minták maszkolva vannak-e: 0 InnerCoverage csak azt jelenti, hogy a képpont nem garantáltan teljes mértékben lefedve van, nem pedig azt, hogy egyetlen minta sem lesz frissítve.

Mélységi/rajzsablontesztelési interakció

A mélység/rajzsablon tesztelése a konzervatív módon raszterizált képpontok esetében ugyanúgy folytatódik, mint ha az összes mintát lefedi, ha a konzervatív raszterizálás nincs engedélyezve.

Az összes érintett minta használata mélységi extrapolációt okozhat, amely érvényes, és a megadott nézethez kell rögzíteni, ha a konzervatív raszterizálás nincs engedélyezve. Ez hasonló ahhoz, mint amikor pixelfrekvenciás interpolációs módokat használnak egy RenderTarget 1-nél nagyobb mintaszámmal, bár konzervatív raszterezés esetén ez a mélységi érték, amely a rögzített függvénymélység-vizsgálatba kerül, amely extrapolálható.

A mélységi extrapoláció korai mélységi vágási viselkedése nincs meghatározva. Ennek az az oka, hogy egyes korai mélységű selejtezési hardverek nem támogatják megfelelően az extrapolált mélységi értékeket. A mélységi extrapoláció jelenlétében azonban a korai mélységi vágási viselkedés még az extrapolált mélységértékeket támogató hardverek esetén is problémás. Ez a probléma megkerülhető úgy, hogy a Pixel Shader bemeneti mélységét a raszterizált primitív minimális és maximális mélységi értékeihez szorítja, és ezt az értéket oDepth (a képpontárnyékoló kimeneti mélységének regisztrálása) értékre írja. Ebben az esetben a korai mélységi selejtezés letiltásához implementációkra van szükség az írási oDepth miatt.

Segítő képpontok interakciója

A Helper Pixel szabályai ugyanúgy érvényesek, mint amikor a konzervatív raszterizálás nincs engedélyezve. Ennek részeként az összes képpontnak, beleértve a Segítő képpontokat is, pontosan kell jelentenie InputCoverage a InputCoverage interakciós szakaszban megadott módon. A teljesen nem lefedett képpontok 0 lefedettséget jelentenek.

Kimeneti lefedettség interakciója

A kimeneti lefedettség (oMask) a konzervatívan raszterizált képpontok esetében ugyanúgy viselkedik, mint amikor a konzervatív raszterizálás nem engedélyezve van az összes érintett mintával.

InputCoverage interakció

Konzervatív raszterizálási módban ez a bemeneti regiszter úgy van feltöltve, mintha minden minta lefedve van, ha a konzervatív raszterizálás nem engedélyezve van egy adott konzervatív raszterizált képpont esetében. Vagyis minden meglévő interakció érvényes (pl. SampleMask van alkalmazva), és az LSB-ből származó InputCoverage első n bitjei 1 értékre vannak állítva egy konzervatívan raszterizált képponthoz, mivel az n minta képpontonként RenderTarget és/vagy DepthStencil puffert kötött a Kimeneti összevonási, vagy n mintát ForcedSampleCount. A többi bit 0.

Ez a bemenet a konzervatív raszterizálástól függetlenül elérhető egy árnyékolóban, bár a konzervatív raszterizálás megváltoztatja a viselkedését, hogy csak az összes érintett mintát jelenítse meg (vagy a Segítő képpontok esetében egyiket sem).

InnerCoverage interakció

Ezt a funkciót a 3. réteg megköveteli, és csak a 3. rétegben érhető el. A futtatókörnyezet nem fog árnyékolót létrehozni azoknál az árnyékolóknál, amelyek ezt a módot használják, ha egy implementáció a 3. szintnél kisebb réteget támogat.

A Pixel Shader 32 bites skaláris egész számrendszer-generáló értékkel rendelkezik: InnerCoverage. Ez egy olyan bitmező, amelynek 0 bitje az LSB-ből 1 értékre van állítva egy adott konzervatívan raszterizált képponthoz, csak akkor, ha ez a képpont garantáltan teljes egészében a jelenlegi primitívben van. Minden más bemenetiregisztrátor-bitet 0 értékre kell állítani, ha a 0. bit nincs beállítva, de a 0. bit értéke 1 (ez a bitmező lényegében egy logikai értéket jelöl, ahol a hamisnak pontosan 0-nak kell lennie, de az igaz lehet bármilyen páratlan (azaz 0. bitkészlet) nem nulla érték. Ez a bemenet az alulbecsült konzervatív raszterizálási információkhoz használatos. Tájékoztatja a Pixel Shadert, hogy az aktuális képpont teljesen a geometrián belül helyezkedik-e el.

Ennek figyelembe kell vennie a illesztési hibát az aktuális rajzot működtető felbontásnál nagyobb vagy egyenlő felbontásnál. Nem lehetnek hamis pozitív értékek (InnerCoverage bitek beállítása, ha a képpontot nem fedi le teljes mértékben az aktuális rajzot működtető felbontásnál nagyobb vagy egyenlő felbontásnál felmerülő illesztési hiba), de a hamis negatív értékek engedélyezettek. Összefoglalva, az implementáció nem azonosíthatja helytelenül a teljes mértékben lefedett képpontokat, amelyek nem lennének teljes lebegőpontos csúcspont koordinátákkal a Rasterizerben.

Azokat a képpontokat, amelyek teljes mértékben lefednék, ha a hardver teljes lebegőpontos csúcspontkoordinátát használna, csak akkor hagyhatók ki, ha a belső bizonytalansági régiót metszik, amely nem lehet nagyobb, mint a képpont alatti rács mérete, vagy egy képpont 1/256-a a rögzített ponttartományban. Másként fogalmazva, a képpontokat teljes mértékben a belső bizonytalansági régió belső határán belül teljes mértékben lefedettként kell megjelölni. A bizonytalansági régió belső határát az alábbi ábrán a félkövér fekete pontozott vonal szemlélteti. Az 1/256 a 16,8 rögzítettpontos Raszterizátor koordináta-ábrázolásból származik, amely a Raszterizátor pontosságának változása esetén változhat. Ez a bizonytalansági régió elegendő ahhoz, hogy figyelembe vehesse a lebegőpontos csúcspont koordinátáinak a Raszterizer rögzített csúcspont koordinátáira való konvertálása által okozott illesztési hibát.

A Raszterizálási szabályok interakciójában meghatározott 1/512 minimális bizonytalansági régióra vonatkozó követelmények itt is érvényesek.

Az alábbi ábra egy érvényes belső bizonytalansági régiót szemléltet, amely a rögzített pont tartományában lévő primitív élei körül négyzetet söpört (azaz a csúcsokat a 16,8 rögzítettpont-ábrázolással számszerűsítették). A négyzet méretei a belső bizonytalansági régió érvényes méretén alapulnak: egy képpont 1/256-ában a négyzet a képpont szélességének és magasságának 1/128-a. A zöld háromszög egy adott primitívet jelöl, a félkövér fekete pontozott vonal a belső bizonytalansági régió határát jelöli, a fekete négyzetek a primitív élek mentén söpört négyzetet, a narancssárga kockás terület pedig a belső bizonytalansági régió:

belső bizonytalanság újraértelmezése.

A InnerCoverage használata nem befolyásolja, hogy a képpontok konzervatív raszterizáltak-e, azaz az ilyen InputCoverage módok egyikének használata nem befolyásolja, hogy mely képpontok legyenek raszterizálva, ha a konzervatív raszterizálási mód engedélyezve van. Ezért ha InnerCoverage használ, és a Pixel Shader olyan képpontot dolgoz fel, amelyet nem fed le teljesen a geometria, az értéke 0 lesz, de a Pixel Shader meghívása frissített mintákat fog kapni. Ez eltér a InputCoverage 0-tól, ami azt jelenti, hogy nem frissülnek a minták.

Ez a bemenet kölcsönösen kizárja a InputCoverage: mindkettő nem használható.

A InnerCoverageeléréséhez egyetlen összetevőként kell deklarálni az egyik Pixel Shader bemeneti regiszterből. A deklaráció interpolációs módjának állandónak kell lennie (az interpoláció nem alkalmazható).

A InnerCoverage bitmezőt nem befolyásolják a mélységi/rajzsablon-tesztek, és a SampleMask Raszterizer állapota sem.

Ez a bemenet csak konzervatív Raszterizációs módban érvényes. Ha a konzervatív raszterizálás nincs engedélyezve, InnerCoverage meghatározatlan értéket hoz létre.

A Helper Pixels szükséglete által okozott Pixel Shader-hívásokat, de a primitív nem fedi le, a InnerCoverage-regisztrációnak 0-ra kell állítania.

Attribútum interpolációs interakciója

Az attribútum-interpolációs módok változatlanok, és ugyanúgy haladnak tovább, mint amikor a konzervatív raszterizálás nincs engedélyezve, ahol a nézetport skálázott és rögzített ponttal konvertált csúcsokat használ. Mivel egy konzervatívan raszterizált képpontban lévő összes mintát lefedettnek tekintünk, az értékek extrapolálásakor érvényes, hasonlóan ahhoz, mint amikor a képpontfrekvenciás interpolációs módokat egy RenderTarget 1-nél nagyobb mintaszámmal használják. A centroid interpolációs módok a megfelelő nem centroid interpolációs móddal azonos eredményeket eredményeznek; a centroid fogalma ebben a forgatókönyvben értelmetlen – ahol a minta lefedettsége csak teljes vagy 0.

A konzervatív raszterizálás lehetővé teszi, hogy a degenerált háromszögek Pixel Shader-hívásokat generáljanak, ezért a degenerált háromszögeknek az összes interpolált értékhez a 0. csúcshoz rendelt értékeket kell használniuk.

Kivágási műveletek

Ha a konzervatív raszterizálási mód engedélyezve van, és a mélységi klip le van tiltva (ha a DepthClipEnable Raszterizer State értéke FALSE), előfordulhat, hogy a 0 <= z <= w tartományon kívül eső primitív szegmensek attribútum-interpolációjában varianciák jelennek meg a megvalósítástól függően: vagy állandó értékeket használnak attól a ponttól kezdve, ahol a primitív metszi a megfelelő síkot (közel vagy távol), vagy az attribútum interpolációja úgy viselkedik, mint amikor a konzervatív raszterizálási mód le van tiltva. A mélységérték viselkedése azonban a konzervatív raszterizálási módtól függetlenül ugyanaz, azaz a mélységi tartományon kívül eső primitíveknek továbbra is meg kell adni a nézetmélység-tartomány legközelebbi korlátjának értékét. Az attribútum interpolációs viselkedésének a 0 <= z <= w tartománynak változatlannak kell maradnia.

Klip távolságának interakciója

A clip Distance akkor érvényes, ha a konzervatív raszterizálási mód engedélyezve van, és a konzervatívan raszterizált képpontok esetében ugyanúgy viselkedik, mint amikor a konzervatív raszterizálás nem engedélyezve van az összes érintett mintával.

Vegye figyelembe, hogy a konzervatív raszterizálás a W csúcskoordináta extrapolációját okozhatja, ami W <= 0-t okozhat. Ez azt okozhatja, hogy a képpontonkénti clip Distance-implementációk olyan kliptávolságon működnek, amely perspektíva szerint el van osztva érvénytelen W értékkel. A Clip Distance implementációknak védenie kell a raszterizálást olyan képpontok esetében, ahol a csúcspont koordináta W <= 0 (például a konzervatív raszterizációs módban történő extrapoláció miatt).

Célfüggetlen raszterizációs interakció

A konzervatív raszterizálási mód kompatibilis a Target Independent Rasterization (TIR) funkcióval. A TIR-szabályok és korlátozások érvényesek, a konzervatív módon raszterizált képpontokra úgy viselkednek, mintha az összes minta lefedve lenne.

IA primitív topológia interakciója

A konzervatív raszterizálás nincs definiálva vonal- vagy pontprimitívekhez. Ezért a pontokat vagy vonalakat meghatározó primitív topológiák nem definiált viselkedést eredményeznek, ha a raszterizátor egységbe táplálják őket, amikor a konzervatív raszterizálás engedélyezve van.

A hibakeresési réteg ellenőrzése ellenőrzi, hogy az alkalmazások nem használják ezeket a primitív topológiákat.

Lekérdezések interakciója

A konzervatív módon raszterizált képpontok esetében a lekérdezések ugyanúgy viselkednek, mint amikor a konzervatív raszterizálás nincs engedélyezve az összes minta lefedésekor. A konzervatív raszterizált képpontok esetében például a D3D12_QUERY_TYPE_OCCLUSION és a D3D12_QUERY_TYPE_PIPELINE_STATISTICS (D3D12_QUERY_TYPE) ugyanúgy kell viselkednie, mint amikor a konzervatív raszterizálás nincs engedélyezve az összes minta lefedésekor.

A Képpontárnyékoló meghívásainak a konzervatív raszterizálási módban minden konzervatív módon raszterizált képpontra növekményesnek kell lennie.

A selejtezési állapot interakciója

Minden Cull állam érvényes konzervatív raszterizálási módban, és ugyanazokat a szabályokat követi, mint amikor a konzervatív raszterizálás nincs engedélyezve.

Ha a konzervatív raszterizálást hasonlítja össze önmagával vagy anélkül, hogy a konzervatív raszterizálás engedélyezve lenne, fennáll annak a lehetősége, hogy egyes primitívek eltérő arcot használnak (például az egyik háttal szemben, a másik előtérben). Az alkalmazások elkerülhetik ezt a bizonytalanságot a D3D12_CULL_MODE_NONE (D3D12_CULL_MODE) használatával, és nem a IsFrontFace rendszer által generált érték használatával.

IsFrontFace-interakció

A IsFrontFace rendszer által generált érték konzervatív raszterizálási módban használható, és követi a konzervatív raszterezés engedélyezésekor definiált viselkedést.

Kitöltési módok interakciója

A konzervatív raszterizáláshoz az egyetlen érvényes D3D12_FILL_MODE a D3D12_FILL_SOLID, a többi kitöltési mód érvénytelen paraméter a Raszteres állapothoz.

Ennek az az oka, hogy a D3D12 funkcionális specifikációja azt határozza meg, hogy a drótvázkitöltési módnak át kell alakítania a háromszög széleit vonalakká, és követnie kell a vonal raszterizálási szabályait, és a konzervatív vonal raszterizálási viselkedése nincs meghatározva.

Megvalósítás részletei

A Direct3D 12-ben támogatott raszterizálás típusát néha "túlbecsült konzervatív raszterizálásnak" is nevezik. Létezik az "alábecsült konzervatív raszterizálás" fogalma is, ami azt jelenti, hogy csak a renderelt primitív által teljes mértékben lefedett képpontok vannak raszterizálva. Az alulbecsült konzervatív raszterizálási információk a képpontárnyékolón keresztül érhetők el a bemeneti lefedettségi adatok használatával, és csak a túlbecsült konzervatív raszterizálás érhető el raszterizálási módként.

Ha egy primitív része átfedésben van egy képponttal, akkor a képpontot lefedettnek tekintik, majd raszterizálják. Ha egy primitív él vagy sarok egy képpont széle vagy sarka mentén esik, a "bal felső szabály" alkalmazása implementációspecifikus. A háromszögek degenerálását támogató implementációk esetében azonban egy elfajuló háromszögnek egy él vagy sarok mentén legalább egy képpontot kell lefednie.

A konzervatív raszterizálási implementációk különböző hardvereken változhatnak, és hamis pozitívumokat eredményeznek, ami azt jelenti, hogy helytelenül dönthetnek a képpontok lefedéséről. Ez olyan implementációspecifikus részletek miatt fordulhat elő, mint a raszterizálás során használt rögzített csúcspont koordinátáiban rejlő primitív növekvő vagy illesztési hibák. A hamis pozitív értékek (a rögzített pont csúcskoordinátái tekintetében) azért érvényesek, mert bizonyos mennyiségű hamis pozitív értékre van szükség ahhoz, hogy egy implementáció elvégezhesse a lefedettség kiértékelését a utólagos csúcspontokon (azaz a lebegőpontból a raszterizátorban használt 16,8 rögzített pontra konvertált csúcspont koordinátái), de tiszteletben kell tartania az eredeti lebegőpontos csúcspont koordinátái által előállított lefedettséget.

A konzervatív raszterizálási implementációk nem eredményeznek hamis negatívumokat a nem degenerált, pillanatkép utáni primitívek lebegőpontos csúcspont-koordinátái tekintetében: ha egy primitív rész bármelyik része átfedésben van egy képpont bármely részével, akkor a képpont raszterizálva lesz.

Azok a háromszögek, amelyek degenerálódnak (indexpufferben ismétlődő indexek vagy 3D-ben kollineáris indexek), vagy a rögzített pontváltás után degenerálódnak (kollineáris csúcsok a raszterizátorban), selejtezhetők; mindkettő érvényes viselkedés. A degenerált háromszögeket visszafelé nézőnek kell tekinteni, így ha egy alkalmazás egy adott viselkedést igényel, akkor használhatja a hátlapi vágást vagy az elülső irányú tesztelést. A degenerált háromszögek a 0. csúcshoz rendelt értékeket használják az összes interpolált értékhez.

A hardvertámogatásnak három szintje van, azon kívül, hogy a hardver nem támogatja ezt a funkciót.

  • Az 1. réteg legfeljebb 1/2 képpontos bizonytalansági régiót kényszerít ki, és nem támogatja a dokkolás utáni degenerációkat. Ez jó a csempézett rendereléshez, a textúra-atlaszhoz, a fénytérkép létrehozásához és a képpont alatti árnyéktérképekhez.
  • A 2. réteg 1/256-ra csökkenti a maximális bizonytalansági régiót, és megköveteli, hogy a beépülő modul utáni degenerációk ne legyenek levágva. Ez a szint hasznos a CPU-alapú algoritmusok gyorsításához (például a voxelizációhoz).
  • A 3. réteg legfeljebb 1/256 bizonytalansági régiót tart fenn, és támogatja a belső bemeneti lefedettséget. A belső bemeneti lefedettség hozzáadja az új SV_InnerCoverage értéket a magas szintű árnyékolási nyelvhez (HLSL). Ez egy 32 bites skaláris egész szám, amely megadható a képpontárnyékoló bemenetén, és az alábecsült konzervatív raszterizálási információkat (vagyis azt, hogy egy képpont garantált-e,to-be-teljes mértékben lefedve). Ez a szint hasznos az occlusion culling esetében.

API-összefoglalás

A következő módszerek, struktúrák, enumerációk és segédosztályok a konzervatív raszterizálásra hivatkoznak:

DirectX speciális oktatóvideó oktatóanyagai: Konzervatív raszterizálási

Raszterizer rendezett nézetek

renderelési