Ordinare trasparenza indipendente nel sistema particellare


9

Sto scrivendo un sistema di particelle e vorrei trovare un trucco per ottenere una corretta miscelazione alfa senza ordinare le particelle perché:

  • Ogni particella è un punto sprite in una singola mesh e non posso usare l'abilità del grafico della scena per ordinare i nodi trasparenti. Tuttavia, il nodo di sistema deve essere correttamente ordinato.
  • La posizione delle particelle viene calcolata sullo shader dalla velocità iniziale, dall'accelerazione e dal tempo. Per ordinare il sistema dovrei eseguire tutti questi calcoli sulla CPU, cosa che voglio evitare.
  • Ordinamento di centinaia di particelle in base alla posizione della telecamera e caricamento su GPU per ogni fotogramma per essere un'operazione pesante e silenziosa.

I test alfa sembrano essere abbastanza veloci su GLES 2.0 e funzionano bene per trame non trasparenti ma "mascherate". Tuttavia, non è sufficiente per particelle semi-trasparenti.

Come lo gestiresti?


Assolutamente quanto sia essenziale che siano ordinati correttamente? Hai mai visto artefatti (importanti) usando la fusione di vaniglia?
ChrisE

Una particella può fondersi con lo sfondo invece di un'altra particella e quindi l'essenza "rettangolo" del punto-sprite è molto evidente. I test alfa aiutano qui, ma gli artefatti sono ancora evidenti quando il valore alfa è basso ma non abbastanza per scartare il frammento.
Stepan Zastupov,

6
Hai provato a scrivere in profondità disabilitati (lasciando attivi i test di profondità) durante il rendering delle particelle? Ciò dovrebbe rendere meno ovvio l'ordinamento errato.
Adam

2
Dopo alcuni esperimenti ho scoperto che disabilitare la scrittura in profondità è la soluzione migliore nella maggior parte dei casi.
Stepan Zastupov,

Risposte:


10

Ecco cosa farei.

Passaggio 1: non ordinare. Fallo e basta. Vedi se è un problema. Molto probabilmente no.

Passaggio 2: limitare le particelle in modo che non necessitino realmente di ordinamento, come ad esempio:

  • Solo solidi (con possibilmente bordi da alfa a copertura)

    • lascia che zbuffer si occupi dell'ordinamento.
  • Solo bit additivi

    • a + b = b + a, quindi l'ordine non ha importanza

Passaggio 3: se è necessario altro, dividere il rendering delle particelle in bit che devono trovarsi davanti e il resto ed eseguire il rendering in più passaggi (ad esempio, potrebbe correggere fumo complesso)

Passaggio 4: se è ancora necessario altro o se è necessaria una soluzione generale, una cosa che viene in mente sarebbe quella di utilizzare gli MRT per eseguire un ordinamento N bucket molto approssimativo; rendere le particelle in N superfici di output e comporle in un passaggio separato.

Qualsiasi ulteriore richiesta richiederebbe maggiori informazioni sul tuo caso d'uso specifico. Ma sono abbastanza sicuro che non hai davvero bisogno dell'indipendenza dell'ordine dopo tutto. Usa abbastanza particelle in modo abbastanza casuale e sarà ok =)


6

Basta non scrivere nel buffer di profondità durante il rendering delle particelle. Ciò consentirà loro di essere resi e miscelati tra loro. Dovresti comunque eseguire test di profondità in modo che possano essere adeguatamente occlusi dalla geometria nella scena.


5

L'uso dell'ordine di fusione additiva non ha importanza:

glEnable(GL_BLEND)
glDepthMask(GL_FALSE)
glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA)
DrawParticles();

// Now turn depth masking on and blending off, so state is unchanged.
glDepthMask(GL_TRUE)
glDisable(GL_BLEND)

Questo presuppone che la trama dello sprite abbia uno sfondo trasparente.

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.