def drawScene(frameBuffer, frameTexture): FB.glBindFramebufferEXT(FB.GL_FRAMEBUFFER_EXT, frameBuffer) GL.glClear(GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT) #GL.glPushAttrib(GL.GL_VIEWPORT_BIT); GL.glPushMatrix() #GL.glViewport(0,0,512,512); # GL.glClear(GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT); GL.glLoadIdentity() # Reset The Projection Matrix #GL.glDisable(GL.GL_DEPTH_TEST) # Enables Depth Testing GL.glBegin(GL.GL_POLYGON) # Start drawing a polygon GL.glColor3f(1.0, 0.0, 0.0) # Red GL.glVertex2f(-sqrSize * 0.5, sqrSize * 0.5) # Top left GL.glColor3f(1.0, 1.0, 1.0) # White GL.glVertex2f(sqrSize * 0.5, sqrSize * 0.5) # Top right GL.glColor3f(0.0, 1.0, 0.0) # Green GL.glVertex2f(sqrSize * 0.5, -sqrSize * 0.5) # Bottom Right GL.glColor3f(0.0, 0.0, 1.0) # Blue GL.glVertex2f(-sqrSize * 0.5, -sqrSize * 0.5) # Bottom Left GL.glEnd() GL.glColor3f(1.0, 1.0, 1.0) #GL.glPopAttrib() GL.glPopMatrix() FB.glBindFramebufferEXT(FB.GL_FRAMEBUFFER_EXT, 0)
def drawScene(frameBuffer, frameTexture): FB.glBindFramebufferEXT(FB.GL_FRAMEBUFFER_EXT, frameBuffer) GL.glClear(GL.GL_COLOR_BUFFER_BIT|GL.GL_DEPTH_BUFFER_BIT) #GL.glPushAttrib(GL.GL_VIEWPORT_BIT); GL.glPushMatrix() #GL.glViewport(0,0,512,512); # GL.glClear(GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT); GL.glLoadIdentity() # Reset The Projection Matrix #GL.glDisable(GL.GL_DEPTH_TEST) # Enables Depth Testing GL.glBegin(GL.GL_POLYGON) # Start drawing a polygon GL.glColor3f(1.0, 0.0, 0.0) # Red GL.glVertex2f(-sqrSize*0.5, sqrSize*0.5) # Top left GL.glColor3f(1.0, 1.0, 1.0) # White GL.glVertex2f(sqrSize*0.5, sqrSize*0.5) # Top right GL.glColor3f(0.0, 1.0, 0.0) # Green GL.glVertex2f(sqrSize*0.5, -sqrSize*0.5) # Bottom Right GL.glColor3f(0.0, 0.0, 1.0) # Blue GL.glVertex2f(-sqrSize*0.5, -sqrSize*0.5) # Bottom Left GL.glEnd() GL.glColor3f(1.0, 1.0, 1.0) #GL.glPopAttrib() GL.glPopMatrix() FB.glBindFramebufferEXT(FB.GL_FRAMEBUFFER_EXT, 0)
def bind(self): super(HardwareFbo, self).bind() HardwareFbo.fbo_stack.append(self.framebuffer) glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, self.framebuffer) if self.push_viewport: glPushAttrib(GL_VIEWPORT_BIT) glViewport(0, 0, self.size[0], self.size[1])
def bindAsRenderTarget(self): """Configures the frame buffer and render buffer of this ``RenderTexture`` as the targets for rendering. The existing farme buffer and render buffer are cached, and can be restored via the :meth:`unbindAsRenderTarget` method. """ if self.__oldFrameBuffer is not None: raise RuntimeError('RenderTexture FBO{} is already ' 'bound'.format(self.__frameBuffer)) self.__oldFrameBuffer = gl.glGetIntegerv( glfbo.GL_FRAMEBUFFER_BINDING_EXT) if self.__renderBuffer is not None: self.__oldRenderBuffer = gl.glGetIntegerv( glfbo.GL_RENDERBUFFER_BINDING_EXT) log.debug('Setting FBO{} as render target'.format(self.__frameBuffer)) glfbo.glBindFramebufferEXT(glfbo.GL_FRAMEBUFFER_EXT, self.__frameBuffer) if self.__renderBuffer is not None: glfbo.glBindRenderbufferEXT(glfbo.GL_RENDERBUFFER_EXT, self.__renderBuffer)
def flip(): global frameTexture if useFBO: FB.glBindFramebufferEXT(FB.GL_FRAMEBUFFER_EXT, 0) GL.glDisable(GL.GL_BLEND) #GL.glBlendEquation(GL.GL_FUNC_ADD) #GL.glBlendFunc(GL.GL_SRC_ALPHA, GL.GL_ONE_MINUS_SRC_ALPHA) #GL.glBlendFunc(GL.GL_SRC_ALPHA, GL.GL_DST_ALPHA) #before flipping need to copy the renderBuffer to the frameBuffer GL.glColor4f(1,1,1,1) GL.glActiveTexture(GL.GL_TEXTURE0) GL.glBindTexture(GL.GL_TEXTURE_2D, frameTexture) GL.glBegin( GL.GL_QUADS ) GL.glMultiTexCoord2f(GL.GL_TEXTURE0, 0.0, 0.0 ) GL.glVertex2f( -1.0,-1.0 ) GL.glMultiTexCoord2f(GL.GL_TEXTURE0, 0.0, 1.0 ) GL.glVertex2f( -1.0, 1.0 ) GL.glMultiTexCoord2f(GL.GL_TEXTURE0,1.0, 1.0 ) GL.glVertex2f( 1.0, 1.0 ) GL.glMultiTexCoord2f(GL.GL_TEXTURE0, 1.0, 0.0 ) GL.glVertex2f( 1.0, -1.0 ) GL.glEnd() pygame.display.flip() if useFBO: GL.glBindTexture(GL.GL_TEXTURE_2D, 0) GL.glDisable(GL.GL_TEXTURE_2D) GL.glEnable(GL.GL_BLEND) FB.glBindFramebufferEXT(FB.GL_FRAMEBUFFER_EXT, frameBuffer)
def _setupFrameBuffer(self): # Setup framebuffer self.frameBuffer = FB.glGenFramebuffersEXT(1) FB.glBindFramebufferEXT(FB.GL_FRAMEBUFFER_EXT, self.frameBuffer) # Setup depthbuffer self.depthBuffer = FB.glGenRenderbuffersEXT(1) FB.glBindRenderbufferEXT (FB.GL_RENDERBUFFER_EXT,self.depthBuffer) FB.glRenderbufferStorageEXT (FB.GL_RENDERBUFFER_EXT, GL.GL_DEPTH_COMPONENT, int(self.size[0]), int(self.size[1])) # Create texture to render to self.frameTexture = c_uint(0) GL.glGenTextures (1, self.frameTexture) GL.glBindTexture (GL.GL_TEXTURE_2D, self.frameTexture) GL.glTexParameteri (GL.GL_TEXTURE_2D, GL.GL_TEXTURE_MAG_FILTER, GL.GL_LINEAR) GL.glTexParameteri (GL.GL_TEXTURE_2D, GL.GL_TEXTURE_MIN_FILTER, GL.GL_LINEAR) GL.glTexImage2D (GL.GL_TEXTURE_2D, 0, GL.GL_RGBA32F_ARB, int(self.size[0]), int(self.size[1]), 0, GL.GL_RGBA, GL.GL_FLOAT, None) #attach texture to the frame buffer FB.glFramebufferTexture2DEXT (FB.GL_FRAMEBUFFER_EXT, GL.GL_COLOR_ATTACHMENT0_EXT, GL.GL_TEXTURE_2D, self.frameTexture, 0) FB.glFramebufferRenderbufferEXT(FB.GL_FRAMEBUFFER_EXT, GL.GL_DEPTH_ATTACHMENT_EXT, FB.GL_RENDERBUFFER_EXT, self.depthBuffer) status = FB.glCheckFramebufferStatusEXT (FB.GL_FRAMEBUFFER_EXT) if status != FB.GL_FRAMEBUFFER_COMPLETE_EXT: logging.warning("Error in framebuffer activation") return GL.glDisable(GL.GL_TEXTURE_2D)
def flip(): global frameTexture if useFBO: FB.glBindFramebufferEXT(FB.GL_FRAMEBUFFER_EXT, 0) GL.glDisable(GL.GL_BLEND) #GL.glBlendEquation(GL.GL_FUNC_ADD) #GL.glBlendFunc(GL.GL_SRC_ALPHA, GL.GL_ONE_MINUS_SRC_ALPHA) #GL.glBlendFunc(GL.GL_SRC_ALPHA, GL.GL_DST_ALPHA) #before flipping need to copy the renderBuffer to the frameBuffer GL.glColor4f(1, 1, 1, 1) GL.glActiveTexture(GL.GL_TEXTURE0) GL.glBindTexture(GL.GL_TEXTURE_2D, frameTexture) GL.glBegin(GL.GL_QUADS) GL.glMultiTexCoord2f(GL.GL_TEXTURE0, 0.0, 0.0) GL.glVertex2f(-1.0, -1.0) GL.glMultiTexCoord2f(GL.GL_TEXTURE0, 0.0, 1.0) GL.glVertex2f(-1.0, 1.0) GL.glMultiTexCoord2f(GL.GL_TEXTURE0, 1.0, 1.0) GL.glVertex2f(1.0, 1.0) GL.glMultiTexCoord2f(GL.GL_TEXTURE0, 1.0, 0.0) GL.glVertex2f(1.0, -1.0) GL.glEnd() pygame.display.flip() if useFBO: GL.glBindTexture(GL.GL_TEXTURE_2D, 0) GL.glDisable(GL.GL_TEXTURE_2D) GL.glEnable(GL.GL_BLEND) FB.glBindFramebufferEXT(FB.GL_FRAMEBUFFER_EXT, frameBuffer)
def save(display_func, filename="screenshot.png"): """ """ try: import OpenGL.GL.EXT.framebuffer_object as fbo except ImportError: print 'You do not have the framebuffer extension on your video card' print 'Cannot save figure' return x, y, w, h = gl.glGetIntegerv(gl.GL_VIEWPORT) # Setup framebuffer framebuffer = fbo.glGenFramebuffersEXT(1) fbo.glBindFramebufferEXT(fbo.GL_FRAMEBUFFER_EXT, framebuffer) # Setup depthbuffer depthbuffer = fbo.glGenRenderbuffersEXT(1) fbo.glBindRenderbufferEXT(fbo.GL_RENDERBUFFER_EXT, depthbuffer) fbo.glRenderbufferStorageEXT(fbo.GL_RENDERBUFFER_EXT, gl.GL_DEPTH_COMPONENT, w, h) # Create texture to render to data = np.zeros((w, h, 4), dtype=np.ubyte) texture = gl.glGenTextures(1) gl.glBindTexture(gl.GL_TEXTURE_2D, texture) gl.glTexParameteri(gl.GL_TEXTURE_2D, gl.GL_TEXTURE_MAG_FILTER, gl.GL_LINEAR) gl.glTexParameteri(gl.GL_TEXTURE_2D, gl.GL_TEXTURE_MIN_FILTER, gl.GL_LINEAR) gl.glTexImage2D(gl.GL_TEXTURE_2D, 0, gl.GL_RGBA, w, h, 0, gl.GL_RGBA, gl.GL_UNSIGNED_BYTE, data) fbo.glFramebufferTexture2DEXT(gl.GL_FRAMEBUFFER_EXT, gl.GL_COLOR_ATTACHMENT0_EXT, gl.GL_TEXTURE_2D, texture, 0) fbo.glFramebufferRenderbufferEXT(gl.GL_FRAMEBUFFER_EXT, gl.GL_DEPTH_ATTACHMENT_EXT, gl.GL_RENDERBUFFER_EXT, depthbuffer) status = fbo.glCheckFramebufferStatusEXT(fbo.GL_FRAMEBUFFER_EXT) if status != fbo.GL_FRAMEBUFFER_COMPLETE_EXT: raise (RuntimeError, 'Error in framebuffer activation') display_func() glut.glutSwapBuffers() data = gl.glReadPixels(x, y, w, h, gl.GL_RGBA, gl.GL_UNSIGNED_BYTE) from PIL import Image image = Image.fromstring('RGBA', (w, h), data) image = image.transpose(Image.FLIP_TOP_BOTTOM) image.save(filename) # Cleanup fbo.glBindRenderbufferEXT(fbo.GL_RENDERBUFFER_EXT, 0) fbo.glBindFramebufferEXT(fbo.GL_FRAMEBUFFER_EXT, 0) gl.glDeleteTextures(texture) fbo.glDeleteFramebuffersEXT([ framebuffer, ])
def save(display_func, filename="screenshot.png"): """ """ try: import OpenGL.GL.EXT.framebuffer_object as fbo except ImportError: print 'You do not have the framebuffer extension on your video card' print 'Cannot save figure' return x,y,w,h = gl.glGetIntegerv(gl.GL_VIEWPORT) # Setup framebuffer framebuffer = fbo.glGenFramebuffersEXT(1) fbo.glBindFramebufferEXT( fbo.GL_FRAMEBUFFER_EXT, framebuffer) # Setup depthbuffer depthbuffer = fbo.glGenRenderbuffersEXT( 1 ) fbo.glBindRenderbufferEXT( fbo.GL_RENDERBUFFER_EXT, depthbuffer ) fbo.glRenderbufferStorageEXT( fbo.GL_RENDERBUFFER_EXT, gl.GL_DEPTH_COMPONENT, w, h) # Create texture to render to data = np.zeros((w,h,4), dtype=np.ubyte) texture = gl.glGenTextures(1) gl.glBindTexture( gl.GL_TEXTURE_2D, texture) gl.glTexParameteri( gl.GL_TEXTURE_2D, gl.GL_TEXTURE_MAG_FILTER, gl.GL_LINEAR) gl.glTexParameteri( gl.GL_TEXTURE_2D, gl.GL_TEXTURE_MIN_FILTER, gl.GL_LINEAR) gl.glTexImage2D( gl.GL_TEXTURE_2D, 0, gl.GL_RGBA, w, h, 0, gl.GL_RGBA, gl.GL_UNSIGNED_BYTE, data) fbo.glFramebufferTexture2DEXT( gl.GL_FRAMEBUFFER_EXT, gl.GL_COLOR_ATTACHMENT0_EXT, gl.GL_TEXTURE_2D, texture, 0) fbo.glFramebufferRenderbufferEXT( gl.GL_FRAMEBUFFER_EXT, gl.GL_DEPTH_ATTACHMENT_EXT, gl.GL_RENDERBUFFER_EXT, depthbuffer) status = fbo.glCheckFramebufferStatusEXT( fbo.GL_FRAMEBUFFER_EXT ) if status != fbo.GL_FRAMEBUFFER_COMPLETE_EXT: raise(RuntimeError, 'Error in framebuffer activation') display_func() glut.glutSwapBuffers() data = gl.glReadPixels (x,y,w,h, gl.GL_RGB, gl.GL_UNSIGNED_BYTE) from PIL import Image #from PIL.ImageCms import profileToProfile #ADOBE_RGB_PROFILE = "AdobeRGB1998.icc" #SRGB_PROFILE = "./sRGB.icc" #RGB_PROFILE = "./RGB.icc" image = Image.fromstring('RGB', (w,h), data) #profileToProfile(image, RGB_PROFILE, ADOBE_RGB_PROFILE, inPlace=1) image = image.transpose(Image.FLIP_TOP_BOTTOM) image.save (filename) # Cleanup fbo.glBindRenderbufferEXT( fbo.GL_RENDERBUFFER_EXT, 0 ) fbo.glBindFramebufferEXT( fbo.GL_FRAMEBUFFER_EXT, 0 ) gl.glDeleteTextures( texture ) fbo.glDeleteFramebuffersEXT( [framebuffer,] )
def save(self, filename): ''' ''' try: import OpenGL.GL.EXT.framebuffer_object as fbo except ImportError: print 'You do not have the framebuffer extension on your video card' print 'Cannot save figure' return w,h = self.window.width, self.window.height # Setup framebuffer framebuffer = fbo.glGenFramebuffersEXT(1) fbo.glBindFramebufferEXT( fbo.GL_FRAMEBUFFER_EXT, framebuffer) # Setup depthbuffer depthbuffer = fbo.glGenRenderbuffersEXT( 1 ) fbo.glBindRenderbufferEXT( fbo.GL_RENDERBUFFER_EXT, depthbuffer ) fbo.glRenderbufferStorageEXT( fbo.GL_RENDERBUFFER_EXT, gl.GL_DEPTH_COMPONENT, w, h) # Create texture to render to data = np.zeros((w,h,4), dtype=np.ubyte) texture = gl.glGenTextures(1) gl.glBindTexture( gl.GL_TEXTURE_2D, texture) gl.glTexParameteri( gl.GL_TEXTURE_2D, gl.GL_TEXTURE_MAG_FILTER, gl.GL_LINEAR) gl.glTexParameteri( gl.GL_TEXTURE_2D, gl.GL_TEXTURE_MIN_FILTER, gl.GL_LINEAR) gl.glTexImage2D( gl.GL_TEXTURE_2D, 0, gl.GL_RGBA, w, h, 0, gl.GL_RGBA, gl.GL_UNSIGNED_BYTE, data) fbo.glFramebufferTexture2DEXT( gl.GL_FRAMEBUFFER_EXT, gl.GL_COLOR_ATTACHMENT0_EXT, gl.GL_TEXTURE_2D, texture, 0) fbo.glFramebufferRenderbufferEXT( gl.GL_FRAMEBUFFER_EXT, gl.GL_DEPTH_ATTACHMENT_EXT, gl.GL_RENDERBUFFER_EXT, depthbuffer) status = fbo.glCheckFramebufferStatusEXT( fbo.GL_FRAMEBUFFER_EXT ) if status != fbo.GL_FRAMEBUFFER_COMPLETE_EXT: raise(RuntimeError, 'Error in framebuffer activation') self.redraw() self.window.refresh() x,y,w,h = self.viewport data = gl.glReadPixels (x,y,w, h, gl.GL_RGBA, gl.GL_UNSIGNED_BYTE) from PIL import Image image = Image.fromstring('RGBA', (w,h), data) image = image.transpose(Image.FLIP_TOP_BOTTOM) image.save (filename) # Cleanup fbo.glBindRenderbufferEXT( fbo.GL_RENDERBUFFER_EXT, 0 ) fbo.glBindFramebufferEXT( fbo.GL_FRAMEBUFFER_EXT, 0 ) gl.glDeleteTextures( texture ) fbo.glDeleteFramebuffersEXT( [framebuffer,] )
def createFBO(size=None): """ Offscreen rendering Save an offscreen rendering of size (w,h) to filename. """ def round2(n): """ Get nearest power of two superior to n """ f = 1 while f < n: f *= 2 return f if size == None: size = (512, 512) w = round2(size[0]) h = round2(size[1]) # Setup framebuffer frameBuffer = FB.glGenFramebuffersEXT(1) FB.glBindFramebufferEXT(FB.GL_FRAMEBUFFER_EXT, frameBuffer) # Setup depthbuffer depthBuffer = FB.glGenRenderbuffersEXT(1) FB.glBindRenderbufferEXT(FB.GL_RENDERBUFFER_EXT, depthBuffer) FB.glRenderbufferStorageEXT(FB.GL_RENDERBUFFER_EXT, GL.GL_DEPTH_COMPONENT, w, h) # Create texture to render to texture = GL.glGenTextures(1) GL.glBindTexture(GL.GL_TEXTURE_2D, texture) GL.glTexParameteri(GL.GL_TEXTURE_2D, GL.GL_TEXTURE_MAG_FILTER, GL.GL_LINEAR) GL.glTexParameteri(GL.GL_TEXTURE_2D, GL.GL_TEXTURE_MIN_FILTER, GL.GL_LINEAR) GL.glTexImage2D(GL.GL_TEXTURE_2D, 0, GL.GL_RGBA32F_ARB, w, h, 0, GL.GL_RGBA, GL.GL_FLOAT, None) #attach texture to the frame buffer FB.glFramebufferTexture2DEXT(FB.GL_FRAMEBUFFER_EXT, GL.GL_COLOR_ATTACHMENT0_EXT, GL.GL_TEXTURE_2D, texture, 0) FB.glFramebufferRenderbufferEXT(FB.GL_FRAMEBUFFER_EXT, GL.GL_DEPTH_ATTACHMENT_EXT, FB.GL_RENDERBUFFER_EXT, depthBuffer) status = FB.glCheckFramebufferStatusEXT(FB.GL_FRAMEBUFFER_EXT) if status != FB.GL_FRAMEBUFFER_COMPLETE_EXT: print "Error in framebuffer activation" return GL.glDisable(GL.GL_TEXTURE_2D) return frameBuffer, texture, depthBuffer
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 createFBO(size=None): """ Offscreen rendering Save an offscreen rendering of size (w,h) to filename. """ def round2 (n): """ Get nearest power of two superior to n """ f = 1 while f<n: f*= 2 return f if size == None: size = (512,512) w = round2 (size[0]) h = round2 (size[1]) # Setup framebuffer frameBuffer = FB.glGenFramebuffersEXT(1) FB.glBindFramebufferEXT(FB.GL_FRAMEBUFFER_EXT, frameBuffer) # Setup depthbuffer depthBuffer = FB.glGenRenderbuffersEXT(1) FB.glBindRenderbufferEXT (FB.GL_RENDERBUFFER_EXT,depthBuffer) FB.glRenderbufferStorageEXT (FB.GL_RENDERBUFFER_EXT, GL.GL_DEPTH_COMPONENT, w, h) # Create texture to render to texture = GL.glGenTextures (1) GL.glBindTexture (GL.GL_TEXTURE_2D, texture) GL.glTexParameteri (GL.GL_TEXTURE_2D, GL.GL_TEXTURE_MAG_FILTER, GL.GL_LINEAR) GL.glTexParameteri (GL.GL_TEXTURE_2D, GL.GL_TEXTURE_MIN_FILTER, GL.GL_LINEAR) GL.glTexImage2D (GL.GL_TEXTURE_2D, 0, GL.GL_RGBA32F_ARB, w, h, 0, GL.GL_RGBA, GL.GL_FLOAT, None) #attach texture to the frame buffer FB.glFramebufferTexture2DEXT (FB.GL_FRAMEBUFFER_EXT, GL.GL_COLOR_ATTACHMENT0_EXT, GL.GL_TEXTURE_2D, texture, 0); FB.glFramebufferRenderbufferEXT(FB.GL_FRAMEBUFFER_EXT, GL.GL_DEPTH_ATTACHMENT_EXT, FB.GL_RENDERBUFFER_EXT, depthBuffer); status = FB.glCheckFramebufferStatusEXT (FB.GL_FRAMEBUFFER_EXT); if status != FB.GL_FRAMEBUFFER_COMPLETE_EXT: print "Error in framebuffer activation" return GL.glDisable(GL.GL_TEXTURE_2D); return frameBuffer, texture, depthBuffer
def flip(): global frameTexture FB.glBindFramebufferEXT(FB.GL_FRAMEBUFFER_EXT, 0) #before flipping need to copy the renderBuffer to the frameBuffer GL.glEnable(GL.GL_TEXTURE_2D) GL.glBindTexture(GL.GL_TEXTURE_2D, frameTexture) GL.glBegin( GL.GL_QUADS ) GL.glTexCoord2f( 0.0, 0.0 ) ; GL.glVertex2f( -1.0,-1.0 ) GL.glTexCoord2f( 0.0, 1.0 ) ; GL.glVertex2f( -1.0, 1.0 ) GL.glTexCoord2f( 1.0, 1.0 ) ; GL.glVertex2f( 1.0, 1.0 ) GL.glTexCoord2f( 1.0, 0.0 ) ; GL.glVertex2f( 1.0, -1.0 ) GL.glEnd() # GL.glBindTexture(GL.GL_TEXTURE_2D, 0) pygame.display.flip() GL.glDisable(GL.GL_TEXTURE_2D); FB.glBindFramebufferEXT(FB.GL_FRAMEBUFFER_EXT, frameBuffer)
def createFBO(size): """ Offscreen rendering """ w = size[0] h = size[1] # Setup framebuffer frameBuffer = FB.glGenFramebuffersEXT(1) FB.glBindFramebufferEXT(FB.GL_FRAMEBUFFER_EXT, frameBuffer) # Setup depthbuffer depthBuffer = FB.glGenRenderbuffersEXT(1) FB.glBindRenderbufferEXT(FB.GL_RENDERBUFFER_EXT, depthBuffer) FB.glRenderbufferStorageEXT(FB.GL_RENDERBUFFER_EXT, GL.GL_DEPTH_COMPONENT, w, h) # Create texture to render to GL.glEnable(GL.GL_TEXTURE_2D) texture = GL.glGenTextures(1) GL.glBindTexture(GL.GL_TEXTURE_2D, texture) GL.glTexParameteri(GL.GL_TEXTURE_2D, GL.GL_TEXTURE_MAG_FILTER, GL.GL_LINEAR) GL.glTexParameteri(GL.GL_TEXTURE_2D, GL.GL_TEXTURE_MIN_FILTER, GL.GL_LINEAR) GL.glTexImage2D(GL.GL_TEXTURE_2D, 0, GL.GL_RGBA32F_ARB, w, h, 0, GL.GL_RGBA, GL.GL_FLOAT, None) #attach texture to the frame buffer FB.glFramebufferTexture2DEXT(FB.GL_FRAMEBUFFER_EXT, GL.GL_COLOR_ATTACHMENT0_EXT, GL.GL_TEXTURE_2D, texture, 0) FB.glFramebufferRenderbufferEXT(FB.GL_FRAMEBUFFER_EXT, GL.GL_DEPTH_ATTACHMENT_EXT, FB.GL_RENDERBUFFER_EXT, depthBuffer) status = FB.glCheckFramebufferStatusEXT(FB.GL_FRAMEBUFFER_EXT) if status != FB.GL_FRAMEBUFFER_COMPLETE_EXT: print "Error in framebuffer activation" return GL.glBindTexture(GL.GL_TEXTURE_2D, 0) #unbind that name to the target GL.glDisable(GL.GL_TEXTURE_2D) return frameBuffer, texture, depthBuffer
def unbindAsRenderTarget(self): """Restores the frame buffer and render buffer which were saved via a prior call to :meth:`bindAsRenderTarget`. """ if self.__oldFrameBuffer is None: raise RuntimeError('RenderTexture FBO{} has not been ' 'bound'.format(self.__frameBuffer)) log.debug('Restoring render target to FBO%s (from FBO%s)', self.__oldFrameBuffer, self.__frameBuffer) glfbo.glBindFramebufferEXT(glfbo.GL_FRAMEBUFFER_EXT, self.__oldFrameBuffer) if self.__renderBuffer is not None: glfbo.glBindRenderbufferEXT(glfbo.GL_RENDERBUFFER_EXT, self.__oldRenderBuffer) self.__oldFrameBuffer = None self.__oldRenderBuffer = None
def __init__(self, width, height, drawFunc): tex = GL.glGenTextures(1) GL.glBindTexture(GL.GL_TEXTURE_2D, tex) GL.glTexParameter(GL.GL_TEXTURE_2D, GL.GL_TEXTURE_MIN_FILTER, GL.GL_NEAREST) GL.glTexParameter(GL.GL_TEXTURE_2D, GL.GL_TEXTURE_MAG_FILTER, GL.GL_NEAREST) GL.glTexImage2D(GL.GL_TEXTURE_2D, 0, GL.GL_RGBA8, width, height, 0, GL.GL_RGBA, GL.GL_UNSIGNED_BYTE, None) self.enabled = False self._texID = tex if FBO.glGenFramebuffersEXT: buf = FBO.glGenFramebuffersEXT(1) FBO.glBindFramebufferEXT(FBO.GL_FRAMEBUFFER_EXT, buf) depthbuffer = FBO.glGenRenderbuffersEXT(1) FBO.glBindRenderbufferEXT(FBO.GL_RENDERBUFFER_EXT, depthbuffer) FBO.glRenderbufferStorageEXT(FBO.GL_RENDERBUFFER_EXT, GL.GL_DEPTH_COMPONENT, width, height) FBO.glFramebufferRenderbufferEXT(FBO.GL_FRAMEBUFFER_EXT, FBO.GL_DEPTH_ATTACHMENT_EXT, FBO.GL_RENDERBUFFER_EXT, depthbuffer) FBO.glFramebufferTexture2DEXT(FBO.GL_FRAMEBUFFER_EXT, FBO.GL_COLOR_ATTACHMENT0_EXT, GL.GL_TEXTURE_2D, tex, 0) status = FBO.glCheckFramebufferStatusEXT(FBO.GL_FRAMEBUFFER_EXT) if status != FBO.GL_FRAMEBUFFER_COMPLETE_EXT: print "glCheckFramebufferStatusEXT", status self.enabled = False return FBO.glBindFramebufferEXT(FBO.GL_FRAMEBUFFER_EXT, buf) GL.glPushAttrib(GL.GL_VIEWPORT_BIT) GL.glViewport(0, 0, width, height) drawFunc() GL.glPopAttrib() FBO.glBindFramebufferEXT(FBO.GL_FRAMEBUFFER_EXT, 0) FBO.glDeleteFramebuffersEXT(1, [buf]) FBO.glDeleteRenderbuffersEXT(1, [depthbuffer]) self.enabled = True
def flip(): global frameTexture FB.glBindFramebufferEXT(FB.GL_FRAMEBUFFER_EXT, 0) #before flipping need to copy the renderBuffer to the frameBuffer GL.glEnable(GL.GL_TEXTURE_2D) GL.glBindTexture(GL.GL_TEXTURE_2D, frameTexture) GL.glBegin(GL.GL_QUADS) GL.glTexCoord2f(0.0, 0.0) GL.glVertex2f(-1.0, -1.0) GL.glTexCoord2f(0.0, 1.0) GL.glVertex2f(-1.0, 1.0) GL.glTexCoord2f(1.0, 1.0) GL.glVertex2f(1.0, 1.0) GL.glTexCoord2f(1.0, 0.0) GL.glVertex2f(1.0, -1.0) GL.glEnd() # GL.glBindTexture(GL.GL_TEXTURE_2D, 0) pygame.display.flip() GL.glDisable(GL.GL_TEXTURE_2D) FB.glBindFramebufferEXT(FB.GL_FRAMEBUFFER_EXT, frameBuffer)
def __init__(self, width, height, drawFunc): tex = GL.glGenTextures(1) GL.glBindTexture(GL.GL_TEXTURE_2D, tex) GL.glTexParameter(GL.GL_TEXTURE_2D, GL.GL_TEXTURE_MIN_FILTER, GL.GL_NEAREST) GL.glTexParameter(GL.GL_TEXTURE_2D, GL.GL_TEXTURE_MAG_FILTER, GL.GL_NEAREST) GL.glTexImage2D(GL.GL_TEXTURE_2D, 0, GL.GL_RGBA8, width, height, 0, GL.GL_RGBA, GL.GL_UNSIGNED_BYTE, None) self.enabled = False self._texID = tex if bool(FBO.glGenFramebuffersEXT): buf = FBO.glGenFramebuffersEXT(1) depthbuffer = FBO.glGenRenderbuffersEXT(1) FBO.glBindFramebufferEXT(FBO.GL_FRAMEBUFFER_EXT, buf) FBO.glBindRenderbufferEXT(FBO.GL_RENDERBUFFER_EXT, depthbuffer) FBO.glRenderbufferStorageEXT(FBO.GL_RENDERBUFFER_EXT, GL.GL_DEPTH_COMPONENT, width, height) FBO.glFramebufferRenderbufferEXT(FBO.GL_FRAMEBUFFER_EXT, FBO.GL_DEPTH_ATTACHMENT_EXT, FBO.GL_RENDERBUFFER_EXT, depthbuffer) FBO.glFramebufferTexture2DEXT(FBO.GL_FRAMEBUFFER_EXT, FBO.GL_COLOR_ATTACHMENT0_EXT, GL.GL_TEXTURE_2D, tex, 0) status = FBO.glCheckFramebufferStatusEXT(FBO.GL_FRAMEBUFFER_EXT) if status != FBO.GL_FRAMEBUFFER_COMPLETE_EXT: print "glCheckFramebufferStatusEXT", status self.enabled = False return FBO.glBindFramebufferEXT(FBO.GL_FRAMEBUFFER_EXT, buf) with gl.glPushAttrib(GL.GL_VIEWPORT_BIT): GL.glViewport(0, 0, width, height) drawFunc() FBO.glBindFramebufferEXT(FBO.GL_FRAMEBUFFER_EXT, 0) FBO.glDeleteFramebuffersEXT(1, [buf]) FBO.glDeleteRenderbuffersEXT(1, [depthbuffer]) self.enabled = True else: GL.glReadBuffer(GL.GL_BACK) if bool(window_pos.glWindowPos2dARB): pixels = GL.glReadPixels(0, 0, width, height, GL.GL_RGBA, GL.GL_UNSIGNED_BYTE) GL.glPushAttrib(GL.GL_VIEWPORT_BIT | GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT | GL.GL_STENCIL_TEST | GL.GL_STENCIL_BUFFER_BIT) GL.glDisable(GL.GL_STENCIL_TEST) GL.glViewport(0, 0, width, height) GL.glScissor(0, 0, width, height) with gl.glEnable(GL.GL_SCISSOR_TEST): drawFunc() GL.glBindTexture(GL.GL_TEXTURE_2D, tex) GL.glReadBuffer(GL.GL_BACK) GL.glCopyTexSubImage2D(GL.GL_TEXTURE_2D, 0, 0, 0, 0, 0, width, height) if bool(window_pos.glWindowPos2dARB): window_pos.glWindowPos2dARB(0,0) GL.glDrawPixels(width, height, GL.GL_RGBA, GL.GL_UNSIGNED_BYTE, pixels) GL.glPopAttrib()
def createFBO(size): """ Offscreen rendering """ w = size[0] h = size[1] # Setup framebuffer frameBuffer = FB.glGenFramebuffersEXT(1) FB.glBindFramebufferEXT(FB.GL_FRAMEBUFFER_EXT, frameBuffer) # Setup depthbuffer depthBuffer = FB.glGenRenderbuffersEXT(1) FB.glBindRenderbufferEXT (FB.GL_RENDERBUFFER_EXT,depthBuffer) FB.glRenderbufferStorageEXT (FB.GL_RENDERBUFFER_EXT, GL.GL_DEPTH_COMPONENT, w, h) # Create texture to render to GL.glEnable(GL.GL_TEXTURE_2D) texture = GL.glGenTextures (1) GL.glBindTexture (GL.GL_TEXTURE_2D, texture) GL.glTexParameteri (GL.GL_TEXTURE_2D, GL.GL_TEXTURE_MAG_FILTER, GL.GL_LINEAR) GL.glTexParameteri (GL.GL_TEXTURE_2D, GL.GL_TEXTURE_MIN_FILTER, GL.GL_LINEAR) GL.glTexImage2D (GL.GL_TEXTURE_2D, 0, GL.GL_RGBA32F_ARB, w, h, 0, GL.GL_RGBA, GL.GL_FLOAT, None) #attach texture to the frame buffer FB.glFramebufferTexture2DEXT (FB.GL_FRAMEBUFFER_EXT, GL.GL_COLOR_ATTACHMENT0_EXT, GL.GL_TEXTURE_2D, texture, 0); FB.glFramebufferRenderbufferEXT(FB.GL_FRAMEBUFFER_EXT, GL.GL_DEPTH_ATTACHMENT_EXT, FB.GL_RENDERBUFFER_EXT, depthBuffer); status = FB.glCheckFramebufferStatusEXT (FB.GL_FRAMEBUFFER_EXT); if status != FB.GL_FRAMEBUFFER_COMPLETE_EXT: print "Error in framebuffer activation" return GL.glBindTexture(GL.GL_TEXTURE_2D, 0)#unbind that name to the target GL.glDisable(GL.GL_TEXTURE_2D) return frameBuffer, texture, depthBuffer
def main(path=None): glutInit(sys.argv) if sys.platform == 'darwin': if not path: path = dialog() if not path: sys.exit(0) glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE) glutInitWindowPosition(0, 0) glutInitWindowSize(730, 650) win = glutCreateWindow(b'MIDI Player') (width, height, img) = read_image('mixer.ppm') glPixelStorei(GL_UNPACK_ALIGNMENT, 1) rbo = c_uint(int(glGenRenderbuffersEXT(1))) glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, rbo) glRenderbufferStorageEXT(GL_RENDERBUFFER_EXT, GL_RGB, width, height) fbo = c_uint(int(glGenFramebuffersEXT(1))) glBindFramebufferEXT(GL_READ_FRAMEBUFFER_EXT, fbo) glFramebufferRenderbufferEXT(GL_READ_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_RENDERBUFFER_EXT, rbo) glBindFramebufferEXT(GL_DRAW_FRAMEBUFFER_EXT, fbo) glClear(GL_COLOR_BUFFER_BIT) glDrawPixels(width, height, GL_RGB, GL_UNSIGNED_BYTE, img) glBindFramebufferEXT(GL_DRAW_FRAMEBUFFER_EXT, 0) player = Player(win, path, width, height) glutDisplayFunc(player.display_func) glutKeyboardFunc(player.keyboard_func) glutMouseFunc(player.mouse_func) glutMotionFunc(player.motion_func) glutIdleFunc(player.process_events) submenus = [] for instrument in range(128): if instrument % 8 == 0: submenus.append([families[instrument // 8], glutCreateMenu(player.change_instrument)]) glutAddMenuEntry(instruments[instrument].encode('ascii'), instrument) glutCreateMenu(player.change_instrument) for family, submenu in submenus: glutAddSubMenu(family.encode('ascii'), submenu) glutAttachMenu(GLUT_RIGHT_BUTTON) glutMainLoop()
def flip(self, clearBuffer=True): """Flip the front and back buffers after drawing everything for your frame. (This replaces the win.update() method, better reflecting what is happening underneath). win.flip(clearBuffer=True)#results in a clear screen after flipping win.flip(clearBuffer=False)#the screen is not cleared (so represent the previous screen) """ for thisStim in self._toDraw: thisStim.draw() if haveFB: #need blit the frambuffer object to the actual back buffer FB.glBindFramebufferEXT(FB.GL_FRAMEBUFFER_EXT, 0)#unbind the framebuffer as the render target #before flipping need to copy the renderBuffer to the frameBuffer ''' GL.glActiveTexture(GL.GL_TEXTURE0) GL.glEnable(GL.GL_TEXTURE_2D) GL.glBindTexture(GL.GL_TEXTURE_2D, self.frameTexture) GL.glBegin( GL.GL_QUADS ) GL.glTexCoord2f( 0.0, 0.0 ) ; GL.glVertex2f( -1.0,-1.0 ) GL.glTexCoord2f( 0.0, 1.0 ) ; GL.glVertex2f( -1.0,1.0 ) GL.glTexCoord2f( 1.0, 1.0 ) ; GL.glVertex2f( 1.0,1.0 ) GL.glTexCoord2f( 1.0, 0.0 ) ; GL.glVertex2f( 1.0,-1.0 ) GL.glEnd() ''' GL.glActiveTexture(GL.GL_TEXTURE0) GL.glEnable(GL.GL_TEXTURE_2D) GL.glBindTexture(GL.GL_TEXTURE_2D, self.frameTexture) GL.glBegin( GL.GL_QUADS ) GL.glTexCoord2f( 0.0, 0.0 ) ; GL.glVertex3f( -1.0,-1.0, 0.0 ) GL.glTexCoord2f( 0.0, 1.0 ) ; GL.glVertex3f( -1.0,1.0, 0.0 ) GL.glTexCoord2f( 1.0, 1.0 ) ; GL.glVertex3f( 1.0,1.0, 0.0 ) GL.glTexCoord2f( 1.0, 0.0 ) ; GL.glVertex3f( 1.0,-1.0, 0.0 ) GL.glEnd() if self.winType =="pyglet": #make sure this is current context self.winHandle.switch_to() GL.glTranslatef(0.0,0.0,-5.0) for dispatcher in self._eventDispatchers: dispatcher._dispatch_events() self.winHandle.dispatch_events()#this might need to be done even more often than once per frame? #pyglet.media.dispatch_events()#for sounds to be processed self.winHandle.flip() #self.winHandle.clear() GL.glLoadIdentity() #rescale/reposition view of the window if self.viewScale != None: GL.glMatrixMode(GL.GL_PROJECTION) GL.glLoadIdentity() GL.glOrtho(-1,1,-1,1,-1,1) GL.glScalef(self.viewScale[0], self.viewScale[1], 1) if self.viewPos != None: GL.glMatrixMode(GL.GL_MODELVIEW) # GL.glLoadIdentity() if self.viewScale==None: scale=[1,1] else: scale=self.viewScale norm_rf_pos_x = self.viewPos[0]/scale[0] norm_rf_pos_y = self.viewPos[1]/scale[1] GL.glTranslatef( norm_rf_pos_x, norm_rf_pos_y, 0.0) if self.viewOri != None: GL.glRotatef( self.viewOri, 0.0, 0.0, 0.0) if haveFB: #set rendering back to the framebuffer object FB.glBindFramebufferEXT(FB.GL_FRAMEBUFFER_EXT, self.frameBuffer) #reset returned buffer for next frame if clearBuffer: GL.glClear(GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT) else: GL.glClear(GL.GL_DEPTH_BUFFER_BIT)#always clear the depth bit self._defDepth=0.0#gets gradually updated through frame #waitBlanking if self.waitBlanking: GL.glBegin(GL.GL_POINTS) GL.glColor4f(0,0,0,0) if sys.platform=='win32' and self.glVendor.startswith('ati'): pass else: GL.glVertex2i(10,10)#this corrupts text rendering on win with some ATI cards :-( GL.glEnd() GL.glFlush() #get timestamp now = logging.defaultClock.getTime() if self.recordFrameIntervals: self.frames +=1 deltaT = now - self.lastFrameT self.lastFrameT=now if self.recordFrameIntervalsJustTurnedOn: #don't do anything self.recordFrameIntervalsJustTurnedOn = False else: #past the first frame since turned on self.frameIntervals.append(deltaT) if deltaT > self._refreshThreshold: self.nDroppedFrames+=1 if self.nDroppedFrames<reportNDroppedFrames: logging.warning('t of last frame was %.2fms (=1/%i)' %(deltaT*1000, 1/deltaT), t=now) elif self.nDroppedFrames==reportNDroppedFrames: logging.warning("Multiple dropped frames have occurred - I'll stop bothering you about them!") #log events for logEntry in self._toLog: #{'msg':msg,'level':level,'obj':copy.copy(obj)} logging.log(msg=logEntry['msg'], level=logEntry['level'], t=now, obj=logEntry['obj']) self._toLog = [] # If self.waitBlanking is True, then return the time that # GL.glFinish() returned, set as the 'now' variable. Otherwise # return None as before # if self.waitBlanking is True: return now
def release(self): if self.push_viewport: glPopAttrib() HardwareFbo.fbo_stack.pop() glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, HardwareFbo.fbo_stack[-1]) super(HardwareFbo, self).release()