2009-07-03 14 views
5

Sto pensando di rimuovere il motion blur nel mio programma 2D, ma dubito dei risultati del mio attuale algoritmo.Soluzioni di motion blur 2D

Il mio approccio si presenta così in questo momento:

  • Draw per backbuffer.
  • In caso di aggiornamento del buffer anteriore dell'aggiornamento , miscelare il backbuffer sul buffer anteriore.
  • Ripetere

cosa potrebbe causare l'effetto "motion blur" è ovviamente la fusione, come oggetti in movimento lasceranno una traccia dissolvenza.

Questo non è chiaramente molto impegnativo per l'hardware, il doppio buffering verrà comunque eseguito e l'unico passaggio aggiuntivo è l'alpha blending, che è un semplice calcolo. Tuttavia, i sentieri saranno molto nitidi e non sfocati affatto, il che potrebbe sembrare un po 'strano. Potrei fare una finestra sfocata sul buffer posteriore prima del passaggio di miscelazione, ma sembra che potrebbe essere molto oneroso su sistemi di fascia bassa come il Nintendo DS.

Esistono soluzioni che consentono di eseguire l'operazione in modo più efficiente o ottenere risultati migliori?

risposta

5

In realtà dovresti eseguire il rendering di molti fotogrammi intermedi e unirli in un unico risultato. Supponiamo, ad esempio, che la frequenza dei fotogrammi in uscita sia di 50 fps. Probabilmente otterresti un risultato ragionevole se esegui il rendering internamente a 500 fps e gruppi fusi di dieci fotogrammi insieme prima di mostrarlo all'utente.

L'approccio che si sta utilizzando al momento simula la persistenza, come se si stesse eseguendo il rendering su un vecchio CRT con fosforo lento. Questa non è proprio la stessa cosa del motion blur. Se la durata del fotogramma è 20 ms (1000/50), un fotogramma sfocato di movimento è costituito da rendering che coprono la durata del fotogramma di 20 ms, tutti con la stessa ponderazione alfa. La soluzione di persistenza consiste in rendering da 20, 40, 60, 80, 100ms fa, gradualmente scomparendo.

+0

Questo è un buon suggerimento, tuttavia sembra che potrebbe richiedere molta potenza di elaborazione. – Skurmedel

+1

Infatti. A seconda del tipo di primitive che stai visualizzando, ci sono probabilmente alcune ottimizzazioni che potresti applicare. O potresti provare un ibrido tra il mio suggerimento e il tuo. L'algoritmo che hai proposto era un trucco di codifica demo standard negli anni '90. Può produrre buoni risultati. Tuttavia, se stai cercando uno scopo generale, implementazione semplice e veloce del motion blur, sei sfortunato. Ecco perché non lo vedi quasi mai implementato. –

1

Potrebbe non essere molto nitido. Tutto dipende dalla funzione di fusione utilizzata. Ad esempio, 0,1/0,9 per immagine precedente/corrente forniranno una traccia debole.

Potrei aggiungere che si tratta essenzialmente di come si fa il movimento sfocatura in OpenGL (attraverso buffer di accumulo)

+0

Grazie per l'input. Buono a sapersi che la mia idea non era troppo amatoriale :) – Skurmedel

1

Non c'è nessun vero modo per farlo in modo più efficiente a mia conoscenza. È più efficiente che mai. Sembra piuttosto buono se il frame rate è buono e il movimento non è troppo nitido.

Il piano migliore sarebbe, per ciascun pixel, tracciare una linea semitrasparente dalla nuova posizione alla posizione precedente. Questo non è un calcolo banale, comunque.

+0

Devo aggiungere che anche questo piano dall'aspetto migliore apparirà sbagliato se tra i frame l'oggetto non si muove linearmente. – Goz

+0

Grazie. Questo è un pensiero interessante, Goz, non l'aveva considerato. Potrebbe sembrare strano se un oggetto andasse da un'estremità all'altra dello schermo in un singolo fotogramma se l'opacità del backbuffer è bassa. – Skurmedel