2012-03-09 17 views
6

rendering off-screen su un framebuffer off-frame con texture oggetto dovrebbe essere così banale ma sto avendo un problema non riesco a girare la testa .OpenGL render-to-texture-via-FBO - visualizzazione errata rispetto al normale Texture

Il mio programma di esempio completo (! 2D solo per ora) è qui:

http://pastebin.com/hSvXzhJT

Vedi di seguito per alcune descrizioni.

Sto creando un oggetto texture rgba 512x512, associandolo a un FBO. A questo punto non sono necessari approfondimenti o altri buffer di rendering, rigorosamente 2D.

I seguenti ombreggiatori estremamente semplici rendono questa struttura:

Vertex Shader:

varying vec2 vPos; attribute vec2 aPos; 
void main (void) { 
    vPos = (aPos + 1)/2; 
    gl_Position = vec4(aPos, 0.0, 1.0); 
} 

In questo APOS ottiene solo una VBO contenente 4 coordinate xy per un quad (-1, -1 :: 1, -1 :: 1, 1 :: -1, 1)

Quindi anche se la risoluzione del framebuffer teoricamente dovrebbe essere di 512x512, ovviamente lo shader rende la sua "texture" su un "full-off screen quad", in seguito GLs -1..1 paradigma delle coordine.

Fragment Shader:

varying vec2 vPos; 
void main (void) { 
    gl_FragColor = vec4(0.25, vPos, 1); 
} 

Quindi imposta un colore completamente opaco con rosso fissato a 0,25 e verde/blu seconda x/y ovunque tra 0 e 1.

A questo punto la mia ipotesi è che una trama 512x512 viene renderizzata mostrando solo il quadrante dello schermo intero -1-.1 (spento), ombreggiato da frammenti per il verde/blu da 0..1.

Quindi questa è la mia configurazione fuori schermo. Sullo schermo, ho un altro quad a schermo intero visibile con 4 xyz coords {-1, -1, 1 ::: 1, -1, 1 ::: 1, 1, 1 ::: -1, 1, 1}. Ancora una volta, per ora questo è 2D quindi niente matrici e quindi z è sempre 1.

Questo quad è disegnato da uno shader diverso, semplicemente restituendo una determinata texture, lo stile GL-101 del libro di testo. Nel mio programma di esempio linkato sopra ho un semplice commutatore booleano doRtt, quando questo è falso (il default), il render-to-texture non viene eseguito affatto e questo shader mostra semplicemente usa texture.jpg dalla directory corrente.

Questo doRtt = falso modo mostra che il secondo quadrupolo di rendering su schermo è "corretto" per i miei requisiti attuali ed esegue la texturizzazione come voglio: ripetuto due volte verticalmente e due volte in orizzontale (in seguito verrà bloccato, ripetere è solo per testare qui), altrimenti ridimensionato con NESSUN filtro di trama o mipmapping.

Quindi, indipendentemente dal modo in cui la finestra (e quindi la vista) viene ridimensionata, vediamo sempre un quad a schermo intero con una singola trama ripetuta due volte in orizzontale, due volte in verticale.

Ora, con doRtt = true, il secondo dello shader fa ancora il suo lavoro, ma la trama è mai del tutto correttamente ridimensionato - o disegnato, questo non sono sicuro in quanto, purtroppo, non possiamo semplicemente dire "hey gl salvare questo FBO su disco per scopi di debug ".

Lo shader RTT esegue alcuni rendering parziali (o forse uno completo, di nuovo non si può sapere cosa sta succedendo fuori campo ...Soprattutto quando ridimensionate la finestra di visualizzazione molto più piccola delle dimensioni di default vedete le interruzioni tra le ripetizioni della trama, e non tutti i colori previsti dal nostro semplicissimo shader di frammenti RTT sono effettivamente mostrati.

(A): la trama 512x512 viene creata correttamente ma non mappata correttamente dal mio codice (ma allora perché è con doRtt = falso qualsiasi dato file texture.jpg utilizzando esattamente lo stesso semplice texture-quad-shader che mostra bene ?)

(B) o: la trama 512x512 non viene renderizzata correttamente e in qualche modo lo shader rtt frag cambia l'output in base alla risoluzione della finestra - ma perché? Il quadrante off-screen è sempre a -1..1 per x e y, il vertex shader esegue sempre il mapping su coord con frammenti 0..1, la texture RTT rimane sempre a 512x512 per questo semplice test!

Nota, SIA il quadrante fuori campo E il quadrante su schermo non cambiano mai le loro corde e sono sempre "a schermo intero" (-1..1 in entrambe le dimensioni).

Ancora, questo dovrebbe essere così semplice. Cosa diavolo mi manca?

Specifiche: OpenGL 4.2 (ma il codice non ha bisogno di nessuna funzionalità 4.2 ovviamente!), Nvidia Quadro 5010M, openSuse 12.1 64 bit, Golang Weekly 22-Feb-2012.

+0

Nel caso in cui Pastebin non sia attivo, lo stesso identico file sorgente è anche qui: http://dl.dropbox.com/u/2166329/testrtt.go - con un texture.jpg anche nel percorso. – metaleap

risposta

10

Prima di tutto, prova a verificare gli errori OpenGL. Chiama glGetError() dopo ogni funzione OpenGL. Inoltre è necessario impostare la vista corretta per il disegno. Prima di disegnare su FBO, chiama glViewport (0, 0, 512, 512). Prima di disegnare su schermo, chiamare glViewport (0, 0, display_width, display_height).

Inoltre non è necessario associare rttFrameTex quando si esegue il rendering utilizzando FBO. La texture vincolante è necessaria solo quando si legge la texture nello shader.

+0

E questo era tutto ciò che era necessario! Incredibile, grazie per avermi dedicato un po 'di tempo per darmi una mano su questo - ho già fatto "esperimenti con il port di visualizzazione" senza successo, ma ora ha funzionato all'istante, grazie ancora! Qualcuno con una reputazione superiore a> = 15 può migliorare Mārtiņš? – metaleap

+0

@PhilS. ... Ho alzato la tua domanda invece. –