def __init__(self, **kwargs): super(HardwareFbo, self).__init__(**kwargs) self.framebuffer = None self.depthbuffer = None set_texture(self.texture) self.framebuffer = glGenFramebuffersEXT(1) glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, self.framebuffer) if self.framebuffer == 0: raise "Failed to initialize framebuffer" if self.with_depthbuffer: self.depthbuffer = glGenRenderbuffersEXT(1) glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, self.depthbuffer) glRenderbufferStorageEXT(GL_RENDERBUFFER_EXT, GL_DEPTH_COMPONENT, self.realsize[0], self.realsize[1]) glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, 0) glFramebufferRenderbufferEXT( GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, GL_RENDERBUFFER_EXT, self.depthbuffer ) glFramebufferTexture2DEXT( GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D, get_texture_id(self.texture), 0 ) # check the fbo status status = glCheckFramebufferStatusEXT(GL_FRAMEBUFFER_EXT) if status != GL_FRAMEBUFFER_COMPLETE_EXT: pymt.pymt_logger.error("Fbo: Error in framebuffer activation") pymt.pymt_logger.error( "Fbo: Details: HardwareFbo size=%s, realsize=%s, format=GL_RGBA" % (str(self.size), str(self.realsize)) ) if status in HardwareFbo.gl_fbo_errors: pymt.pymt_logger.error("Fbo: Details: %s (%d)" % (HardwareFbo.gl_fbo_errors[status], status)) else: pymt.pymt_logger.error("Fbo: Details: Unknown error (%d)" % status) pymt.pymt_logger.error("Fbo: ") pymt.pymt_logger.error("Fbo: You cannot use Hardware FBO.") pymt.pymt_logger.error("Fbo: Please change the configuration to use Software FBO.") pymt.pymt_logger.error("Fbo: You can use the pymt-config tools, or edit the configuration to set:") pymt.pymt_logger.error("Fbo: ") pymt.pymt_logger.error("Fbo: [graphics]") pymt.pymt_logger.error("Fbo: fbo = software") pymt.pymt_logger.error("Fbo: ") raise UnsupportedFboException() # unbind framebuffer glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0)
def __init__(self, **kwargs): super(HardwareFbo, self).__init__(**kwargs) self.framebuffer = None self.depthbuffer = None set_texture(self.texture) self.framebuffer = glGenFramebuffersEXT(1) glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, self.framebuffer) if self.framebuffer == 0: raise 'Failed to initialize framebuffer' if self.with_depthbuffer: self.depthbuffer = glGenRenderbuffersEXT(1) glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, self.depthbuffer) glRenderbufferStorageEXT(GL_RENDERBUFFER_EXT, GL_DEPTH_COMPONENT, self.realsize[0], self.realsize[1]) glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, 0) glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, GL_RENDERBUFFER_EXT, self.depthbuffer) glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D, get_texture_id(self.texture), 0) # check the fbo status status = glCheckFramebufferStatusEXT(GL_FRAMEBUFFER_EXT) if status != GL_FRAMEBUFFER_COMPLETE_EXT: pymt.pymt_logger.error('Fbo: Error in framebuffer activation') pymt.pymt_logger.error('Fbo: Details: HardwareFbo size=%s, realsize=%s, format=GL_RGBA' % ( str(self.size), str(self.realsize))) if status in HardwareFbo.gl_fbo_errors: pymt.pymt_logger.error('Fbo: Details: %s (%d)' % (HardwareFbo.gl_fbo_errors[status], status)) else: pymt.pymt_logger.error('Fbo: Details: Unknown error (%d)' % status) pymt.pymt_logger.error('Fbo: ') pymt.pymt_logger.error('Fbo: You cannot use Hardware FBO.') pymt.pymt_logger.error('Fbo: Please change the configuration to use Software FBO.') pymt.pymt_logger.error('Fbo: You can use the pymt-config tools, or edit the configuration to set:') pymt.pymt_logger.error('Fbo: ') pymt.pymt_logger.error('Fbo: [graphics]') pymt.pymt_logger.error('Fbo: fbo = software') pymt.pymt_logger.error('Fbo: ') raise UnsupportedFboException() # unbind framebuffer glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0)
def release(self): # Restore viewport if self.push_viewport: glPopAttrib() # Copy current buffer into fbo texture set_texture(self.texture, target=GL_TEXTURE_2D) glReadBuffer(GL_BACK) glCopyTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 0, 0, self.size[0], self.size[1]) # Restore old buffer w = pymt.getWindow() glDrawPixels(w.width, w.height, GL_RGBA, GL_UNSIGNED_BYTE, self.pixels) glPopAttrib() super(SoftwareFbo, self).release()