2015-05-24 10 views
7

ho integrato il rendering HDR fioritura usando OpenGL e GLSL ... Almeno credo! Non sono molto sicuro del risultato.effetto HDR Bloom pipeline di rendering con OpenGL/GLSL

ho seguito un tutorial dal sito Web di Intel:

https://software.intel.com/en-us/articles/compute-shader-hdr-and-bloom 

E circa effetto di sfocatura gaussiana seguo scrupolosamente tutti i consigli riguardanti la realizzazione, sul seguente sito web:

https://software.intel.com/en-us/blogs/2014/07/15/an-investigation-of-fast-real-time-gpu-based-image-blur-algorithms 

Secondo il primo sito web :

"L'uscita pass luminoso viene scalata dal mezzo 4 volte Ogni uscita passa luminose downscaled sono sfocate con un G separabile. filtro aussian e quindi aggiunto alla successiva uscita a risoluzione luminosa passata più alta. Il risultato finale è una fioritura formato ¼ che è in campionato e ha aggiunto all'uscita HDR prima mappatura dei toni."

Ecco la pipeline fioritura (le immagini di cui sopra sono state prese da Nsight NVIDIA Debugger).

La risoluzione della finestra nella mia prova è 1024x720 (per la necessità di questo algoritmo questa risoluzione sarà ridimensionato 4 volte)

Fase 1:.

passaggio illuminazione (miscelazione di materiale passaggio + ombra maschera passaggio + passaggio skybox) :

enter image description here

Fase 2:

Estrazione del hight informazioni luce in un passaggio luminoso (per la precisione, 4 mipmaps texture sono generati ("L'uscita pass luminoso viene scalata dal mezzo 4 volte" -> 1/2 , 1/4, 1/8 e 1/2 infine)):

enter image description here

Fase 3:

"Ogni uscita passa luminose downscaled sono sfocate con un filtro gaussiano separabile e la n aggiunto alla successiva uscita ad alta risoluzione luminosa passante. "

Voglio essere preciso che il filtro bilineare sia abilitato (GL_LINEAR) e la pexillizzazione sulle immagini sopra riportate è il risultato del ridimensionamento della trama sul debugger NSight finestra (1024x720).

a) Risoluzione 1/16x1/16 (64x45)

"1/16x1/16 uscita offuscata"

b) Risoluzione 1/8x1/8 (128x90)

"1/8x1/8 downscaled passaggio luminoso, combinato con 1/16x1/16 uscita offuscata"

enter image description here

.515.053.691,36321 milioni

"1/8x1/8 uscita offuscata"

enter image description here

c) Risoluzione 1/4x1/4 (256x180)

"1/4x1/4 downscaled passaggio luminoso, combinato con 1/8x1/8 uscita offuscata"

enter image description here

"1/4x1/4 uscita offuscata"

enter image description here

d) Risoluzione 1/2x1/2 (512x360)

"1/2x1/2 ridimensionato passaggio luminoso, combinato con 1/4x1/4 uscita offuscata"

enter image description here

"1/2x1/2 uscita offuscata"

enter image description here

