Been messing around with these myself the last few days, so I can try to help. Bare in mind this is extremely new to me, but it works.
I plan to tidy my implementation up alot, and it is about as simple as an FBO can get or there about.
I think I’m starting down the right line, it works atleast
Would also love any comments back for improvements… but I am already aware this is v.basic implementation.
// FBO Globals
GLuint g_FBO;
GLuint g_FBOImg;
// Initiliased in main init()
GLvoid InitShaders()
{
shader1 = new Shader( ..."filepath"... );
shader1->UseShader();
shader1->SetAttribute1i( "render", g_FBOImg );
}
GLvoid InitFBOTexture(GLuint &tex)
{
glGenTextures( 1, &tex );
glActiveTexture( GL_TEXTURE0 + tex );
glBindTexture( GL_TEXTURE_2D, tex );
glTexImage2D( GL_TEXTURE_2D, 0, GL_RGBA8, g_WindowWidth, g_WindowHeight, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL );
glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE );
glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE );
glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR );
glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR );
}
GLvoid InitFBO()
{
GLuint m_Depthbuffer;
// Get handle to & bind FBO
glGenFramebuffersEXT( 1, &g_FBO );
glBindFramebufferEXT( GL_FRAMEBUFFER_EXT, g_FBO );
// Init depth render buffer and attach to bound FBO
glGenRenderbuffersEXT( 1, &m_Depthbuffer );
glBindRenderbufferEXT( GL_RENDERBUFFER_EXT, m_Depthbuffer );
glRenderbufferStorageEXT( GL_RENDERBUFFER_EXT, GL_DEPTH_COMPONENT, g_WindowWidth, g_WindowHeight );
// Init and attach texture to FBO
InitFBOTexture( g_FBOImg );
glFramebufferTexture2DEXT( GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D, g_FBOImg, 0 );
// And attach it to the FBO so we can render to it
glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D, g_FBOImg, 0);
glFramebufferRenderbufferEXT( GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, GL_RENDERBUFFER_EXT, m_Depthbuffer );
GLenum renderTarget[] = {GL_COLOR_ATTACHMENT0_EXT};
glDrawBuffers( 1, renderTarget );
// Check status of FBO
if ( glCheckFramebufferStatusEXT(GL_FRAMEBUFFER_EXT) != GL_FRAMEBUFFER_COMPLETE_EXT )
{
std::cout << "Failed to initialise FBO" << std::endl;
exit( 1 );
}
// Unbind FBO
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);
}
This is then in my RenderScene()
// Bind FBO
glBindFramebufferEXT( GL_FRAMEBUFFER_EXT, g_FBO );
// Save viewport information and set to FBO's texture size
glPushAttrib( GL_VIEWPORT_BIT );
glViewport( 0, 0, g_WindowWidth, g_WindowHeight );
// Clear colour and depth buffer
glClearColor( ... );
glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
glLoadIdentity();
// SET UP SCENESCENE.. RENDERED TO FBO
// Restore previous viewport information & disable FBO
glPopAttrib();
glBindFramebufferEXT( GL_FRAMEBUFFER_EXT, 0 );
glClearColor( ... );
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity();
glDisable( GL_DEPTH_TEST );
ViewOrtho();
shader1->UseShader(); // Fragment shader to fullscreen quad
glBegin( GL_QUADS );
glColor4f(1.0f, 1.0f, 1.0f, 1.0f);
glTexCoord2f(0,1);
glVertex2f( 0, 0 );
glTexCoord2f(0,0);
glVertex2f( 0, g_WindowHeight );
glTexCoord2f(1,0);
glVertex2f( g_WindowWidth, g_WindowHeight );
glTexCoord2f(1,1);
glVertex2f( g_WindowWidth, 0 );
glEnd();
ViewPerspective();
glEnable(GL_DEPTH_TEST);
Basic fragment shader used to render to full screen quad
uniform sampler2D render;
void main(void)
{
gl_FragColor = texture2D( render, gl_TexCoord[0].xy);
}