PDA

View Full Version : Rendering malfunction using FBO TextureRendering in ATI cards



yalmar
07-20-2006, 03:58 PM
Hi,

I'm working with FBO to render in to textures. Before, i worked with NVidia 6800 and my app works fine using GL_TEXTURE_RECTANGLE_NV, but now I convert the code to work with GL_TEXTURE_2D, this supports both NVidia and ATI cards (i'm using 4 COLOR_ATTACHMENTs). After execute several computations using shaders (vertex and fragment) I use this data for rendering the scene, but the illumination is being affected by some OpenGL functionality, i don't know that may be.

void render_scene() {
//bind the FBO, and the associated texture.
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, fb);

glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluOrtho2D(0, imageWidth, 0, imageHeight);

glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glViewport(0, 0, imageWidth, imageHeight);

_shader1.use(true);

glDrawBuffer(GL_COLOR_ATTACHMENT0_EXT);

glClearColor(0.0, 0.0, 0.0, 1.0);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

glEnable(GL_TEXTURE_2D);
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, tex[0]);

glActiveTexture(GL_TEXTURE1);
glBindTexture(GL_TEXTURE_2D, tex[1]);

drawQuad();

_shader2.use(false);

glDrawBuffer(GL_COLOR_ATTACHMENT1_EXT);
glClearColor(0.0, 0.0, 0.0, 1.0);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, tex[2]);

glActiveTexture(GL_TEXTURE1);
glBindTexture(GL_TEXTURE_2D, tex[3]);

drawQuad();

glReadPixels(0, 0, imageWidth, imageHeight, GL_RGBA, GL_FLOAT, data);

glUseProgram(0);

glDisable(GL_TEXTURE_2D);
// 'unbind' the FBO. things will now be drawn to screen as usual
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);

setWindowState();

//---> Here is the problem, as if the light was being
// influenced by some shader program or texture
RenderObjects(data);

glutSwapBuffers();
}

CatAtWork
07-20-2006, 04:17 PM
It looks like you think glDisable(GL_TEXTURE_2D) affects all texture units, when it only affects the currently active unit.

You might need to disable texturing with the ActiveTexture set to 0.


glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, tex[2]);

glActiveTexture(GL_TEXTURE1);
glBindTexture(GL_TEXTURE_2D, tex[3]);

drawQuad();

glReadPixels(0, 0, imageWidth, imageHeight, GL_RGBA, GL_FLOAT, data);

glUseProgram(0);

// Last active unit was TEXTURE1 !!
glDisable(GL_TEXTURE_2D);

yalmar
07-21-2006, 11:03 AM
Thanks, now this works fine.