GLSL Shader Effects: come eseguire il motion blur?


16

Ho un ambiente 2D completo, con sprite che vanno in giro come paesaggi, personaggi, ecc.

Per renderlo più all'avanguardia, voglio implementare un effetto motion blur, simile ai moderni giochi FPS (ad esempio Crysis) quando si sposta rapidamente la fotocamera.

In un sidescroller, l'effetto desiderato sta facendo apparire questa leggera sfocatura per dare l'idea di un movimento veloce quando la telecamera si sta muovendo. Se qualcuno potesse darmi qualche consiglio su come farlo, suppongo che in uno shader di pixel, sarei grato.


Conserva più copie del buffer di rendering. Ad esempio, sfocare quattro dei fotogrammi precedenti per creare il fotogramma corrente. Ciò dovrebbe creare l'effetto desiderato.
knight666,

@ knight666 non sarebbe meglio (memoria sicuramente, velocità non sono sicuro) mantenere 1 buffer aggiuntivo (chiamalo A) e mescolare una frazione (diciamo 0.75) di quello con il buffer di output (andando sullo schermo, chiamalo B) e poi copia B in A in seguito. Ciò creerebbe una media mobile e un aumento del motion blur non costerebbe nulla in più.
Elva,

1
Volevo rendere questo un commento, ma non sono riuscito a trovare il pulsante di commento. Ad ogni modo, ciò che dice Dave O. è probabilmente la soluzione migliore e ciò che viene utilizzato in giochi come Crysis. Funziona un po 'così. Durante il rendering degli oggetti, Rendering delle velocità degli oggetti in un buffer separato. MRT renderà questo un po 'più veloce e ci sono diversi modi per calcolare le velocità, ma si desidera finire con un buffer aggiuntivo che ha le velocità per l'intero buffer di rendering. Quindi in uno shader post-process, basato sulla velocità di ogni pixel, campionate nel buffer di colore nella direzione opposta alla velocità
Arelius,

Il codice HLSL / Cg nel Listato 27-1 utilizza le equazioni precedenti in uno shader di pixel di post-elaborazione a schermo intero per calcolare la posizione dello spazio mondiale degli oggetti renderizzati in un dato pixel, usando il buffer di profondità e l'inverso della corrente matrice di proiezione visiva. ... HLSL .... Nel tuo codice non è GLSL .....

Risposte:


6

Conserva una copia dell'ultimo framebuffer. Ottieni il vettore di movimento della videocamera e invertilo. Disegna la tua scena come al solito, quindi disegna l'ultimo framebuffer con un leggero offset (il delta della fotocamera che hai appena calcolato) e 0,75 alfa. Ripeti tutte le volte che vuoi per dare l'effetto di motion blur.


1
Questo approccio è molto semplice da implementare ma molto difficile da mettere a punto (può sembrare che gli oggetti lascino traccia invece di essere sfocati). Un altro approccio anche semplice è quello di "spalmare" i pixel nella direzione di movimento della telecamera invertita in uno shader di pixel di post-elaborazione.
Dave O.

6
Il problema principale con questo approccio è che dipende dal framerate: avrà un aspetto molto diverso se si esegue a 20 fps rispetto a come appare se si esegue a 100 fps. Finché ne sei consapevole e ottieni il risultato che desideri al framerate che corri, va bene, ma devi esserne consapevole.
Maximus Minimus,

19

Consiglierei di utilizzare questo metodo: Motion Blur come effetto post-elaborazione

Molto semplice da implementare, è quello che ho usato nella mia demo glsl Ruin island [link]


Questo metodo è di gran lunga superiore alla fusione nei frame precedenti ...
Steven Lu,

Come è ora, questa risposta fornisce solo un link. Se il collegamento si interromperà in futuro, nessuno saprà come risolvere effettivamente il problema. Prova almeno a includere le informazioni essenziali fornite dal link

Sì, facciamo una copia di Internet, perché quella copia non si romperà in nessun giorno: J
SasQ
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.