2015-06-22 8 views
5

Provo a creare un FrameBuffer con 2 trame ad esso collegate (Obiettivi di rendering multi). Quindi, in ogni passaggio temporale, entrambe le trame vengono cancellate e dipinte, come il seguente codice. (Una parte sarà sostituito come pseudo-codice per renderlo più breve.)Opengl - La modifica di glDrawBuffers è memorizzata in un FBO? No?

Versione 1

//beginning of the 1st time step 
initialize(framebufferID12) 
//^ I quite sure it is done correctly, 
//^ Note : there is no glDrawBuffers() calling 

loop , do once every time step { 
    glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, framebufferID12); 
    //(#1#) a line will be add here in version 2 (see belowed) <------------ 
    glClearColor (0.5f, 0.0f, 0.5f, 0.0f); 
    glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 
    // paint a lot of object here , using glsl (Shader .frag, .vert) 
    glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0); 
} 

Tutti gli oggetti sono dipinte in modo corretto sia la consistenza, ma solo la prima texture (ATTACHMENT0) è cancellato ogni frame, che è sbagliato.

versione 2

provo ad inserire una riga di codice ...

glDrawBuffers({ATTACHMENT0,ATTACHMENT1}) ; 

a (# 1 #) e funziona come previsto cioè cancellare tutti i due texture.

(immagine http://s13.postimg.org/66k9lr5av/gl_Draw_Buffer.jpg)

Versione 3

Dalla versione 2, I muovo che glDrawBuffers() dichiarazione di essere all'interno di inizializzazione frame buffer simili

initialize(int framebufferID12){ 
    int nameFBO = glGenFramebuffersEXT(); 
    int nameTexture0=glGenTextures(); 
    int nameTexture1=glGenTextures(); 
    glBindFramebufferEXT(GL_FRAMEBUFFER_EXT,nameFBO); 
     glBindTexture(nameTexture0); 
     glTexImage2D(....); glTexParameteri(...); 
     glFramebufferTexture2DEXT(ATTACHMENT0, nameTexture0); 
     glBindTexture(nameTexture1); 
     glTexImage2D(....); glTexParameteri(...); 
     glFramebufferTexture2DEXT(ATTACHMENT0, nameTexture1); 
     glDrawBuffers({ATTACHMENT0,ATTACHMENT1}) ; //<--- moved here --- 
    glBindFramebufferEXT(GL_FRAMEBUFFER_EXT,0); 
    return nameFBO ; 
} 

Non funziona più (sintomo come la versione 1), perché?

Il manuale opengl detto che "modifiche al contesto stato saranno memorizzati in questo oggetto", quindi la modifica di stato da glDrawBuffers() verranno memorizzati in "framebufferID12" giusto? Quindi, perché devo chiamarlo ogni volta che passo (o ogni volta che cambio FBO)

Posso fraintendere qualche concetto di opengl, qualcuno mi illumini per favore.

Modifica 1: Grazie j-p. Sono d'accordo sul fatto che abbia senso, ma non dovrebbe lo stato essere registrato nell'FBO già?

Modifica 2 (risposta accettata): la risposta di Reto Koradi è corretta! Sto usando una libreria non standard chiamata LWJGL.

+0

Per me è logico dover regolare i buffer di estrazione ogni volta che si esegue il binding a un nuovo buffer se non si utilizza la configurazione predefinita. ma non sono uno specialista ... –

risposta

4

Sì, l'impostazione dei buffer di estrazione fa parte dello stato del framebuffer. Se si guarda ad esempio il documento spec. OpenGL 3.3, è elencato nella tabella 6.23 a pagina 299, intitolato "Framebuffer (stato per oggetto framebuffer)".

Il valore predefinito per gli FBO è un buffer di estrazione singolo, che è GL_COLOR_ATTACHMENT0. Dalla stessa specifica, pagina 214:

Per gli oggetti framebuffer, nello stato iniziale il buffer di disegno per il colore zero del frammento è COLOR_ATTACHMENT0. Per entrambi gli oggetti framebuffer e framebuffer predefiniti, lo stato iniziale dei buffer di disegno per i colori dei frammenti diversi da zero è NONE.

Quindi è previsto che se si dispone di più di un buffer di disegno, è necessaria la chiamata esplicita glDrawBuffers().

Ora, perché non sembra funzionare per voi se si effettua la chiamata glDrawBuffers() come parte dell'installazione FBO, è piuttosto misterioso. Una cosa che ho notato nel tuo codice è che stai usando il modulo EXT delle chiamate FBO. Sospetto che questo potrebbe avere qualcosa a che fare con il tuo problema.

Gli FBO fanno parte dello standard OpenGL dalla versione 3.0. Se è possibile utilizzare OpenGL 3.0 o versioni successive, ti consigliamo vivamente di utilizzare i punti di accesso standard. Mentre le estensioni funzionano normalmente anche dopo che la funzionalità è diventata standard, sarei sempre scettico su come interagiscono con altre funzionalità. In particolare, c'erano più estensioni per la funzionalità FBO prima della 3.0, con un comportamento diverso. Non sarei sorpreso se alcuni di loro interagiscono in modo diverso con altre chiamate OpenGL rispetto alla funzionalità standard dell'FBO.

Quindi, provare a utilizzare i punti di ingresso standard (quelli senza il EXT nel loro nome). Spero che risolva il tuo problema.

Problemi correlati