Freigeben über


Tiefenverzerrung

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

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

Eine Anwendung kann sicherstellen, dass koplanare Polygone ordnungsgemäß gerendert werden, indem sie die Verzerrung (vom DepthBias Member von D3D11_RASTERIZER_DESC1) zu den Z-Werten hinzufügen, 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 von Tiefenverzerrungen.

  1. Wenn der zurzeit an die Ausgabezusammenführungsstufe gebundene Tiefenpuffer 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 minimale darstellbare Wert > 0 im Tiefenpufferformat, das in float32-konvertiert wurde. Die DepthBias und SlopeScaledDepthBias Werte sind D3D11_RASTERIZER_DESC1 Strukturmmber. Der MaxDepthSlope Wert ist das Maximum der horizontalen und vertikalen Hängen des Tiefenwerts am Pixel.

  2. Wenn ein Gleitkommatiefepuffer an die Ausgabezusammenführungsstufe gebunden ist, wird der Bias-Wert wie folgt berechnet:

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

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

Der Bias-Wert wird dann wie folgt eingeklemmt:

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

Der Bias-Wert wird dann verwendet, um die Pixeltiefe zu berechnen.

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

Tiefenverzerrungsvorgänge treten nach dem Clipping auf Scheitelpunkte auf, daher hat tiefenverzerrung keine Auswirkungen auf geometrische Beschneidung. Der Bias-Wert ist für einen bestimmten Grundtyp konstant und wird dem Z-Wert für jeden Scheitelpunkt vor der Interpolatoreinrichtung hinzugefügt. Wenn Sie Featureebenen 10,0 und höher verwenden, werden alle Bias-Berechnungen mit 32-Bit-Gleitkommaarithmetik durchgeführt. Bias wird nicht auf Punkt- oder Liniengrundtypen angewendet, mit Ausnahme von Linien, die im Drahtmodellmodus gezeichnet wurden.

Eines der Artefakte mit schattenpufferbasierten Schattens ist Schatten akne oder eine Oberflächenschattierung selbst aufgrund kleiner Unterschiede zwischen der Tiefenberechnung in einem Shader und der Tiefe derselben Oberfläche im Schattenpuffer. Eine Möglichkeit, dies zu verringern, ist die Verwendung DepthBias und SlopeScaledDepthBias beim Rendern eines Schattenpuffers. Die Idee besteht darin, Oberflächen beim Rendern eines Schattenpuffers ausreichend herauszuschieben, sodass das Vergleichsergebnis (zwischen dem Schattenpuffer z und dem Shader z) über die Oberfläche konsistent ist und lokale Selbstschattierung vermieden wird.

Die Verwendung von DepthBias und SlopeScaledDepthBias kann jedoch neue Renderingprobleme verursachen, wenn ein Polygon, das in einem äußerst 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 zur Erleichterung dieses speziellen Problems besteht darin, DepthBiasClampzu verwenden, das eine obere Grenze (positiv oder negativ) für die Größe der berechneten Z-Verzerrung bereitstellt.

Anmerkung

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

 

Output-Merger Phase