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.
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 ... –