Come posso dire a uno shader di frammenti di non scrivere un determinato pixel?


11

In un WebGL mi piacerebbe inviare un quadruplo dello spazio dello schermo che viene elaborato da uno shader di frammenti, ma fare in modo che lo shader di frammenti scriva solo un pixel in determinate condizioni (diciamo ... che era all'interno di un cerchio o che il pixel apparteneva al lato positivo di un semispazio definito da un'equazione di curva o qualcosa del genere).

È possibile all'interno di uno shader di frammenti dire "non scrivere un pixel"?

So che questo potrebbe essere realizzato usando vari altri metodi come la fusione alfa, renderlo prima e facendolo mettere il colore di sfondo dove non vuole disegnare un pixel, o forse fare qualche trucco con i buffer di profondità o stencil. So anche che potrei creare un mucchio di geometria per abbinare ciò che voglio renderizzare.

Esiste un modo per far scegliere allo shader di frammenti di non scrivere affatto un pixel?

Risposte:


10

Sì, puoi discardnel framment shader per evitare di scrivere il pixel. Ecco un esempio casuale che ho scoperto da Google.

Si noti che ciò potrebbe non arrestare l'elaborazione dello shader di frammenti (poiché la GPU tende a elaborare i frammenti in blocchi; solo l'eliminazione da tutti i frammenti in un blocco abbandonerà l'elaborazione). Ma il frammento non verrà scritto nell'output, che è fondamentalmente quello che vuoi.

Potresti essere interessato a questa domandadiscard correlata sulle prestazioni di e questa su SO.

Non ho idea se questo è supportato in WebGL però. In caso contrario, dovrai ricorrere a uno dei tuoi suggerimenti (come la fusione alfa; penso che sarebbe il più semplice).


3

La discarddichiarazione è utile.

Non hai detto molto sul tuo percorso decisionale, quindi ti offrirò un esempio usando una semplice ricerca di texture:

void main() {
    gl_FragColor = texture2D(u_texture, v_uv) * u_color;
    if (gl_FragColor.a <= 0.0) discard;
}

(Viene da un codice di esempio che ho scritto prima di apprendere la fusione alfa.)

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.