Che cos'è un buffer di stencil?


26

Wikipedia afferma che un buffer di stencil è un buffer arbitrario che uno shader può utilizzare.

Tuttavia, suggerisce che viene utilizzato per il ritaglio, o altrimenti "vincolante" i buffer di profondità e pixel, contraddicendosi leggermente.

Cosa fa realmente il buffer di stencil e come viene praticamente utilizzato nelle applicazioni moderne?

Risposte:


31

La definizione del buffer di stencil di Wikipedia non è davvero eccezionale, si concentra troppo sui dettagli delle implementazioni moderne (OpenGL). Trovo la versione non ambigua più facile da capire:

Uno stencil è un modello utilizzato per disegnare o dipingere lettere, simboli, forme o motivi identici ogni volta che viene utilizzato. Il design prodotto da un tale modello è anche chiamato stencil.

Questo è ciò che significava stencil prima di Computer Graphics. Se digiti stencil su Google Immagini, questo è uno dei primi risultati:

Maschera per stencil

Come puoi vedere, è semplicemente una maschera o un motivo che può essere utilizzato per "dipingere" il negativo del motivo su qualcosa.

Il buffer dello stencil funziona esattamente allo stesso modo. È possibile riempire il buffer dello stencil con un motivo selezionato eseguendo un passaggio di rendering dello stencil, quindi impostare la funzione stencil appropriata che definirà il modo in cui il modello deve essere interpretato nei disegni successivi, quindi eseguire il rendering della scena finale. I pixel che rientrano nelle aree rifiutate della maschera stencil, in base alla funzione di confronto, non vengono disegnati.


Quando si tratta di implementare il buffer di stencil, a volte è effettivamente associato al buffer di profondità. La maggior parte dell'hardware grafico utilizza un buffer di stencil da 1 byte (8 bit), che è sufficiente per la maggior parte delle applicazioni. I buffer di profondità vengono generalmente implementati utilizzando 3 byte (24 bit), che di nuovo è normalmente sufficiente per la maggior parte dei tipi di rendering 3D. Quindi è logico impacchettare gli 8 bit del buffer di stencil con gli altri 24 del buffer di profondità, rendendo possibile memorizzare ogni pixel di profondità + stencil in un numero intero di 32 bit. Ecco cosa intendeva Wikipedia per:

Il buffer di profondità e il buffer di stencil spesso condividono la stessa area nella RAM dell'hardware grafico.


Un'applicazione in cui il buffer dello stencil era il re era per il rendering delle ombre, in una tecnica chiamata volumi delle ombre , o talvolta anche appropriatamente chiamata ombre degli stencil . Questo è stato un uso molto intelligente del buffer, ma al giorno d'oggi la maggior parte del campo di rendering sembra essersi spostato verso mappe d'ombra basate sulla profondità.


È un personaggio, ma cleaver-> clever. Non riesco a modificarlo D: Ottima risposta tra l'altro, questo ha molto senso finora.
Qix,

3
Se si dispone di un costoso shader per pixel, il buffer dello stencil può anche essere utilizzato per raggruppare thread simili, riducendo la divergenza e aumentando l'occupazione come in questo documento OIT, secondo 2.6 (dichiarazione di non responsabilità: sono un autore).
jozxyqk,

@jozxyqk, è un po 'fuori dagli schemi pensando proprio lì! Molto bella.
glampert

13

Il buffer di stencil è un buffer di numero intero senza segno, di solito 8 bit al giorno d'oggi, in cui è possibile riempire le informazioni per pixel come desiderato in base all'uso di varie operazioni ( ad esempio OpenGL Ops qui ) dopo un test di stencil.

Il test dello stencil è semplicemente un'operazione per pixel in cui il valore corrente dello stencil pixel viene testato rispetto al contenuto del buffer dello stencil. Impostare le condizioni alle quali viene superato il test dello stencil (ad es. SEMPRE, MENO ecc.).

Puoi decidere cosa succede al valore dello stencil in base all'esito del test (in OpenGL usando l'operazione che ti ho collegato sopra)

Il buffer dello stencil ha molti usi, i primi che vengono in mente sono:

  • Può essere usato come maschera per rendere selettivamente una parte del framebuffer e scartare il resto. Questo, ad esempio, è utile per le riflessioni, ma anche molto di più. Quando si ha a che fare con il rendering a risoluzione multipla, può essere utilizzato per contrassegnare i bordi che devono essere sottoposti a rendering a una risoluzione più elevata. Ci sono davvero molti usi di mascheramento.
  • Un filtro di overdraw molto semplice per esempio. È possibile impostare il test dello stencil in modo che passi sempre e aumenti sempre il valore. Il valore con cui finisci nel buffer dello stencil rappresenta il tuo sovraccarico. [*]

In passato è stato utilizzato anche per tecniche di ombreggiamento come il volume Ombra.

Il povero buffer di stencil è spesso abbastanza sottovalutato, ma può essere una buona arma nell'armeria di un programmatore grafico.

[*] Valore da rileggere in un post-processo usando l'SRV giusto!

EDIT: Inoltre, vale la pena ricordare che in Shader Model 5.1 (quindi D3D11.3 e D3D12) hai accesso al valore di riferimento dello stencil tramite SV_StencilRef


6

Un buffer di stencil contiene dati interi per pixel che vengono utilizzati per aggiungere maggiore controllo su quali pixel vengono visualizzati.

Un buffer di stencil funziona in modo simile a un buffer di profondità. Allo stesso modo, i dati dello stencil sono memorizzati in un buffer di profondità. Mentre i dati di profondità determinano quale pixel è più vicino alla fotocamera, i dati dello stencil possono essere usati come una maschera per pixel più generica per salvare o scartare i pixel. Per creare la maschera, utilizzare una funzione stencil per confrontare un valore di stencil di riferimento - un valore globale - con il valore nel buffer dello stencil ogni volta che viene visualizzato un pixel.

Fonte: che cos'è un buffer di stencil? | Rete di sviluppatori Microsoft

L'idea generale è che si può impostare un valore per ogni pixel e quindi impostare l'operazione ( GREATER, SMALLER, EQUALecc), quando questo restituisce true il pixel è ombreggiato e mostrati.

Un'applicazione è il riflesso in tempo reale, quando si esegue il rendering della trama del riflesso il buffer dello stencil viene utilizzato per creare una maschera per il punto in cui viene applicato il riflesso. Ad esempio, applicare il riflesso solo sui triangoli ombreggiati del materiale di vetro. Può anche essere utilizzato per creare maschere bidimensionali arbitrarie per l'intero framebuffer.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.