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


Mélységi torzítás

A 3D térben lévő sokszögek úgy jeleníthetők meg, mintha nem lennének coplanárisak, ha mindegyikhez hozzáadunk egy z-torzításokat (vagy mélységi torzításokat).

Ez a módszer gyakran használatos annak biztosítására, hogy a jelenet árnyékai megfelelően jelenjenek meg. Egy fal árnyékának például valószínűleg ugyanaz a mélységi értéke lesz, mint a falnak. Ha egy alkalmazás először egy falat, majd egy árnyékot jelenít meg, előfordulhat, hogy az árnyék nem látható, vagy a mélységi összetevők láthatók.

Az alkalmazások segíthetnek biztosítani a koplanáris sokszögek megfelelő renderelését azáltal, hogy hozzáadják a torzításokat (a DepthBias tagja D3D11_RASTERIZER_DESC1) a z-értékekhez, amelyeket a rendszer a koplanáris sokszögek halmazainak renderelésekor használ. A nagyobb z értékkel rendelkező sokszögek kisebb z értékkel rendelkező sokszögek elé kerülnek.

A mélységi torzítás kiszámításának két lehetősége van.

  1. Ha a kimeneti összevonási fázishoz jelenleg kötött mélységi puffer UNORM formátummal rendelkezik, vagy nincs megkötve a mélységi puffer, a rendszer a torzítás értékét a következőképpen számítja ki:

    Bias = (float)DepthBias * r + SlopeScaledDepthBias * MaxDepthSlope;
    

    ahol r a minimálisan ábrázolható érték > 0 lebegőpontos32. A DepthBias és SlopeScaledDepthBias értékek D3D11_RASTERIZER_DESC1 struktúratagok. A MaxDepthSlope érték a képpontnál mért mélységi érték vízszintes és függőleges meredeksége.

  2. Ha egy lebegőpontos mélységi puffer a kimeneti összevonási fázishoz van kötve, a torzítás értéke a következőképpen lesz kiszámítva:

    Bias = (float)DepthBias * 2**(exponent(max z in primitive) - r) +
                SlopeScaledDepthBias * MaxDepthSlope;
    

    ahol r a lebegőpontos ábrázolás mantissa bitjeinek száma (a rejtett bit kivételével); például 23 lebegőpontos32.

A torzítás értéke ezután a következőképpen lesz rögzítve:

if(DepthBiasClamp > 0)
    Bias = min(DepthBiasClamp, Bias)
else if(DepthBiasClamp < 0)
    Bias = max(DepthBiasClamp, Bias)

A torzítás értéke ezután a képpontmélység kiszámítására szolgál.

if ( (DepthBias != 0) || (SlopeScaledDepthBias != 0) )
    z = z + Bias

A mélységi torzítás a kivágást követően csúcsokon történik, ezért a mélységi torzításnak nincs hatása a geometriai kivágásokra. Az elfogultság értéke egy adott primitív esetében állandó, és az interpolátor beállítása előtt hozzáadódik az egyes csúcsok z értékéhez. Ha 10,0-s vagy újabb funkciószintet használ, az összes torzítás számítása 32 bites lebegőpontos számtani módszerrel történik. A torzítás nem alkalmazható pont- vagy vonalprimitívekre, kivéve a drótváz módban rajzolt vonalakat.

Az árnyékpufferalapú árnyékolású összetevők egyike az árnyék akne, vagy maga a felület árnyékolása az árnyékolóban lévő mélységi számítások és az árnyékpuffer ugyanazon felületének mélysége közötti kisebb különbségek miatt. Ennek egyik módja, ha DepthBias és SlopeScaledDepthBias használ árnyékpuffer renderelésekor. Az a cél, hogy a felületek elég kitolása árnyékpuffer renderelése közben, hogy a z árnyékpuffer és a z árnyékoló közötti összehasonlítási eredmény konzisztens legyen a felszínen, és elkerüljük a helyi önárnyékolást.

A DepthBias és SlopeScaledDepthBias használata azonban új renderelési problémákat okozhat, ha egy rendkívül éles szögben megtekintett sokszög nagyon nagy z értéket eredményez. Ez valójában rendkívül távolra tolja a sokszöget az árnyéktérkép eredeti felületétől. A probléma enyhítésének egyik módja a DepthBiasClamphasználata, amely a kiszámított z torzítás mértékének felső határát (pozitív vagy negatív) adja meg.

Jegyzet

A 9.1, 9.2, 9.3 DepthBiasClamp nem támogatott.

 

Output-Merger szakasz