FrameBuffer Render to texture not working all the way

Posted by brainydexter on Game Development See other posts from Game Development or by brainydexter
Published on 2011-02-19T08:58:42Z Indexed on 2011/02/19 15:33 UTC
Read the original article Hit count: 395

Filed under:
|

I am learning to use Frame Buffer Objects. For this purpose, I chose to render a triangle to a texture and then map that to a quad.

When I render the triangle, I clear the color to something blue. So, when I render the texture on the quad from fbo, it only renders everything blue, but doesn't show up the triangle. I can't seem to figure out why this is happening. Can someone please help me out with this ?

I'll post the rendering code here, since glCheckFramebufferStatus doesn't complain when I setup the FBO. I've pasted the setup code at the end. Here is my rendering code:

void FrameBufferObject::Render(unsigned int elapsedGameTime)
{
    glBindFramebuffer(GL_FRAMEBUFFER, m_FBO);
    glClearColor(0.0, 0.6, 0.5, 1);
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    // adjust viewport and projection matrices to texture dimensions
    glPushAttrib(GL_VIEWPORT_BIT);
    glViewport(0,0, m_FBOWidth, m_FBOHeight);

    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glOrtho(0, m_FBOWidth, 0, m_FBOHeight, 1.0, 100.0);

    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();

    DrawTriangle();

    glPopAttrib();
    // setting FrameBuffer back to window-specified Framebuffer
    glBindFramebuffer(GL_FRAMEBUFFER, 0);       //unbind

    // back to normal viewport and projection matrix
    //glViewport(0, 0, 1280, 768);

    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    gluPerspective(45.0, 1.33, 1.0, 1000.0);

    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();

    glClearColor(0, 0, 0, 0);
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    render(elapsedGameTime);
}

void FrameBufferObject::DrawTriangle()
{
    glPushMatrix();

    glBegin(GL_TRIANGLES);
        glColor3f(1, 0, 0);

        glVertex2d(0, 0);
        glVertex2d(m_FBOWidth, 0);
        glVertex2d(m_FBOWidth, m_FBOHeight);

    glEnd();

    glPopMatrix();
}

void FrameBufferObject::render(unsigned int elapsedTime)
{
    glEnable(GL_TEXTURE_2D);
    glBindTexture(GL_TEXTURE_2D, m_TextureID);

    glPushMatrix();

        glTranslated(0, 0, -20);

    glBegin(GL_QUADS);
        glColor4f(1, 1, 1, 1);

        glTexCoord2f(1, 1);  glVertex3f(1,1,1);
        glTexCoord2f(0, 1);  glVertex3f(-1,1,1);
        glTexCoord2f(0, 0);  glVertex3f(-1,-1,1);
        glTexCoord2f(1, 0);  glVertex3f(1,-1,1);

    glEnd();
    glPopMatrix();

    glBindTexture(GL_TEXTURE_2D, 0);
    glDisable(GL_TEXTURE_2D);

}

void FrameBufferObject::Initialize()
{
    // Generate FBO
    glGenFramebuffers(1, &m_FBO);
    glBindFramebuffer(GL_FRAMEBUFFER, m_FBO);

    // Add depth buffer as a renderbuffer to fbo
    // create depth buffer id

    glGenRenderbuffers(1, &m_DepthBuffer);
    glBindRenderbuffer(GL_RENDERBUFFER, m_DepthBuffer);

    // allocate space to render buffer for depth buffer
    glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT, m_FBOWidth, m_FBOHeight);

    // attaching renderBuffer to FBO
    // attach depth buffer to FBO at depth_attachment
    glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, m_DepthBuffer);

    // Adding a texture to fbo
    // Create a texture
    glGenTextures(1, &m_TextureID);
    glBindTexture(GL_TEXTURE_2D, m_TextureID);
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, m_FBOWidth, m_FBOHeight, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0); // onlly allocating space
    glBindTexture(GL_TEXTURE_2D, 0);

    // attach texture to FBO
    glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, m_TextureID, 0);

    // Check FBO Status
    if( glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE)
        std::cout << "\n Error:: FrameBufferObject::Initialize() :: FBO loading not complete \n";

    // switch back to window system Framebuffer
    glBindFramebuffer(GL_FRAMEBUFFER, 0);
}

Thanks!

© Game Development or respective owner

Related posts about opengl

Related posts about rendering