Buenas,
Estoy intentando renderizar mi escena a una textura, este es el codigo de inicializacion:
glGenTextures(1, &textura_fbo);
glBindTexture(GL_TEXTURE_2D, textura_fbo);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTE R,GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTE R,GL_LINEAR);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, w_size, h_size, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);
glGenRenderbuffersEXT(1, &depthbuffer);
glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, depthbuffer);
glGenFramebuffersEXT(1, &fbo);
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, fbo);
//definmos nuestro renderbuffer
glRenderbufferStorageEXT(GL_RENDERBUFFER_EXT, GL_DEPTH_COMPONENT, w_size, h_size);
//añadimos el renderbuffer al frambuffer
glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, GL_RENDERBUFFER_EXT, depthbuffer);
//añadimos una textura
glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D, textura_fbo, 0);
//glBindTexture(GL_TEXTURE_2D, 0);
//comprobamos si hay errores
GLenum status = glCheckFramebufferStatusEXT(GL_FRAMEBUFFER_EXT);
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);
Me devuelve "FBO completed" asi que supuestamente esta bien montado.
Antes y despues de pintar el escenario lo activo y desactivo asi:
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, fbo);
//glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT,GL_DEPTH_ATTACHMENT_EXT, GL_RENDERBUFFER_EXT, depthbuffer);
//glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT,GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D, textura_fbo, 0);
glPushAttrib(GL_VIEWPORT_BIT);
glViewport(0, 0, w_size, h_size);
glPopAttrib();
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);
Y aqui es donde pinto la textura generada
glBindTexture(GL_TEXTURE_2D, textura_fbo);
// Set Flags
glEnable(GL_TEXTURE_2D);
glDisable(GL_DEPTH_TEST);
glMatrixMode(GL_PROJECTION); // Select The Projection Matrix
glPushMatrix(); // Store The Projection Matrix
// Change to orthogonal projection to do a texture blitter to the screen
glLoadIdentity(); // Reset The Projection Matrix
glOrtho(0,1,0,1,-1,1); // Set Up An Ortho Screen
glMatrixMode(GL_MODELVIEW); // Select The Modelview Matrix
glPushMatrix(); // Store The Modelview Matrix
glLoadIdentity(); // Reset The Modelview Matrix
glBegin(GL_QUADS);
glTexCoord2f(0.0f, 0.0f);
glVertex3f(-1.0f, -1.0f, 0.0f);
glTexCoord2f(1.0f, 0.0f);
glVertex3f( 1.0f, -1.0f, 0.0f);
glTexCoord2f(1.0f, 1.0f);
glVertex3f( 1.0f, 1.0f, 0.0f);
glTexCoord2f(0.0f, 1.0f);
glVertex3f(-1.0f, 1.0f, 0.0f);
glEnd();
glMatrixMode(GL_PROJECTION); // Select The Projection Matrix
glPopMatrix(); // Restore The Old Projection Matrix
glMatrixMode(GL_MODELVIEW); // Select The Modelview Matrix
glPopMatrix(); // Restore The Old Projection Matrix*/
Al renderizar la textura aparece la pantalla completamente negra. Si comento esta lina al inicializar
glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, GL_RENDERBUFFER_EXT, depthbuffer);
puedo ver la textura pero sin depth testing.
Estoy jodido.
Alguien me muede echar una mano.
Muchas gracias y un saludo.
Solucionao!!.
Se me había pasado limpiar el depthbuffer dentro del FBO.
Un saludo.
Deja el resultado final, para quien quiera implementarse un FBO tenga una referencia más :)
Saludetes!
Realmente sólo hay que añadir una línea, para limpiar el colorbuffer y el depthbuffer una vez que esté activado el fbo y antes de empezar a pintar sobre él.
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
Por ejemplo, ponerlo justo al final del segundo procedimiento que puse en el primer post.
Un saludo,