Unity: applica un effetto immagine su un solo livello


8

Per favore, considera questa semplice scena.

inserisci qui la descrizione dell'immagine

È composto da 3 diversi oggetti di gioco. 1 immagine di sfondo + 1 immagine di carattere statico + 1 piccola parte (con l'animale domestico) che viene modificata in fase di esecuzione per eseguire un'animazione.

inserisci qui la descrizione dell'immagine

Lo sfondo viene reso utilizzando una telecamera dedicata. Il personaggio (statico + anim) viene reso usando un'altra telecamera dedicata. Entrambe le telecamere sono impostate su Profondità solo con una maschera di abbattimento diversa (ogni telecamera esegue il rendering solo della sua parte). Si noti che la telecamera responsabile del personaggio ha una profondità maggiore rispetto a quella responsabile dello sfondo (ovvero, il personaggio viene visualizzato dopo lo sfondo).

Devo applicare un effetto immagine solo sulla fotocamera personaggio, ma non riesco a trovare un modo per questo effetto di non influenzare lo sfondo.

Esempio qui con un effetto Vortex sulla videocamera dei personaggi.

inserisci qui la descrizione dell'immagine

Come faresti un simile trucco?

Risposte:


8

Il problema è che l'effetto immagine afferra la schermata corrente dopo il rendering.

Poiché la tua fotocamera esegue il rendering direttamente sul backbuffer (eliminano solo la profondità), l'effetto dell'immagine si applica a tutto.

La soluzione può essere:

  • Imposta prima una videocamera che sia chiara su un colore trasparente, con un RenderTarget di installazione (puoi crearlo tramite uno script in modo che abbia le stesse dimensioni dello schermo) e il postprocesso desiderato.
  • Imposta una seconda fotocamera che renda il tuo sfondo, chiaro a colore di sfondo / skybox
  • Installa un terzo Camera, che non renda nulla (maschera di abbattimento impostata su Nothing), cancella nulla e abbia lo script AlphaBlit.cs ad esso collegato. AlphaBlit ha bisogno di due informazioni: un materiale che usa AlphaBlit.shader e il rendertarget per fondersi (sarà necessario assegnarlo per script se lo si è creato per script nel primo passaggio)
  • Imposta una quarta videocamera che renda il tuo personaggio in avanti.

ATTENZIONE: questo è un algoritmo di pittore. Significa che tutto il rendering della terza videocamera viene visualizzato in cima a ciò che già c'è, e la quarta videocamera eseguirà il rendering in cima a ciò.

Non sono sicuro che ci sia un modo per fare meglio, poiché richiederebbe anche di distorcere il buffer di profondità, il che non è possibile ... (non senza il rendering diretto con un effetto vortice che è più difficile) ...

Ovviamente il modo più ottimizzato per farlo sarebbe quello di non applicare il postprocesso sulla prima telecamera, ma semplicemente renderlo renderizzato in un rendertarget e modificare AlphaBlit.shader per fare l'effetto vortice mentre blit quel RenderTarget. Ma è più complesso.


Grazie per la tua risposta. Ho dei problemi con "Renderizza una telecamera con uno script che fa semplicemente in OnRenderImage una Blit di quel RenderTarget nella destinazione del rendering di destinazione (cioè il backbuffer qui)". .. perché anche se il colore è nero trasparente, tutto è nero una volta blit.
lvictorino,

risposta modificata con maggiore precisione
Sirithang,

Il flusso di lavoro della soluzione di base va bene, ma sto affrontando un problema imprevisto con Alpha qui. In realtà voglio sfocare i livelli di primo piano. Questa soluzione funziona, ma sembra in qualche modo cablata. puu.sh/C6sSB/ca5d5162b0.jpg Se cambio il colore delle bandiere chiare in Magenta con trasparenza 0, ha uno strano contorno magenta ai lati (dovrebbe essere solo trasparente). puu.sh/C6sSB/ca5d5162b0.jpg . Questo rende l'intera soluzione non funzionante per me. Non sono proprio sicuro, perché questo accada. Il cambio di flag trasparenti non aiuta.
AvrDragon,
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.