Condividi tramite


Buffer di profondità

A buffer di profondità, o z-buffering, archivia informazioni sull'intensità per controllare quali aree dei poligoni sottoporre a rendering anziché nasconderle dalla visualizzazione.

Panoramica

Un buffer di profondità, spesso denominato z-buffering o w-buffering, è una proprietà del dispositivo che archivia le informazioni di profondità da usare tramite Direct3D. Quando Direct3D esegue il rendering di una scena in una superficie di destinazione, può usare la memoria in una superficie di buffer di profondità associata come area di lavoro per determinare il modo in cui i pixel dei poligoni rasterizzati si occludono l'uno all'altro. Direct3D usa una superficie Direct3D fuori schermo come destinazione in cui vengono scritti i valori di colore finali. La superficie del buffer di profondità associata alla superficie di destinazione del rendering viene usata per archiviare informazioni di profondità che indicano a Direct3D la profondità di ogni pixel visibile nella scena.

Quando una scena viene rasterizzata con buffer di profondità abilitata, viene testato ogni punto sulla superficie di rendering. I valori nel buffer di profondità possono essere la coordinata z di un punto o la coordinata w omogenea, dalla posizione del punto (x,y,z,w) nello spazio di proiezione. Un buffer di profondità che usa i valori z viene spesso chiamato z-buffering e uno che usa valori w è denominato w-buffering. Ogni tipo di buffer di profondità presenta vantaggi e svantaggi, descritti più avanti.

All'inizio del test, il valore di profondità nel buffer di profondità viene impostato sul valore massimo possibile per la scena. Il valore del colore nell'area di rendering viene impostato sul valore del colore di sfondo o sul valore del colore della trama di sfondo in quel punto. Ogni poligono nella scena viene testato per verificare se si interseca con la coordinata corrente (x,y) sulla superficie di rendering.

Se si interseca, il valore di profondità, che sarà la coordinata z in un buffer z e la coordinata w in un w-buffering, nel punto corrente viene testata per verificare se è inferiore al valore di profondità archiviato nel buffer di profondità. Se la profondità del valore del poligono è minore, viene archiviata nel buffer di profondità e il valore del colore del poligono viene scritto nel punto corrente sulla superficie di rendering. Se il valore di profondità del poligono in quel punto è maggiore, viene testato il poligono successivo nell'elenco. Questo processo è illustrato nel diagramma seguente.

diagramma dei valori di profondità dei test

Tecniche di buffering

Sebbene la maggior parte delle applicazioni non usi questa funzionalità, è possibile modificare il confronto usato da Direct3D per determinare quali valori vengono posizionati nel buffer di profondità e successivamente nella superficie di destinazione di rendering. In alcuni hardware, la modifica della funzione di confronto può disabilitare i test z gerarchici.

Quasi tutti gli acceleratori sul mercato supportano z-buffering, rendendolo attualmente il tipo più comune di buffer di profondità. Tuttavia, i buffer z onnipresenti presentano i loro svantaggi. Grazie alla matematica, i valori z generati in un buffer z tendono a non essere distribuiti uniformemente nell'intervallo z-buffering (in genere da 0,0 a 1,0, inclusi).

In particolare, il rapporto tra i piani di ritaglio rispettivamente lontano e vicino influisce fortemente sulla distribuzione irregolare dei valori z. Usando una distanza del piano lontano rispetto al rapporto di distanza del piano vicino del 100, il 90% dell'intervallo di buffer di profondità viene speso per il primo 10% dell'intervallo di profondità della scena. Le applicazioni tipiche per l'intrattenimento o le simulazioni visive con scene esterne richiedono spesso rapporti tra piano lontano e piano vicino compresi tra 1.000 e 10.000. Con un rapporto di 1.000, il 98% dell'intervallo viene speso per il primo 2% dell'intervallo di profondità e la distribuzione diventa peggiore con rapporti più elevati. Ciò può causare artefatti di superficie nascosti in oggetti distanti, in particolare quando si usano buffer di profondità a 16 bit, la profondità di bit più comunemente supportata.

Un buffer di profondità basato su w, d'altra parte, è spesso più uniformemente distribuito tra i piani di ritaglio vicino e lontano rispetto a un buffer basato su z. Il vantaggio principale è che il rapporto delle distanze per i piani di ritaglio lontano e vicino non è più un problema. Ciò consente alle applicazioni di supportare intervalli massimi di grandi dimensioni, mantenendo comunque un buffer di profondità relativamente accurato vicino al punto visivo. Un buffer di profondità basato su w non è perfetto e talvolta può esporre artefatti di superficie nascosti per gli oggetti vicini. Un altro svantaggio dell'approccio con w-buffering è correlato al supporto hardware: il w-buffering non è supportato ampiamente nell'hardware come tale.

L'uso di uno z-buffering richiede un sovraccarico durante il rendering. È possibile usare varie tecniche per ottimizzare il rendering quando si usano gli z-buffering. Le applicazioni possono migliorare le prestazioni quando si usano lo z-buffering e la formattazione del testo assicurandosi che il rendering delle scene venga eseguito dall'inizio verso il retro. Le primitive con z-buffering testurizzate vengono pretestate rispetto allo z-buffering su una linea di analisi. Se una linea di analisi è nascosta da un poligono sottoposto a rendering in precedenza, il sistema lo rifiuta in modo rapido ed efficiente. Lo z-buffering può migliorare le prestazioni, ma la tecnica è più utile quando una scena disegna più volte gli stessi pixel. Questo è difficile da calcolare esattamente, ma spesso è possibile fare un'approssimazione più accurata. Se gli stessi pixel vengono disegnati meno di due volte, è possibile ottenere prestazioni ottimali disattivando lo z-buffering ed eseguendo il rendering della scena dal retro al fronte.

L'interpretazione effettiva di un valore di profondità è specifica del renderizzatore.

Buffer di intensità e degli stencil