di indirizzare il lev desiderato el di mipmap Uso il ridimensionamento FBO (ma forse sarebbe più intelligente usare FBO separati già dimensionati all'inizializzazione piuttosto che ridimensionare lo stesso più volte. Cosa ne pensi di quest idea ?).

Fase 4:

mappatura tono di rendering passaggio:

enter image description here

Fin qui mi piacerebbe avere una consulenza esterna sul mio lavoro. È corretto o no? Non sono molto sicuro del risultato in modo esponenziale riguardo al passaggio 3 (la parte di downscaling e bluring).

Penso che l'effetto di sfocatura non sia molto pronunciato! Comunque uso un convoluzione del kernel 35x35 (sarebbe sufficiente, penso :)).

Ma sono davvero incuriosito da un articolo su un pdf. Ecco la presentazione della pipeline di fioritura (la presentazione è più o meno la stessa di quella che ho applicato).

enter image description here

Link:

https://www.google.fr/url?sa=t&rct=j&q=&esrc=s&source=web&cd=1&cad=rja&uact=8&ved=0CCMQFjAA&url=https%3A%2F%2Ftransporter-game.googlecode.com%2Ffiles%2FRealtimeHDRImageBasedLighting.pdf&ei=buBhVcLmA8jaUYiSgLgK&usg=AFQjCNFfbP9L7iEiGT6gQNW6dB2JFVcTmA&bvm=bv.93990622,d.d24

Come potete vedere sopra l'immagine che l'effetto di sfocatura sanguinamento è molto più forte del mio! Pensi che l'autore usi diversi kernel di convoluzione (risoluzioni più alte)?

La prima cosa che non capisco è come l'algoritmo di sfocatura gaussiana fa apparire altri colori diversi dal bianco (valori di scala di grigi) sulla terza immagine. Ho guardato molto attentamente (zoom elevato) sull'immagine luminosa (la seconda) e tutti i pixel sembrano essere vicini al bianco o al bianco (scala di grigi). Una cosa è certa: non ci sono pixel blu o arancioni sulla texture luminosa. Quindi, come possiamo spiegare una tale transizione dall'immagine 2 all'immagine 3? È molto strano per me.

La seconda cosa che non capisco è l'alta differenza di effetto sfocatura tra le immagini 3, 4, 5 e 6! Nella mia presentazione uso il kernel di convoluzione 35x35 e il risultato finale è vicino alla terza immagine qui.

Come si può spiegare una tale differenza?

PS: Si noti che utilizzo il formato interno GL_HALF_FLOAT e GL_RGBA16F per inizializzare la trama di rendering del rendering (tutti gli altri passaggi di rendering sono inizializzati come GL_RGBA e GL_FLOAT).

C'è qualcosa che non va nel mio programma?

Grazie mille per il vostro aiuto!

risposta

1

Le trame sfocate a bassa risoluzione non sembrano abbastanza sfocate. Penso che ci sia un problema per quanto riguarda la larghezza del filtro (non il numero di campioni, ma la distanza tra i campioni) o la dimensione del framebuffer.

Supponiamo di avere un fbo originale 150x150, una versione ridimensionata 15x15 per la fioritura. E che usi il filtro sfocatura 15x15.

La versione ad alta risoluzione sfocata influisce sul tratto di 7px attorno alle parti luminose. Ma sfocando l'immagine a bassa risoluzione, la larghezza del kernel influirebbe praticamente su tutta l'area dell'immagine. A bassa risoluzione, il colpo di 7px significa - un'intera area dell'immagine. Quindi tutti i pixel nella versione a bassa risoluzione sfocata apporterebbero un contributo all'immagine composta finale. Pertanto, l'immagine sfocata ad alta risoluzione avrebbe contribuito con la sua sfocatura per il tratto di 7px intorno alle parti luminose, mentre l'immagine sfocata a bassa risoluzione avrebbe fatto una differenza significativa su un'intera area dell'immagine.

Le immagini a bassa risoluzione semplicemente non sembrano ben sfocate, poiché il loro contributo rimane ancora entro il limite di 35/2px attorno alle parti luminose, il che è sbagliato.

Spero di essere riuscito a spiegare cosa c'è che non va. Cosa cambiare esattamente, probabilmente le dimensioni della finestra di visualizzazione mentre si sfocatura le immagini a bassa risoluzione, ma semplicemente non posso essere sicuro al 100%.

+1

Grazie mille! In effetti, stavo inviando la vista errata come variabile uniforme al mio shauss blur shader (era sempre impostata sulla risoluzione della mia finestra originale -> 1024 * 720). Quindi la media di ogni offset di pixel era completamente sbagliata. Grazie ancora per il tuo aiuto! Ciao. – user1364743

+1

Potresti caricare le immagini con la correzione, in modo che altri possano conoscere qual è il problema? Saluti e buona fortuna. –