Tiefenausrichtung

Polygone, die im 3D-Raum koplanar sind, können so aussehen, als ob sie nicht koplanar sind, indem sie jeweils eine Z-Verzerrung (oder Tiefenverzerrung) hinzufügen.

Dies ist eine Technik, die häufig verwendet wird, um sicherzustellen, dass Schatten in einer Szene ordnungsgemäß angezeigt werden. Für instance hat ein Schatten auf einer Wand wahrscheinlich den gleichen Tiefenwert wie die Wand. Wenn eine Anwendung zuerst eine Wand und dann einen Schatten rendert, ist der Schatten möglicherweise nicht sichtbar, oder Tiefenartefakte sind möglicherweise sichtbar.

Eine Anwendung kann dazu beitragen, sicherzustellen, dass coplanare Polygone ordnungsgemäß gerendert werden, indem die Verzerrung (vom DepthBias-Member von D3D11_RASTERIZER_DESC1) zu den Z-Werten hinzugefügt wird, die das System beim Rendern der Sätze von koplanaren Polygonen verwendet. Polygone mit einem größeren z-Wert werden vor Polygonen mit einem kleineren z-Wert gezeichnet.

Es gibt zwei Optionen zum Berechnen der Tiefenverzerrung.

  1. Wenn der Tiefenpuffer, der derzeit an die Output-Merger-Phase gebunden ist, ein UNORM-Format aufweist oder kein Tiefenpuffer gebunden ist, wird der Biaswert wie folgt berechnet:

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

    Dabei ist r der minimal darstellbare Wert > 0 im Tiefenpufferformat, das in float32 konvertiert wird. Die Werte DepthBias und SlopeScaledDepthBias sind D3D11_RASTERIZER_DESC1 Strukturmember. Der MaxDepthSlope-Wert ist das Maximum der horizontalen und vertikalen Neigungen des Tiefenwerts am Pixel.

  2. Wenn ein Gleitkommatiefenpuffer an die Output-Merger-Phase gebunden ist, wird der Biaswert wie folgt berechnet:

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

    Dabei ist r die Anzahl der Mantissenbits in der Gleitkommadarstellung (mit Ausnahme des ausgeblendeten Bits); Beispiel: 23 für float32.

Der Bias-Wert wird dann wie folgt eingespannt:

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

Der Biaswert wird dann verwendet, um die Pixeltiefe zu berechnen.

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

Tiefenverzerrungsvorgänge treten auf Scheitelpunkten nach dem Clipping auf, daher hat tiefenverzerrung keine Auswirkungen auf das geometrische Beschneiden. Der Biaswert ist für einen bestimmten Grundtyp konstant und wird vor der Einrichtung des Interpolators dem z-Wert für jeden Scheitelpunkt hinzugefügt. Wenn Sie Featureebenen 10.0 und höher verwenden, werden alle Verzerrungsberechnungen mithilfe der 32-Bit-Gleitkommaarithmetik durchgeführt. Die Verzerrung wird nicht auf Punkt- oder Liniengrundtypen angewendet, mit Ausnahme von Linien, die im Drahtmodellmodus gezeichnet wurden.

Eines der Artefakte mit schattenpufferbasierten Schatten ist Schattenakne oder eine Oberfläche, die sich selbst aufgrund geringfügiger Unterschiede zwischen der Tiefenberechnung in einem Shader und der Tiefe derselben Oberfläche im Schattenpuffer selbst abschattiert. Eine Möglichkeit, dies zu verringern, ist die Verwendung von DepthBias und SlopeScaledDepthBias beim Rendern eines Schattenpuffers . Die Idee besteht darin, Oberflächen ausreichend herauszuschieben, während ein Schattenpuffer gerendert wird, sodass das Vergleichsergebnis (zwischen dem Schattenpuffer z und dem Shader z) auf der gesamten Oberfläche konsistent ist, und lokale Selbstschattierung zu vermeiden.

Die Verwendung von DepthBias und SlopeScaledDepthBias kann jedoch zu neuen Renderingproblemen führen, wenn ein Polygon, das in einem extrem scharfen Winkel angezeigt wird, dazu führt, dass die Verzerrungsgleichung einen sehr großen z-Wert generiert. Dadurch wird das Polygon extrem weit von der ursprünglichen Oberfläche in der Schattenkarte entfernt. Eine Möglichkeit, dieses besondere Problem zu beheben, ist die Verwendung von DepthBiasClamp, das eine Obergrenze (positiv oder negativ) für die Größe der berechneten z-Verzerrung bereitstellt.

Hinweis

Für die Featureebenen 9.1, 9.2, 9.3 wird DepthBiasClamp nicht unterstützt.

 

Output-Merger-Phase