Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





FBO problemas

Iniciado por misscelan, 04 de Noviembre de 2007, 06:44:09 PM

« anterior - próximo »

misscelan

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.

misscelan

Solucionao!!.

Se me había pasado limpiar el depthbuffer dentro del FBO.


Un saludo.

Prompt

Deja el resultado final, para quien quiera implementarse un FBO tenga una referencia más :)

Saludetes!

misscelan

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,