DeferredRenderer 1.0

FrameBufferObject.cpp

Go to the documentation of this file.
00001 #include "FrameBufferObject.h"
00002 #include "ngl/Types.h"
00003 #include "iostream"
00004 
00005 FrameBufferObject::FrameBufferObject(unsigned int _width, unsigned int _height):
00006         m_width(_width),m_height(_height)
00007 {
00008 }
00009 
00010 FrameBufferObject::~FrameBufferObject()
00011 {}
00012 
00013 void FrameBufferObject::bind()
00014 {
00015     glBindFramebuffer(GL_FRAMEBUFFER_EXT, m_FBOid);
00016     glBindRenderbuffer(GL_RENDERBUFFER_EXT, m_RBid);
00017 
00018     glPushAttrib(GL_VIEWPORT_BIT | GL_DEPTH_BUFFER_BIT);
00019     glViewport(0, 0, m_width, m_height);
00020 
00021 }
00022 
00023 void FrameBufferObject::unbind()
00024 {
00025     glPopAttrib();
00026     glBindFramebuffer(GL_FRAMEBUFFER_EXT, 0);
00027     glBindRenderbuffer(GL_RENDERBUFFER_EXT, 0);
00028 }
00029 
00030 void FrameBufferObject::checkStatus()
00031 {
00032     GLenum status = glCheckFramebufferStatus(GL_FRAMEBUFFER);
00033 
00034     switch(status)
00035     {
00036     case GL_FRAMEBUFFER_COMPLETE:
00037         std::cout << "Complete FBO" << std::endl;
00038         break;
00039     case GL_FRAMEBUFFER_UNSUPPORTED:
00040         std::cout << "Unsupported FBO" << std::endl;
00041         break;
00042     case GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT:
00043         std::cout << "Incomplete Attatchments" << std::endl;
00044         break;
00045     case GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT:
00046         std::cout << "Missing attatchment" << std::endl;
00047         break;
00048     default:
00049         std::cout << "Weirdness afoot" << std::endl;
00050         break;
00051     }
00052 }
00053 
00054 void FrameBufferObject::bindTextureSlot(unsigned int _slot, GLuint _id)
00055 {
00056     glBindFramebuffer(GL_FRAMEBUFFER, m_FBOid);
00057     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0+_slot,GL_TEXTURE_2D, _id, 0);
00058 }
00059 
00060 void FrameBufferObject::bindDepthTexture( GLuint textureId )
00061 {
00062     glBindFramebuffer( GL_FRAMEBUFFER, m_FBOid);
00063     glFramebufferTexture2D( GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D, textureId, 0 );
00064 }
00065 
00066 void FrameBufferObject::create(GLuint _textureId){
00067     // create a renderbuffer object to store depth info
00068     glGenRenderbuffers(1, &m_RBid);
00069     glBindRenderbuffer(GL_RENDERBUFFER, m_RBid);
00070     glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT,
00071                              m_width, m_height);
00072     glBindRenderbuffer(GL_RENDERBUFFER, 0);
00073 
00074     // create a framebuffer object
00075     glGenFramebuffers(1, &m_FBOid);
00076     glBindFramebuffer(GL_FRAMEBUFFER, m_FBOid);
00077 
00078     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0,GL_TEXTURE_2D, _textureId, 0);
00079 
00080     // attach the renderbuffer to depth attachment point
00081     glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT,
00082                                  GL_RENDERBUFFER, m_RBid);
00083 
00084     checkStatus();
00085     glBindFramebuffer(GL_FRAMEBUFFER, 0);
00086     glBindRenderbuffer(GL_RENDERBUFFER, 0);
00087 }
00088 
00089 void FrameBufferObject::activateAllTargets()
00090 {
00091     GLenum buffers[] = {
00092         GL_COLOR_ATTACHMENT0,
00093         GL_COLOR_ATTACHMENT1,
00094         GL_COLOR_ATTACHMENT2,
00095         GL_COLOR_ATTACHMENT3
00096     };
00097 
00098     glDrawBuffers(4, buffers);
00099 }
00100 
00101 void FrameBufferObject::activateTarget(unsigned int _id)
00102 {
00103     glDrawBuffer(GL_COLOR_ATTACHMENT0 + _id);
00104 }
 All Classes Namespaces Files Functions Variables Enumerations Enumerator Defines