Exemplo n.º 1
0
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,
    ])
Exemplo n.º 2
0
    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
Exemplo n.º 3
0
    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
Exemplo n.º 4
0
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,] )
Exemplo n.º 5
0
    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()
Exemplo n.º 6
0
    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,] )
Exemplo n.º 7
0
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()
Exemplo n.º 8
0
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()
Exemplo n.º 9
0
Arquivo: fbo.py Projeto: hansent/pymt
 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)
Exemplo n.º 10
0
 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)
Exemplo n.º 11
0
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...
Exemplo n.º 12
0
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...