GLuint Fbo, DepthRenderBuffer, FboTexture;
void OnInit(){
//** Create FBO and depth-renderbuffer **
glGenFramebuffersEXT(1, &Fbo);
glGenRenderbuffersEXT(1, &DepthRenderBuffer);
glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, DepthRenderBuffer);
glRenderbufferStorageEXT(GL_RENDERBUFFER_EXT, GL_DEPTH_COMPONENT16, RenderWidth, RenderHeight);
//** Check for errors **
if(glCheckFramebufferStatusEXT(GL_FRAMEBUFFER_EXT) != GL_FRAMEBUFFER_COMPLETE_EXT) DoError("Error creating FBO");
//** Create rendertexture **
glGenTextures(1, &FboTexture);
glBindTexture(GL_TEXTURE_2D, FboTexture);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, RenderWidth, RenderHeight, 0, GL_RGB, GL_UNSIGNED_BYTE, 0);
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
//** Attach to FBO **
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, Fbo);
glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D, FboTexture, 0);
glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, GL_RENDERBUFFER_EXT, DepthRenderBuffer);
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);
}
void OnRender(){
//** Render to main depthbuffer **
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);
glViewport(0, 0, ScreenWidth, ScreenHeight);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
//** Draw to main buffers **
DrawScene(0);
//** Switch to FBO and clear it **
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, Fbo);
glViewport(0, 0, RenderWidth, RenderHeight);
glClear(GL_COLOR_BUFFER_BIT);
//** Copy data from main depthbuffer to FBO depthbuffer **
glBindFramebufferEXT(GL_READ_FRAMEBUFFER_EXT, 0);
glBindFramebufferEXT(GL_DRAW_FRAMEBUFFER_EXT, Fbo);
glBlitFramebufferEXT(0, 0, ScreenWidth, ScreenHeight, 0, 0, RenderWidth, RenderHeight, GL_DEPTH_BUFFER_BIT, GL_NEAREST);
glBindFramebufferEXT(GL_READ_FRAMEBUFFER_EXT, Fbo);
glBindFramebufferEXT(GL_DRAW_FRAMEBUFFER_EXT, Fbo);
//** Draw to FBO buffers (with depthinfo copied from main buffers) **
DrawScene(1);
//** Switch back to main buffers **
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);
glViewport(0, 0, ScreenWidth, ScreenHeight);
}
void OnDestroy(){
//** Cleanup **
glDeleteTextures(1, &FboTexture);
glDeleteFramebuffersEXT(1, &Fbo);
glDeleteRenderbuffersEXT(1, &DepthRenderBuffer);
}