DeferredRenderer 1.0
|
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 }