Buffer di profondità (Direct3D 9)

Un buffer di profondità, spesso chiamato z-buffer o un buffer w, è una proprietà del dispositivo che archivia informazioni di profondità da usare da 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 occludeno tra loro. Direct3D usa una superficie Direct3D fuori schermo come destinazione a cui vengono scritti i valori di colore finali. La superficie del buffer di profondità associata alla superficie di destinazione di 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, ogni punto sulla superficie di rendering viene testato. I valori nel buffer di profondità possono essere una coordinata z del punto o la relativa coordinata w omogenea, dalla posizione del punto (x,y,z,w) nello spazio di proiezione. Un buffer di profondità che usa valori z viene spesso chiamato z-buffer e uno che usa i valori w è denominato w-buffer. Ogni tipo di buffer di profondità presenta vantaggi e svantaggi, illustrati più avanti.

All'inizio del test, il valore di profondità nel buffer di profondità viene impostato sul valore più grande possibile per la scena. Il valore del colore nell'area di rendering è impostato sul valore del colore di sfondo o sul valore del colore della trama di sfondo a quel punto. Ogni poligono nella scena viene testato per verificare se si interseca con la coordinata corrente (x,y) sulla superficie di rendering. In caso affermativo, il valore di profondità, che sarà la coordinata z in un buffer z e la coordinata w in un buffer w, in corrispondenza del punto corrente viene testata per verificare se è più piccolo del valore di profondità archiviato nel buffer di profondità. Se la profondità del valore poligono è più piccola, viene archiviata nel buffer di profondità e il valore del colore dal poligono viene scritto nel punto corrente nell'area di rendering. Se il valore di profondità del poligono in quel punto è maggiore, il poligono successivo nell'elenco viene testato. Questo processo viene illustrato nel diagramma seguente.

diagramma dei valori di profondità di test

Nota

Anche se la maggior parte delle applicazioni non usa questa funzionalità, è possibile modificare il confronto usato da Direct3D per determinare i valori inseriti nel buffer di profondità e successivamente la superficie di destinazione di rendering. A tale scopo, modificare il valore per lo stato di rendering D3DRS_ZFUNC. In alcuni hardware, la modifica della funzione di confronto può disabilitare i test z gerarchici.

 

Quasi tutti gli acceleratori sul mercato supportano z-buffering, rendendo il tipo più comune di buffer di profondità oggi. Tuttavia, i buffer z hanno i loro svantaggi. A causa della matematica implicata, i valori z generati in un buffer z tendono a non essere distribuiti uniformemente nell'intervallo di buffer z (in genere 0,0 a 1,0, inclusivo). In particolare, il rapporto tra i piani di ritaglio lontano e vicino influisce fortemente sul modo in cui vengono distribuiti valori z non uniformemente. L'uso di una distanza a piano lontano rispetto al rapporto di distanza vicino al piano di 100, il 90% dell'intervallo di buffer di profondità viene speso sul primo 10% dell'intervallo di profondità della scena. Le applicazioni tipiche per le simulazioni visive o di intrattenimento con scene esterne spesso richiedono rapporti di piano lontano/vicino a un piano qualsiasi tra 1.000 e 10.000. A un rapporto pari a 1.000, il 98% dell'intervallo viene speso sul 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, soprattutto 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 clip vicino e lontano rispetto a un buffer z. Il vantaggio chiave è 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ò presentare artefatti di superficie nascosti per oggetti vicini. Un altro svantaggio dell'approccio con buffer w è correlato al supporto hardware: il buffering w non è supportato ampiamente nell'hardware come il buffer z.

L'uso di un buffer z richiede un sovraccarico durante il rendering. È possibile usare varie tecniche per ottimizzare il rendering quando si usano i buffer z. Per informazioni dettagliate, vedere Prestazioni del buffer Z.

Nota

L'interpretazione effettiva di un valore di profondità è specifica per il renderer.

 

Questa sezione presenta informazioni sull'uso di buffer di profondità per la rimozione nascosta della linea e della superficie nascosta.

Direct3D Rendering