Quali sono alcuni metodi per rendere la trasparenza in OpenGL


14

La fusione alfa può essere attivata per rendere trasparenti le superfici, in questo modo:

glDisable(GL_DEPTH_TEST); //or glDepthMask(GL_FALSE)? depth tests break blending
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

Ma questo funziona solo se gli oggetti sono resi in primo piano. Altrimenti le cose sullo sfondo appaiono davanti agli oggetti più vicini, come il pavimento nell'immagine qui sotto. Per le particelle e gli elementi della GUI l'ordinamento sarebbe OK, ma per le mesh triangolari sembra che sarebbe troppo sforzo e lento, come discusso qui: https://www.opengl.org/wiki/Transparency_Sorting .

Quali sono i metodi comuni per affrontarlo? So che questo è abbastanza ampio e non sto cercando dettagli di implementazione approfonditi, solo una breve descrizione di alcuni approcci e di ciò che potrebbe essere coinvolto.

inserisci qui la descrizione dell'immagine


Non sono sicuro se questa dovrebbe essere una risposta o meno, ma gli errori nell'immagine sono causati dal rendering senza test di profondità su tutte le primitive. Dovresti eseguire il rendering della scena in 2 passaggi: prima esegui il rendering normalmente di tutta la geometria solida. Successivamente, disabilita le scritture di profondità (non GL_DEPTH_TEST) e rendi la geometria traslucida in ordine approssimativamente inverso. Ciò garantirà che la geometria trasparente non venga disegnata di fronte alla geometria solida che si trova di fronte.
yuriks,

@yuriks In questo caso è probabilmente un cattivo esempio da parte mia, ma tutto è pensato per essere trasparente. Volevo qualcosa per mostrare come potrebbe apparire una trasparenza errata se eseguita male. Anche un esempio in cui la geometria di ordinamento sarebbe incredibilmente difficile (ad esempio qui il pavimento è un poligono gigante e copre l'intera gamma di profondità).
jozxyqk,

Risposte:


10

Una serie di tecniche per evitare l'ordinamento esplicito va sotto il nome di Trasparenza indipendente dall'ordine (abbreviato OIT).

Esistono molte tecniche OIT.

Storicamente uno è Peeling di profondità . In questo approccio, prima visualizzi i frammenti / pixel più in primo piano, quindi trovi il più vicino a quello trovato nel passaggio precedente e così via, proseguendo con tutti i "livelli" di cui hai bisogno. Si chiama peeling di profondità perché ad ogni passaggio si "sbuccia" uno strato di profondità. Tutti i livelli possono quindi essere normalmente ricombinati da dietro a davanti. Per implementare questo algoritmo è necessario disporre di una copia del buffer di profondità.

Un altro insieme di tecniche sono quelle OIT di fusione. Uno dei più recenti e interessanti è l' OIT miscelato ponderato proposto da McGuire e Bavoil . In pratica applica una somma ponderata per tutte le superfici che occupano un dato frammento. Lo schema di ponderazione che propongono si basa sullo spazio fotocamera Z (come approssimazione all'occlusione) e sull'opacità.
L'idea è che se riesci a ridurre il problema a una somma ponderata, non ti importa davvero di ordinare.

Oltre al documento originale, nel blog di Matt Pettineo è disponibile una grande risorsa per dettagli di implementazione e problemi di Weighted Blended OIT . Come puoi leggere dal suo post, questa tecnica non è un proiettile d'argento. Il problema principale è che lo schema di ponderazione è centrale e deve essere regolato in base alla scena / al contenuto. Dai suoi esperimenti, mentre la tecnica sembra funzionare bene per un'opacità relativamente bassa e media, fallisce quando l'opacità si avvicina a 1 e quindi non può essere utilizzata da materiali in cui gran parte della superficie è opaca (fa l'esempio del fogliame).

Ancora una volta, tutto si riduce al modo in cui ottimizzi i tuoi pesi di profondità e trovare quelli che si adattano perfettamente ai tuoi casi d'uso non è necessariamente banale.

Quanto a ciò che è necessario per l'OIT miscelato ponderato, nient'altro che due target di rendering extra. Uno che si riempie con il colore alfa premoltiplicato (colore * alfa) e alfa, entrambi ponderati di conseguenza. L'altro solo per i pesi.


6

Un'opzione è utilizzare il peeling di profondità.

In sostanza, si elabora la scena un determinato numero di volte (diciamo, nvolte) al fine di determinare il più vicino, il secondo più vicino, fino ai nframmenti più vicini della scena.

Questa elaborazione viene eseguita applicando prima un test di profondità regolare all'intera scena (che restituisce naturalmente la superficie più vicina). Si utilizza quindi il risultato del test di profondità per filtrare il primo strato, ignorando tutto con una profondità inferiore rispetto a quello restituito nel test di profondità.

L'applicazione di nuovo del test di profondità restituirà quindi il secondo strato. Ripeti se necessario.

Una volta che hai i livelli, puoi semplicemente disegnare tutti i livelli in ordine inverso (supponendo che tu abbia tenuto traccia dei colori RGBA per ogni livello), fondendoli normalmente, poiché i livelli sono in ordine fronte-retro.


1
Grazie! Sembra che avrò bisogno di due buffer di profondità per questo. Vale a dire uno per archiviare e filtrare le ultime profondità e uno per eseguire i test di profondità per il rendering corrente. Correggimi se sbaglio, ma presumo che avrò bisogno di due trame di profondità per l'FBO che cambio tra ogni passaggio di peeling.
jozxyqk,

1
@jozxyqk Corretto, per questa procedura sono necessari due buffer di profondità.
es1024,

1

La crema della crema del single-pass no (o pochi) compromette la trasparenza in OpenGL è un buffer A. Con il moderno OpenGL, è possibile implementare:

http://blog.icare3d.org/2010/06/fast-and-accurate-single-pass-buffer.html

Evita i passaggi multipli di peeling profondo e non richiede un ordinamento oneroso.


3
Idealmente, le risposte dovrebbero essere autosufficienti e dipendere in modo vitale da collegamenti esterni. Avere link è utile per materiale supplementare, ma una risposta non dovrebbe consistere solo in una parola chiave. Se potessi includere alcuni dettagli su cosa sia un buffer A e su come funzioni ciò migliorerebbe notevolmente la tua risposta.
Martin Ender,
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.