Configurazione della funzionalità depth-stencil
Questa sezione illustra i passaggi per configurare il buffer depth-stencil e lo stato depth-stencil per la fase di unione dell'output.
Dopo aver imparato a usare il buffer depth-stencil e lo stato depth-stencil corrispondente, fare riferimento a tecniche di stencil avanzate.
Creare lo stato depth-stencil
Lo stato depth-stencil indica alla fase di unione dell'output come eseguire il test depth-stencil. Il test depth-stencil determina se deve essere disegnato o meno un determinato pixel.
Associare i dati depth-stencil alla fase OM
Associare lo stato depth-stencil.
Associare la risorsa depth-stencil usando una visualizzazione.
Le destinazioni di rendering devono essere tutte dello stesso tipo di risorsa. Se si usa l'anti-aliasing multicampione, tutte le destinazioni di rendering associate e i buffer di intensità devono avere gli stessi numeri di campioni.
Quando si usa un buffer come destinazione di rendering, i test depth-stencil e più destinazioni di rendering non sono supportati.
- È possibile associare simultaneamente fino a 8 destinazioni di rendering.
- Tutte le destinazioni di rendering devono avere le stesse misure in tutte le dimensioni (larghezza e altezza e profondità per dimensioni 3D o matrice per i tipi di *matrice).
- Ogni destinazione di rendering può avere un formato dati diverso.
- Le maschere di scrittura controllano quali dati vengono scritti in una destinazione di rendering. Le maschere di scrittura dell'output controllano a livello di componente e di destinazione di rendering quali dati vengono scritti nella destinazione o nelle destinazioni di rendering.
Tecniche di stencil avanzate
La parte dello stencil del buffer depth-stencil può essere usata per creare effetti di rendering come la composizione, la decalcomania e la struttura.
- Composizione
- Decalcomania
- Strutture e contorni
- Stencil a due lati
- Lettura del buffer depth-stencil come texture
Composizione
L'applicazione può usare il buffer stencil per comporre immagini 2D o 3D in una scena 3D. Una maschera nel buffer degli stencil viene usata per occludere un'area della superficie della destinazione di rendering. Le informazioni 2D archiviate, ad esempio testo o bitmap, possono quindi essere scritte nell'area occlusa. In alternativa, l'applicazione può eseguire il rendering di primitive 3D aggiuntive nell'area mascherata da stencil della superficie della destinazione di rendering. Può anche eseguire il rendering di un'intera scena.
I giochi spesso compongono insieme più scene 3D. Ad esempio, i giochi di guida visualizzano in genere uno specchietto retrovisore. Lo specchietto contiene la visualizzazione della scena 3D dietro il conducente. Si tratta essenzialmente di una seconda scena 3D composta con la visuale anteriore del conducente.
Decalcomania
Le applicazioni Direct3D usano la decalcomania per controllare quali pixel di una determinata immagine primitiva vengono disegnati sulla superficie della destinazione di rendering. Le applicazioni applicano decalcomanie alle immagini delle primitive per consentire il rendering corretto di poligoni coplanari.
Ad esempio, quando si applicano segni di pneumatici e linee gialle a una strada, i segni devono apparire direttamente sulla strada. Tuttavia, i valori z dei segni e della strada sono uguali. Pertanto, il buffer di intensità potrebbe non produrre una chiara separazione tra i due. È possibile eseguire il rendering di alcuni pixel nella primitiva posteriore sopra la primitiva anteriore e viceversa. L'immagine risultante appare scintillante da frame a frame. Questo effetto è chiamato z-fighting o flimmering.
Per risolvere questo problema, usare uno stencil per mascherare la sezione della primitiva posteriore in cui comparirà la decalcomania. Disattivare lo z-buffering ed eseguire il rendering dell'immagine della primitiva anteriore nell'area mascherata della superficie della destinazione di rendering.
La fusione di più texture può essere usata per risolvere questo problema.
Strutture e contorni
È possibile usare il buffer degli stencil per effetti più astratti, ad esempio strutture e contorni.
Se l'applicazione esegue due passaggi di rendering, uno per generare la maschera stencil e il secondo per applicare la maschera stencil all'immagine, ma con le primitive leggermente più piccole al secondo passaggio, l'immagine risultante conterrà solo il contorno della primitiva. L'applicazione può quindi riempire l'area mascherata con stencil dell'immagine con un colore pieno, dando alla primitiva un aspetto in rilievo.
Se la maschera stencil ha le stesse dimensioni e la stessa forma della primitiva di cui si esegue il rendering, l'immagine risultante conterrà un foro in cui dovrebbe trovarsi la primitiva. L'applicazione può quindi riempire il foro con il colore nero per produrre un contorno della primitiva.
Stencil a due lati
I volumi delle ombre vengono usati per disegnare ombre con il buffer stencil. L'applicazione calcola i volumi delle ombre gettate dalla geometria occlusa, calcolando i bordi dei contorni ed estrudendoli dalla luce in un set di volumi 3D. Il rendering di questi volumi viene quindi eseguito due volte nel buffer degli stencil.
Il primo rendering disegna poligoni rivolti in avanti e incrementa i valori del buffer degli stencil. Il secondo rendering disegna i poligoni rivolti indietro del volume delle ombre e decrementa i valori del buffer stencil.
In genere, tutti i valori incrementati e decrementati si annullano l'uno con l'altro. Tuttavia, il rendering della scena è già stato eseguito con una geometria normale, causando l'esito negativo del test z-buffer quando viene eseguito il rendering del volume delle ombre. I valori lasciati nel buffer stencil corrispondono ai pixel presenti nelle ombre. Il contenuto rimanente del buffer stencil viene usato come maschera, per eseguire la fusione alfa di un grande quadrante nero completo nella scena. Con il buffer stencil che funge da maschera, il risultato consiste nello scurire i pixel presenti nelle ombre.
Ciò significa che la geometria delle ombre viene disegnata due volte per sorgente luminosa, ponendo pressione sulla velocità effettiva della GPU del vertice. La funzionalità stencil a due lati è stata progettata per attenuare questa situazione. In questo approccio sono disponibili due set di stato stencil (denominati di seguito), uno impostato per i triangoli rivolti in avanti, l'altro per i triangoli rivolti indietro. In questo modo, viene disegnato un solo passaggio per volume delle ombre e per luce.
Lettura del buffer depth-stencil come texture
Un buffer depth-stencil inattivo può essere letto da uno shader come texture. Un'applicazione che legge un buffer depth-stencil come texture esegue il rendering in due passaggi: il primo passaggio scrive nel buffer depth-stencil, il secondo legge dal buffer. Ciò consente a uno shader di confrontare i valori depth o stencil scritti in precedenza nel buffer rispetto al valore per il pixel attualmente sottoposto a rendering. Il risultato del confronto può essere usato per creare effetti come il mapping delle ombre o particelle morbide in un sistema di particelle.