The quad:
graphics->beginScene();
graphics->bindRenderTarget(target);
glBegin(GL_QUADS);
glColor4f(1.f, 0.f, 0.f, 1.f);
glVertex3f(0.f, 0.f, 0.f);
glColor4f(0.f, 1.f, 0.f, 1.f);
glVertex3f(16.f, 0.f, 0.f);
glColor4f(0.f, 0.f, 1.f, 1.f);
glVertex3f(0.f, 16.f, 0.f);
glColor4f(1.f, 1.f, 0.f, 1.f);
glVertex3f(16.f, 16.f, 0.f);
glEnd();
graphics->unbindRenderTarget();
graphics->drawRenderTarget(target);
graphics->endScene();
void GraphicsDevice::bindRenderTarget(RenderTarget *target) {
// Bind the frame buffer
glBindFramebuffer(GL_FRAMEBUFFER_EXT, target->getFramebuffer());
// store the glViewport and glEnable states
glPushAttrib(GL_VIEWPORT_BIT | GL_ENABLE_BIT);
glViewport(0, 0, target->getWidth(), target->getHeight());
glClearColor(1.f, 0.f, 0.f, 1.f);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glClearColor(0.f, 0.f, 0.f, 0.f);
glLoadIdentity();
}
void GraphicsDevice::unbindRenderTarget() {
// Restore glViewport and glEnable states
glPopAttrib();
glBindFramebuffer(GL_FRAMEBUFFER_EXT, 0);
}
void GraphicsDevice::drawRenderTarget(RenderTarget *target) {
glBindTexture(GL_TEXTURE_2D, target->getTexture());
glBegin(GL_QUADS);
glTexCoord2f(0.f, 0.f);
glVertex3f(0.f, 0.f, 0.f);
glTexCoord2f(1.f, 0.f);
glVertex3f(target->getWidth(), 0.f, 0.f);
glTexCoord2f(1.f, 1.f);
glVertex3f(target->getWidth(), target->getHeight(), 0.f);
glTexCoord2f(0.f, 1.f);
glVertex3f(0.f, target->getHeight(), 0.f);
glEnd();
glBindTexture(GL_TEXTURE_2D, 0);
}
RenderTarget::RenderTarget(GraphicsDevice *graphics, GLuint width, GLuint height) {
mWidth = width;
mHeight = height;
// First create the depth buffer
glGenRenderbuffers(1, &mDepth);
glBindRenderbuffer(GL_RENDERBUFFER_EXT, mDepth);
// Tell OpenGL that this renderbuffer is going to be a depth buffer
glRenderbufferStorage(GL_RENDERBUFFER_EXT, GL_DEPTH_COMPONENT, mWidth, mHeight);
glFramebufferRenderbuffer(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, GL_RENDERBUFFER_EXT, mDepth);
glBindRenderbuffer(GL_RENDERBUFFER_EXT, 0);
// Create the frame buffer texture
glGenTextures(1, &mTexture);
glBindTexture(GL_TEXTURE_2D, mTexture);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, mWidth, mHeight, 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);
glBindTexture(GL_TEXTURE_2D, 0);
// Create the frame buffer
glGenFramebuffers(1, &mFbo);
glBindFramebuffer(GL_FRAMEBUFFER_EXT, mFbo);
// Attach the texture
glFramebufferTexture2D(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D, mTexture, 0);
//Attach the depth buffer
glFramebufferRenderbuffer(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, GL_RENDERBUFFER_EXT, mFbo);
glBindFramebuffer(GL_FRAMEBUFFER_EXT, 0);
}