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,






Stratos es un servicio gratuito, cuyos costes se cubren en parte con la publicidad.
Por favor, desactiva el bloqueador de anuncios en esta web para ayudar a que siga adelante.
Muchísimas gracias.