"Ping-Pong FBOs" giving weird result

Hi, :cool:

I’m having a problem with Ping-Ponging 2 FBOs (at least i think the problem is here). The resulting image is filled with dark pixels that wasn’t supposed to be there. Check the result:
http://www.geocities.com/karl_phillip/fbo_weird_result.JPG

This is what i’m doing:

  
void display_callback(void)
{
   int i,
   source = 0,
   dest = 1;

   glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
   
   for (i = 0; i < IT_NUM; ++i)
   {
      // switch source and dest for next pass
      source = (source + 1) % 2;
      dest = (dest + 1) % 2;

      // select source: If it's the first iteration we must use "texture"
      if (i == 0)
         glBindTexture(texture_target, texture);
      else
         glBindTexture(texture_target, fbuffer[source].tex_obj);

      // select destination   
      glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, fbuffer[dest].fb_obj);   
      // #1 Cg Program
      cgGLEnableProfile(cg_profile);
      cgGLBindProgram(cg_program[CG_PRG_DIFF_P1]);
      gl_draw_quad(IMAGE_HEIGHT, IMAGE_WIDTH, 0);

      // #2 Cg Program
      glEnable(GL_BLEND);
      glBlendFunc(GL_ONE, GL_ONE);
      cgGLBindProgram(cg_program[CG_PRG_DIFF_P2]);         
      gl_draw_quad(IMAGE_HEIGHT, IMAGE_WIDTH, 0);                     
      // Add results from First and Second Cg programs
      cgGLDisableProfile(cg_profile);
      glBlendFunc(GL_ONE_MINUS_DST_ALPHA, GL_ONE);
      gl_draw_quad(IMAGE_HEIGHT, IMAGE_WIDTH, 0);
      glDisable(GL_BLEND);
   }
   
   // Copy image from dest buffer to screen
   glBindTexture(texture_target, 0);
   glBindTexture(texture_target, fbuffer[dest].tex_obj);
   glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);
   
   gl_draw_quad(IMAGE_HEIGHT, IMAGE_WIDTH, 1);

   /* Bit blitting */
   glutSwapBuffers();
}

Perhaps something to do with glBlendFunc() and FBOs?

However, it’s interesting to note that if i don’t use “Ping-Ponging FBOs” the result is alright. Check it out:
http://www.geocities.com/karl_phillip/no_fbo.JPG

My code WITHOUT FBOs is this:

  
void display_callback(void)
{
   glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
   cgGLEnableProfile(cg_profile);

   /* Diffusion pass-One into screen buffer */
   glBindTexture(texture_target, texture);                        /* Bind the texture with the pixels */
   glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);
   cgGLBindProgram(cg_program[CG_PRG_DIFF_P1]);         
   gl_draw_quad(IMAGE_HEIGHT, IMAGE_WIDTH, 0);      

   glEnable(GL_BLEND);

   /* add the results of Diffusion pass-Two into the same buffer */
   cgGLBindProgram(cg_program[CG_PRG_DIFF_P2]);            
   glBlendFunc(GL_ONE, GL_ONE);
   gl_draw_quad(IMAGE_HEIGHT, IMAGE_WIDTH, 0);   


   cgGLDisableProfile(cg_profile);
   glBlendFunc(GL_ONE_MINUS_DST_ALPHA, GL_ONE);
   gl_draw_quad(IMAGE_HEIGHT, IMAGE_WIDTH, 0);

   glDisable(GL_BLEND);

   /* Bit blitting */
   glutSwapBuffers();
}

Any ideias why “Dark Pixels” are invading my image when using “Ping Pong FBOs” ?
“Dark Pixels” would be a cool name for a Star Wars character :smiley:

Thanks.

Anyway, i tested both versions of this code on different computers and graphic cards with the latest drivers (GeForce 6600 and GeForce 7600GT) and i have no clue why this is happening, the results are always the same: Ping-ponging FBOs is ruining my image.

:frowning:

Nevermind, already solved it :wink:

The problem was that i was setting up the internal format of the texture as GL_RGBA and the internal format of the FBOs texture as GL_RGB. :oops: