Condividi tramite


Buffer profondità (Direct3D 9)

Un buffer di profondità, spesso chiamato z-buffer o w-buffer, è una proprietà del dispositivo che archivia le 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 occudono 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 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, 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-buffer e uno che usa valori w è denominato w-buffer. 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. In caso affermativo, viene testato 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 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à di test

Nota

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. 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 z-buffer il tipo più comune di buffer di profondità oggi. Tuttavia, i buffer z onnipresenti presentano i loro svantaggi. A causa della matematica interessata, i valori z generati in un buffer z tendono a non essere distribuiti uniformemente nell'intervallo z-buffer (in genere da 0,0 a 1,0, inclusi). In particolare, il rapporto tra i piani di ritaglio 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 spesso richiedono rapporti di piano lontano/quasi piano in qualsiasi punto 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 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 buffer w è correlato al supporto hardware: il w-buffering non è supportato ampiamente nell'hardware come z-buffering.

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 del renderer.

 

In questa sezione vengono presentate informazioni sull'uso di buffer di profondità per la linea nascosta e la rimozione della superficie nascosta.

di rendering Direct3D