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 destroy(self): """Must be called when this ``RenderTexture`` is no longer needed. Destroys the frame buffer and render buffer, and calls :meth:`.Texture2D.destroy`. """ texture.Texture2D.destroy(self) log.debug('Deleting FBO{} [{}]'.format(self.__frameBuffer, self.__rttype)) glfbo.glDeleteFramebuffersEXT(gltypes.GLuint(self.__frameBuffer)) if self.__renderBuffer is not None: rb = gltypes.GLuint(self.__renderBuffer) glfbo.glDeleteRenderbuffersEXT(1, rb) if self.__depthTexture is not None: self.__depthTexture.destroy() self.__frameBuffer = None self.__renderBuffer = None self.__depthTexture = None 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 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 __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 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 main(): glutInit(sys.argv) glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE | GLUT_DEPTH) glutInitWindowSize(640, 480) glutInitWindowPosition(0, 0) window = glutCreateWindow("Framebuffer bug demo") for i in range( 200 ): fbo = EXT.glGenFramebuffersEXT(1) print "FBO = ", fbo EXT.glDeleteFramebuffersEXT (int(fbo)) fbo = ARB.glGenFramebuffers(1) print "FBO = ", fbo ARB.glDeleteFramebuffers(int(fbo)) glFlush()
def main(): glutInit(sys.argv) glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE | GLUT_DEPTH) glutInitWindowSize(640, 480) glutInitWindowPosition(0, 0) window = glutCreateWindow("Framebuffer bug demo") for i in range(200): fbo = EXT.glGenFramebuffersEXT(1) print "FBO = ", fbo EXT.glDeleteFramebuffersEXT(int(fbo)) fbo = ARB.glGenFramebuffers(1) print "FBO = ", fbo ARB.glDeleteFramebuffers(int(fbo)) glFlush()
def __del__(self): # if application is closed, symbol may be not available anymore # so, prevent failure, instead of having an exception ! if not bool(glDeleteRenderbuffersEXT): return # XXX deletion of framebuffer failed with PyOpenGL 3.0.0 # Closed bug : http://sourceforge.net/tracker/index.php?func=detail&aid=2727274&group_id=5988&atid=105988 # So, we must test the version, and use numpy array instead. if OpenGLversion <= (3, 0, 1) and have_numpy: glDeleteFramebuffersEXT(1, numpy.array(self.framebuffer)) if self.with_depthbuffer: glDeleteRenderbuffersEXT(1, numpy.array(self.depthbuffer)) else: # XXX Should work, but not tested. glDeleteFramebuffersEXT(1, self.framebuffer) if self.with_depthbuffer: glDeleteRenderbuffersEXT(1, self.depthbuffer)
def main(): glutInit(sys.argv) glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE | GLUT_DEPTH) glutInitWindowSize(640, 480) glutInitWindowPosition(0, 0) glutCreateWindow("Framebuffer bug demo") for i in range( 200 ): fbo = EXT.glGenFramebuffersEXT(1) print("FBO = ", fbo) EXT.glDeleteFramebuffersEXT (int(fbo)) fbo = ARB.glGenFramebuffers(1) print("FBO = ", fbo) ARB.glDeleteFramebuffers(int(fbo)) glFlush() try: if fgDeinitialize: fgDeinitialize(False) except NameError: pass # Older PyOpenGL, you may see a seg-fault here...
def main(): glutInit(sys.argv) glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE | GLUT_DEPTH) glutInitWindowSize(640, 480) glutInitWindowPosition(0, 0) window = glutCreateWindow("Framebuffer bug demo") for i in range( 200 ): fbo = EXT.glGenFramebuffersEXT(1) print("FBO = ", fbo) EXT.glDeleteFramebuffersEXT (int(fbo)) fbo = ARB.glGenFramebuffers(1) print("FBO = ", fbo) ARB.glDeleteFramebuffers(int(fbo)) glFlush() try: if fgDeinitialize: fgDeinitialize(False) except NameError as err: pass # Older PyOpenGL, you may see a seg-fault here...