Condividi tramite


Distorsione profondità

I poligoni coplanari nello spazio 3D possono essere visualizzati come se non siano coplanari aggiungendo una distorsione z (o distorsione della profondità) a ognuno di essi.

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

Un'applicazione può contribuire a garantire che il rendering dei poligoni coplanari venga eseguito correttamente aggiungendo la distorsione (dal DepthBias membro di D3D11_RASTERIZER_DESC1) ai valori z usati dal sistema durante il rendering dei set di poligoni coplanari. I poligoni con un valore z più grande verranno disegnati davanti ai poligoni con un valore z più piccolo.

Sono disponibili due opzioni per calcolare la distorsione della profondità.

  1. Se il buffer di profondità attualmente associato alla fase di unione dell'output ha un formato UNORM o non è associato alcun buffer di profondità, il valore di distorsione viene calcolato come segue:

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

    dove r è il valore minimo rappresentabile > 0 nel formato depth-buffer convertito in float32. I valori DepthBias e SlopeScaledDepthBia s sono D3D11_RASTERIZER_DESC1 membri della struttura. Il valore MaxDepthSlope è il massimo dei pendii orizzontali e verticali del valore di profondità in pixel.

  2. Se un buffer di profondità a virgola mobile è associato alla fase di unione 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 distorsione viene quindi bloccato come segue:

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

Il valore di distorsione viene quindi usato per calcolare la profondità del 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 distorsione è costante per una determinata primitiva e viene aggiunto al valore z per ogni vertice prima della configurazione dell'interpolatore. Quando si usano livelli di funzionalità 10.0 e versioni successive, tutti i calcoli delle distorsioni vengono eseguiti usando aritmetica a virgola mobile a 32 bit. La distorsione non viene applicata ad alcuna primitiva punto o linea, ad eccezione delle linee disegnate in modalità wireframe.

Uno degli artefatti con ombreggiature basate su buffer ombreggiatura è l'acne dell'ombra o un'ombreggiatura della superficie stessa a causa di piccole differenze tra il calcolo della profondità in uno shader e la profondità della stessa superficie nel buffer di ombreggiatura. 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 di ombreggiatura in modo che il risultato del confronto (tra il buffer shadow z e lo shader z) sia coerente sulla superficie ed 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 fa sì che l'equazione di distorsione generi un valore z molto grande. Questo in effetti spinge il poligono estremamente lontano dalla superficie originale nella mappa delle ombre. Un modo per alleviare questo particolare problema consiste nell'usare DepthBiasClamp, che fornisce un limite superiore (positivo o negativo) sulla grandezza della distorsione z calcolata.

Nota

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

 

Output-Merger fase