Condividi tramite


Buffer di stencil

Un buffer degli stencil viene usato per mascherare i pixel in un'immagine, in modo da produrre effetti speciali. La maschera controlla se il pixel viene disegnato o meno. Questi effetti speciali includono il compositing; composizione, decalcomanie, dissolvenze, sfumature e scorrimenti, contorni, sagome e stencil fronte-retro. Di seguito sono riportati alcuni degli effetti più comuni.

Il buffer degli stencil abilita o disabilita il disegno sulla superficie di destinazione per il rendering su base pixel per pixel. Al livello più fondamentale, consente alle applicazioni di mascherare le sezioni dell'immagine sottoposta a rendering in modo che non vengano visualizzate. Le applicazioni usano spesso buffer di stencil per effetti speciali, ad esempio dissolvenza, decalcomania e struttura.

Le informazioni sul buffer degli stencil sono incorporate nei dati del buffer z.

Funzionamento del buffer degli stencil

Direct3D esegue un test sul contenuto del buffer degli stencil su base pixel per pixel. Per ogni pixel nella superficie di destinazione, esegue un test usando il valore corrispondente nel buffer degli stencil, un valore di riferimento dello stencil e un valore di maschera stencil. Se il test viene superato, Direct3D esegue un'azione. Il test viene eseguito utilizzando i seguenti passaggi.

  1. Eseguire un'operazione "AND" bit per bit del valore di riferimento dello stencil con la maschera stencil.
  2. Eseguire un'operazione "AND" bit per bit del valore relativo al buffer degli stencil per il pixel corrente con la maschera stencil.
  3. Confrontare il risultato del passaggio 1 con il risultato del passaggio 2, usando la funzione di confronto.

I passaggi precedenti sono illustrati nella riga di codice seguente:

(StencilRef & StencilMask) CompFunc (StencilBufferValue & StencilMask)
  • StencilRef rappresenta il valore di riferimento dello stencil.
  • StencilMask rappresenta il valore della maschera stencil.
  • CompFunc è la funzione di confronto.
  • StencilBufferValue è il contenuto del buffer degli stencil per il pixel corrente.
  • Il simbolo della (&) commerciale rappresenta l'operazione "AND" bit per bit.

Il pixel corrente viene scritto nella superficie di destinazione se il test dello stencil supera e viene ignorato in caso contrario. Il comportamento di confronto predefinito consiste nello scrivere il pixel, indipendentemente dal modo in cui viene eseguita ogni operazione bit per bit. È possibile modificare questo comportamento modificando il valore di un tipo enumerato per identificare la funzione di confronto desiderata.

L'applicazione può personalizzare il funzionamento del buffer degli stencil. Può impostare la funzione di confronto, la maschera stencil e il valore di riferimento dello stencil. Può anche controllare l'azione eseguita da Direct3D quando il test dello stencil supera o non riesce.

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 è denominato 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.

Anche se è possibile usare la fusione di più texture per risolvere questo problema, in questo modo viene limitato il numero di altri effetti speciali che l'applicazione può produrre. L'uso del buffer degli stencil per applicare decalcomanie libera le fasi di fusione delle texture per altri effetti.

Dissolve, sfuma e scorre rapidamente

Sempre più spesso, le applicazioni usano effetti speciali comunemente usati nei film e nei video, ad esempio dissolvenze, scorrimenti e sfumature.

In una dissolvenza, un'immagine viene gradualmente sostituita da un'altra in una sequenza uniforme di fotogrammi. Anche se Direct3D fornisce metodi di utilizzo della fusione di più texture per ottenere lo stesso effetto, le applicazioni che usano il buffer degli stencil per le dissolvenze possono usare funzionalità di fusione delle texture per altri effetti mentre eseguono una dissolvenza.

Quando l'applicazione esegue una dissolvenza, deve eseguire il rendering di due immagini diverse. Usa il buffer degli stencil per controllare quali pixel di ogni immagine vengono disegnati nella superficie di destinazione del rendering. È possibile definire una serie di maschere stencil e copiarle nel buffer degli stencil nei fotogrammi successivi. In alternativa, è possibile definire una maschera di stencil base per il primo fotogramma e modificarla in modo incrementale.

All'inizio della dissolvenza, l'applicazione imposta la funzione stencil e la maschera stencil in modo che la maggior parte dei pixel dell'immagine iniziale superi il test degli stencil. La maggior parte dei pixel dell'immagine finale dovrebbe non dovrebbe superare il test dello stencil. Nei fotogrammi successivi, la maschera stencil viene aggiornata in modo che sempre meno pixel nell'immagine iniziale superino il test. Man mano che i fotogrammi avanzano, un numero sempre minore di pixel nell'immagine finale non supera il test. In questo modo, l'applicazione può eseguire una dissolvenza usando qualsiasi modello di dissolvenza arbitrario.

Dissolvenza in entrata o Dissolvenza in uscita sono dei tipi speciali di dissolvenza. In caso di dissolvenza, il buffer degli stencil viene usato per dissolversi da un'immagine nera o bianca a un rendering di una scena in 3D. La dissolvenza in uscita è l'opposto, l'applicazione inizia con un rendering di una scena 3D e si dissolve in bianco o nero. La dissolvenza può essere eseguita usando qualsiasi modello arbitrario che si intende usare.

Le applicazioni Direct3D usano una tecnica simile per gli scorrimenti rapidi. Ad esempio, quando un'applicazione esegue uno scorrimento rapido da sinistra a destra, l'immagine finale scorre gradualmente sopra l'immagine iniziale da sinistra a destra. Come in una dissolvenza, è necessario definire una serie di maschere stencil caricate nel buffer degli stencil in fotogrammi successivi o modificare successivamente la maschera dello stencil iniziale. Le maschere degli stencil vengono usate per disabilitare la scrittura di pixel dall'immagine iniziale e per abilitare la scrittura di pixel dall'immagine finale.

Uno scorrimento rapido è un po 'più complesso di una dissolvenza in quanto l'applicazione deve leggere i pixel dall'immagine finale nell'ordine inverso dello scorrimento rapido. In altre parole, se lo scorrimento rapido passa da sinistra a destra, l'applicazione deve leggere i pixel dall'immagine finale da destra a sinistra.

Strutture e silhouette

È possibile usare il buffer degli stencil per effetti più astratti, ad esempio strutture e contorni.

Se l'applicazione applica una maschera stencil all'immagine di una primitiva che è la stessa forma ma leggermente più piccola, l'immagine risultante contiene 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.

Buffer di intensità e degli stencil