Distorsione della profondità

I poligoni che sono coplanari nello spazio 3D possono essere creati come se non siano coplanari aggiungendo un bias z (o distorsione di profondità) a ognuno di essi.

Questa è una tecnica comunemente usata per garantire che le ombreggiature in una scena vengano visualizzate correttamente. Ad esempio, un'ombra su una parete avrà probabilmente lo stesso valore di profondità del muro. Se un'applicazione esegue il rendering di una parete prima e quindi un'ombreggiatura, l'ombreggiatura potrebbe non essere visibile o gli artefatti di profondità potrebbero essere visibili.

Un'applicazione può aiutare a garantire che i poligoni coplani vengano visualizzati correttamente aggiungendo il bias (dal membro DepthBias di D3D11_RASTERIZER_DESC1) ai valori z usati dal sistema durante il rendering dei set di poligoni coplani. I poligoni con un valore z più grande verranno disegnati davanti ai poligoni con un valore z più piccolo.

Esistono due opzioni per calcolare il pregiudizio della profondità.

  1. Se il buffer di profondità attualmente associato alla fase di fusione di output ha un formato UNORM o nessun buffer di profondità è associato, il valore di pregiudizio viene calcolato come segue:

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

    dove r è il valore > minimo rappresentabile 0 nel formato del buffer di profondità convertito in float32. I valori DepthBias e SlopeScaledDepthBias sono D3D11_RASTERIZER_DESC1 membri della struttura. Il valore MaxDepthSlope è il massimo delle piste orizzontali e verticali del valore di profondità al pixel.

  2. Se un buffer di profondità a virgola mobile è associato alla fase di fusione di output, il valore di distorsione viene calcolato come segue:

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

    dove r è il numero di bit di mantissa nella rappresentazione a virgola mobile (escluso il bit nascosto); ad esempio, 23 per float32.

Il valore di pregiudizio viene quindi bloccato come segue:

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

Il valore di pregiudizio viene quindi usato per calcolare la profondità dei pixel.

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

Le operazioni di distorsione della profondità si verificano sui vertici dopo il ritaglio, pertanto, la distorsione della profondità non ha alcun effetto sul ritaglio geometrico. Il valore di pregiudizio è costante per una determinata primitiva e viene aggiunto al valore z per ogni vertice prima dell'installazione dell'interpolatore. Quando si usano livelli di funzionalità 10.0 e versioni successive, tutti i calcoli di distorsione vengono eseguiti usando aritmetica a virgola mobile a 32 bit. La distorsione non viene applicata a primitive di punto o linea, ad eccezione delle linee disegnate in modalità wireframe.

Uno degli artefatti con ombreggiatura basata su buffer ombreggiatura è l'acne ombreggiatura o una superficie ombreggiatura stessa a causa di differenze minori tra il calcolo della profondità in uno shader e la profondità della stessa superficie nel buffer shadow. Un modo per alleviare questo problema consiste nell'usare DepthBias e SlopeScaledDepthBias durante il rendering di un buffer shadow. L'idea è quella di eseguire il push delle superfici sufficienti durante il rendering di un buffer shadow in modo che il risultato del confronto (tra il buffer shadow z e lo shader z) sia coerente tra la superficie e evitare l'auto shadowing locale.

Tuttavia, l'uso di DepthBias e SlopeScaledDepthBias può introdurre nuovi problemi di rendering quando un poligono visualizzato in un angolo estremamente nitido causa l'equazione di pregiudizio per generare un valore z molto grande. Questo in effetti spinge il poligono estremamente lontano dalla superficie originale nella mappa shadow. Un modo per alleviare questo particolare problema consiste nell'usare DepthBiasClamp, che fornisce un limite superiore (positivo o negativo) sulla grandezza del bias z calcolato.

Nota

Per i livelli di funzionalità 9.1, 9.2, 9.3, DepthBiasClamp non è supportato.

 

Fase di fusione dell'output