Esempio n. 1
0
    def export_to_png(self, filename, *args, **kwargs):
        '''Saves an image of the widget and its children in png format at the
        specified filename. Works by removing the widget canvas from its
        parent, rendering to an :class:`~kivy.graphics.fbo.Fbo`, and calling
        :meth:`~kivy.graphics.texture.Texture.save`.

        .. note::

            The image includes only this widget and its children. If you want
            to include widgets elsewhere in the tree, you must call
            :meth:`~Widget.export_to_png` from their common parent, or use
            :meth:`~kivy.core.window.WindowBase.screenshot` to capture the
            whole window.

        .. note::

            The image will be saved in png format, you should include the
            extension in your filename.

        .. versionadded:: 1.9.0

        :Parameters:
            `filename`: str
                The filename with which to save the png.
            `scale`: float
                The amount by which to scale the saved image, defaults to 1.

                .. versionadded:: 1.11.0
        '''

        scale = kwargs.get('scale', 1)

        if self.parent is not None:
            canvas_parent_index = self.parent.canvas.indexof(self.canvas)
            if canvas_parent_index > -1:
                self.parent.canvas.remove(self.canvas)

        fbo = Fbo(size=(self.width * scale, self.height * scale),
                  with_stencilbuffer=True)

        with fbo:
            ClearColor(0, 0, 0, 0)
            ClearBuffers()
            Scale(1, -1, 1)
            Scale(scale, scale, 1)
            Translate(-self.x, -self.y - self.height, 0)

        fbo.add(self.canvas)
        fbo.draw()
        fbo.texture.save(filename, flipped=False)
        fbo.remove(self.canvas)

        if self.parent is not None and canvas_parent_index > -1:
            self.parent.canvas.insert(canvas_parent_index, self.canvas)

        return True
Esempio n. 2
0
    def __init__(self, **kwargs):
        super(Graph, self).__init__(**kwargs)

        with self.canvas:
            self._fbo = Fbo(size=self.size)
            self._marker_color = Color(self.marker_color)
            self._marker = Line()

        with self._fbo:
            self._background_color = Color(*self.background_color)
            self._background_rect = Rectangle(size=self.size)
            self._mesh_ticks_color = Color(*self.tick_color)
            self._mesh_ticks = Mesh(mode='lines')
            self._mesh_rect_color = Color(*self.border_color)
            self._mesh_rect = Mesh(mode='line_strip')

        with self.canvas:
            Color(1, 1, 1)
            self._fbo_rect = Rectangle(size=self.size)

        mesh = self._mesh_rect
        mesh.vertices = [0] * (5 * 4)
        mesh.indices = range(5)

        self._plot_area = StencilView()
        self.add_widget(self._plot_area)

        t = self._trigger = Clock.create_trigger(self._redraw_all)
        ts = self._trigger_size = Clock.create_trigger(self._redraw_size)
        tc = self._trigger_color = Clock.create_trigger(self._update_colors)

        self.bind(center=ts,
                  padding=ts,
                  precision=ts,
                  plots=ts,
                  x_grid=ts,
                  y_grid=ts,
                  draw_border=ts)
        self.bind(xmin=t,
                  xmax=t,
                  xlog=t,
                  x_ticks_major=t,
                  x_ticks_minor=t,
                  xlabel=t,
                  x_grid_label=t,
                  ymin=t,
                  ymax=t,
                  ylog=t,
                  y_ticks_major=t,
                  y_ticks_minor=t,
                  ylabel=t,
                  y_grid_label=t,
                  font_size=t,
                  label_options=t)
        self.bind(tick_color=tc, background_color=tc, border_color=tc)
        self._trigger()
Esempio n. 3
0
def circle_fs(size=(64, 64)):

    fbo = Fbo(size=size)
    fbo.shader.fs = circle_test

    with fbo:
        Color(1, 1, 1)
        Rectangle(size=size)
    fbo.draw()
    return fbo.texture
Esempio n. 4
0
 def init_fbo(self):
     with self.canvas:
         Color(1, 1, 1)
         self.g_fbo = Fbo(size=self.size)
         self.g_fbo_texture = self.g_fbo.texture
         Color(1, 1, 1, 1)
         PushMatrix()
         self.g_scale = Scale(self.width / 2, self.height / 2, 1.)
         self.build_grid()
         PopMatrix()
    def test_fbo_pixels(self):
        from kivy.graphics import Fbo, ClearColor, ClearBuffers, Ellipse

        fbo = Fbo(size=(512, 512))
        with fbo:
            ClearColor(0, 0, 0, 1)
            ClearBuffers()
            Ellipse(pos=(100, 100), size=(100, 100))
        fbo.draw()
        data = fbo.pixels
        fbo.texture.save('results.png')
Esempio n. 6
0
 def add_roi_fbo(self, obj, new_value):
     with self.canvas:
         fbo = Fbo(size=self.texture.size)
         color = Color(*roi_colors[new_value % len(roi_colors)])
         rect = Rectangle(size=self.vid_size,
                          pos=self.vid_pos,
                          texture=fbo.texture)
         self.bind(
             vid_size=lambda s, *args: setattr(rect, 'size', self.vid_size),
             vid_pos=lambda s, *args: setattr(rect, 'pos', self.vid_pos))
         self.fbo_list.append((fbo, color, rect))
    def init_camera(self):
        self._release_camera()
        self._android_camera = Camera.open(self._index)
        params = self._android_camera.getParameters()
        width, height = self._resolution
        zoom = self._zoom  # edit by ableity
        focusmode = self._focusmode  # edit by lilei
        params.setPreviewSize(width, height)
        params.setFocusMode(focusmode)  #edit by lilei
        params.setZoom(zoom)  # edit by ableity
        self._android_camera.setParameters(params)
        # self._android_camera.setDisplayOrientation()
        self.fps = 30.

        pf = params.getPreviewFormat()
        assert (pf == ImageFormat.NV21)  # default format is NV21
        self._bufsize = int(
            ImageFormat.getBitsPerPixel(pf) / 8. * width * height)

        self._camera_texture = Texture(width=width,
                                       height=height,
                                       target=GL_TEXTURE_EXTERNAL_OES,
                                       colorfmt='rgba')
        self._surface_texture = SurfaceTexture(int(self._camera_texture.id))
        self._android_camera.setPreviewTexture(self._surface_texture)

        self._fbo = Fbo(size=self._resolution)
        self._fbo['resolution'] = (float(width), float(height))
        self._fbo.shader.fs = '''
            #extension GL_OES_EGL_image_external : require
            #ifdef GL_ES
                precision highp float;
            #endif

            /* Outputs from the vertex shader */
            varying vec4 frag_color;
            varying vec2 tex_coord0;

            /* uniform texture samplers */
            uniform sampler2D texture0;
            uniform samplerExternalOES texture1;
            uniform vec2 resolution;

            void main()
            {
                vec2 coord = vec2(tex_coord0.y * (
                    resolution.y / resolution.x), 1. -tex_coord0.x);
                gl_FragColor = texture2D(texture1, tex_coord0);
            }
        '''
        with self._fbo:
            self._texture_cb = Callback(
                lambda instr: self._camera_texture.bind)
            Rectangle(size=self._resolution)
Esempio n. 8
0
    def setupVTK(self):
        Clock.schedule_interval(self.updateVTK, 1 / 1.)
        with self.canvas:
            self.fbo = Fbo(size=(512, 512),
                           clear_color=(.3, .3, .3, .8),
                           push_viewport=True,
                           with_depthbuffer=True)
            self.size = self.fbo.size
            Color(0, 0, 1)
            Rectangle(pos=self.pos, size=self.size, texture=self.fbo.texture)

            Callback(self.drawVTK, reset_context=True)
Esempio n. 9
0
 def make_screen_fbo(self, screen):
     fbo = Fbo(size=screen.size, with_stencilbuffer=True)
     with fbo:
         ClearColor(*self.clearcolor)
         ClearBuffers()
     fbo.add(screen.canvas)
     with fbo.before:
         PushMatrix()
         Translate(-screen.x, -screen.y, 0)
     with fbo.after:
         PopMatrix()
     return fbo
Esempio n. 10
0
 def make_screen_fbo(self, screen):
     fbo = Fbo(size=screen.size)
     with fbo:
         ClearColor(0, 0, 0, 1)
         ClearBuffers()
     fbo.add(screen.canvas)
     with fbo.before:
         PushMatrix()
         Translate(-screen.x, -screen.y, 0)
     with fbo.after:
         PopMatrix()
     return fbo
Esempio n. 11
0
    def __init__(self, **kwargs):
        super(PostEffect, self).__init__(**kwargs)
        self.canvas = RenderContext(use_parent_projection=True)
        self.fs = Shaders.shader_pulse
        self.mouse = (0, 0)
        self.textures = []

        with self.canvas:
            self.fbo = Fbo(size=SIZE, use_parent_projection=True)
            self.texture0 = Rectangle(size=SIZE)

        self.texture = self.fbo.texture
        self.texture.flip_vertical()
Esempio n. 12
0
    def __init__(self, **kwargs):
        super(Graph, self).__init__(**kwargs)

        with self.canvas:
            self._fbo = Fbo(size=self.size, with_stencilbuffer=True)

        with self._fbo:
            self._background_color = Color(*self.background_color)
            self._background_rect = Rectangle(size=self.size)
            self._mesh_ticks_color = Color(*self.tick_color)
            self._mesh_ticks = Mesh(mode='lines')
            self._mesh_rect_color = Color(*self.border_color)
            self._mesh_rect = Mesh(mode='line_strip')

        with self.canvas:
            Color(1, 1, 1)
            self._fbo_rect = Rectangle(size=self.size,
                                       texture=self._fbo.texture)

        mesh = self._mesh_rect
        mesh.vertices = [0] * (5 * 4)
        mesh.indices = range(5)

        self._plot_area = StencilView()
        self.add_widget(self._plot_area)

        self._trigger = Clock.create_trigger(self._redraw_all)
        self._trigger_size = Clock.create_trigger(self._redraw_size)

        self.bind(center=self._trigger_size,
                  padding=self._trigger_size,
                  font_size=self._trigger_size,
                  plots=self._trigger_size,
                  x_grid=self._trigger_size,
                  y_grid=self._trigger_size,
                  draw_border=self._trigger_size)
        self.bind(xmin=self._trigger,
                  xmax=self._trigger,
                  xlog=self._trigger,
                  x_ticks_major=self._trigger,
                  x_ticks_minor=self._trigger,
                  xlabel=self._trigger,
                  x_grid_label=self._trigger,
                  ymin=self._trigger,
                  ymax=self._trigger,
                  ylog=self._trigger,
                  y_ticks_major=self._trigger,
                  y_ticks_minor=self._trigger,
                  ylabel=self._trigger,
                  y_grid_label=self._trigger)
        self._trigger()
Esempio n. 13
0
def hue_transform(source, hue, size=(64, 64)):

    fbo = Fbo(size=size)
    fbo.shader.fs = hue_xfo

    # use the shader on the entire surface
    fbo['hueAdjust'] = float(hue)

    with fbo:
        Color(1, 1, 1)
        Rectangle(size=size, source=source)
    fbo.draw()

    return fbo.texture
Esempio n. 14
0
def advanced_gradient(border_color=(1, 1, 0), center_color=(1, 0, 0), size=(64, 64),fs=radial_grd_fs):

    fbo = Fbo(size=size)
    fbo.shader.fs = fs

    # use the shader on the entire surface
    fbo['border_color'] = map(float, border_color)
    fbo['center_color'] = map(float, center_color)
    with fbo:
        Color(1, 1, 1)
        Rectangle(size=size)
    fbo.draw()

    return fbo.texture
Esempio n. 15
0
    def setup_panda(self, *largs):
        self.msb = ModelShowbase()
        self.msb.camLens.setFov(52.0)
        self.msb.camLens.setNearFar(1.0, 10000.0)

        with self.canvas:
            self.fbo = Fbo(size=self.size, clear_color=(.3, .3, .3, .2))
            Color(1, 1, 1)
            self.viewport = Rectangle(pos=self.pos,
                                      size=self.size,
                                      texture=self.fbo.texture)
            Callback(self.draw_panda, reset_context=True)

        Clock.schedule_interval(self.update_panda, 1 / 60.)
Esempio n. 16
0
    def test_fbo_pixels(self):
        from kivy.graphics import Fbo, ClearColor, ClearBuffers, Ellipse

        fbo = Fbo(size=(512, 512))
        with fbo:
            ClearColor(0, 0, 0, 1)
            ClearBuffers()
            Ellipse(pos=(100, 100), size=(100, 100))
        fbo.draw()
        data = fbo.pixels

        import pygame
        surface = pygame.image.fromstring(data, (512, 512), 'RGBA', True)
        pygame.image.save(surface, "results.png")
Esempio n. 17
0
    def __init__(self, **kwargs):
        self.mesh_data = MeshData()
        self.canvas = Canvas()
        with self.canvas:
            self.fbo = Fbo(size=(10, 10), compute_normal_mat=True)
            self.fbo.add_reload_observer(self.populate_fbo)
        with self.fbo:
            ClearColor(0, 0, 0, 0)
            ClearBuffers()
        self.populate_fbo(self.fbo)

        super(GLWindow, self).__init__(**kwargs)

        Clock.schedule_interval(self.update_glsl, 1 / 60.)
Esempio n. 18
0
    def __init__(self, **kwargs):
        super().__init__(**kwargs)

        Tex1 = Texture.create(size=T_SIZE, colorfmt="rgba", bufferfmt="float")
        Tex2 = Texture.create(size=T_SIZE, colorfmt="rgba", bufferfmt="float")
        Tex3 = Texture.create(size=T_SIZE, colorfmt="rgba", bufferfmt="float")
        Tex4 = Texture.create(size=T_SIZE, colorfmt="rgba", bufferfmt="float")
        Tex4.mag_filter = "linear"

        self.fbo_edit = Fbo(clear_color=(0.5,0.5,0,1),size=(T_SIZE),texture=Tex1)
        self.fbo_edit.shader.vs = open("data/shaders/vs.glsl").read()
        self.fbo_edit.shader.fs = open("data/shaders/fs_edit.glsl").read()
        self.fbo_edit["viewport"] = [float(s) for s in W_SIZE]
        self.fbo_edit["mode"] = 0

        self.fbo_mix = Fbo(clear_color=(0.5,0.5,0,1),size=(T_SIZE),texture=Tex2)
        self.fbo_mix.shader.vs = open("data/shaders/vs.glsl").read()
        self.fbo_mix.shader.fs = open("data/shaders/fs_mix.glsl").read()
        self.fbo_mix["tex1"] = 1
        self.fbo_mix["tex2"] = 2
        self.fbo_mix["viewport"] = [float(s) for s in W_SIZE]

        self.fbo_save = Fbo(clear_color=(0.5,0.5,0,1),size=(T_SIZE),texture=Tex3)
        self.fbo_save.shader.vs = open("data/shaders/vs.glsl").read()
        self.fbo_save.shader.fs = open("data/shaders/fs_save.glsl").read()
        self.fbo_save["tex"] = 3
        self.fbo_save["viewport"] = [float(s) for s in W_SIZE]

        self.fbo_warp = Fbo(size=(T_SIZE),texture=Tex4)
        self.fbo_warp.shader.vs = open("data/shaders/vs.glsl").read()
        self.fbo_warp.shader.fs = open("data/shaders/fs_warp.glsl").read()
        self.fbo_warp["tex"] = 4
        self.fbo_warp["warp"] = 5
        self.fbo_warp["viewport"] = [float(s) for s in W_SIZE]

        self.tex = Texture.create(size=T_SIZE,colorfmt="rgb",bufferfmt="ubyte")
        self.tex.blit_buffer(IMG)
Esempio n. 19
0
    def setup_panda(self, *largs):
        self.msb = msb = ModelShowbase()
        msb.camLens.setFov(52.0)
        msb.camLens.setNearFar(1.0, 10000.0)
        self.node = Node(node=msb.render.attachNewNode('PandaView'))

        with self.canvas:
            self.fbo = Fbo(size=self.size)
            self.viewport = Rectangle(
                pos=self.pos,
                size=self.size,
            )
            Callback(self.draw_panda, reset_context=True)

        Clock.schedule_interval(self.update_panda, 1 / 60.)
Esempio n. 20
0
    def __init__(self, **kwargs):
        # Make sure opengl context exists
        EventLoop.ensure_window()
        self.mask_effect = kwargs.get("mask_effect", None)
        self.motion_effect = kwargs.get("motion_effect", None)
        self.fbo_canvas = kwargs.get("motion_effect", None)

        self.canvas = RenderContext(use_parent_projection=True,
                                    use_parent_modelview=True,
                                    with_depthbuffer=True)

        self.size = C_SIZE
        with self.canvas:
            #self._viewport = Rectangle(size=(800,600), pos=self.pos)
            self.fbo = Fbo(size=C_SIZE,
                           with_depthbuffer=True,
                           compute_normal_mat=True,
                           clear_color=(0.3, 0.3, 0.7, 1))

        with self.fbo.before:
            #Rectangle(size=(800, 600))
            PushMatrix()
            self.fbo_translation = Translate(-self.x, -self.y, 0)
            BindTexture(texture=self.fbo_canvas.texture, index=1)
            BindTexture(texture=self.mask_effect.texture, index=4)
            BindTexture(texture=self.motion_effect.texture, index=5)

        with self.fbo:
            Color(0, 0, 0)
            BindTexture(texture=self.fbo_canvas.texture, index=1)
            BindTexture(texture=self.mask_effect.texture, index=4)
            BindTexture(texture=self.motion_effect.texture, index=5)
            self.fbo_rectangle = Rectangle(size=C_SIZE)
            self._instructions = InstructionGroup()

        with self.fbo.after:
            PopMatrix()
            self.cbs = Callback(self.reset_gl_context)

        super(EffectWidget, self).__init__(**kwargs)
        self.size = C_SIZE

        Clock.schedule_interval(self.update_glsl, 0)

        self._instructions.add(Callback(self.setup_gl_context))

        self.refresh_fbo_setup()
        Clock.schedule_interval(self.update_fbos, 0)
Esempio n. 21
0
def insert_color_ellipse(state, texture_w, texture_h, texture_name, c_r, c_g,
                         c_b):
    """
        TODO
        """
    tile_size = screen.get_tile_size(state)
    texture_w *= tile_size
    texture_h *= tile_size

    texture = Texture.create(size=(texture_w, texture_h), colorfmt='rgba')
    fbo = Fbo(size=(texture_w, texture_h), texture=texture)
    with fbo:
        Color(c_r, c_g, c_b)
        Ellipse(pos=(0, 0), size=(texture_w, texture_h))
    fbo.draw()
    insert(state, texture_name, texture)
Esempio n. 22
0
    def export_scaled_png(self):
        re_size = (720, 480)
        image_scale = 720/self.width

        fbo = Fbo(size=re_size, with_stencilbuffer=True)

        with fbo:
            ClearColor(0, 0, 0, 0)
            ClearBuffers()
            Scale(image_scale, -image_scale, image_scale)
            Translate(-self.x, -self.y - self.height, 0)

        fbo.add(self.canvas)
        fbo.draw()
        fbo.texture.save('images/complete/%s_mask.jpg'%self.img_name[:-4], flipped=False)
        fbo.remove(self.canvas)
Esempio n. 23
0
 def export_to_png(self, filename, *args):
     if self.parent is not None:
         canvas_parent_index = self.parent.canvas.indexof(self.canvas)
         self.parent.canvas.remove(self.canvas)
     fbo = Fbo(size=self.size, with_stencilbuffer=True)
     with fbo:
         ClearColor(0, 0, 0, 1)
         ClearBuffers()
         Scale(1, -1, 1)
         Translate(-self.x, -self.y - self.height, 0)
     fbo.add(self.canvas)
     fbo.draw()
     fbo.texture.save(filename, flipped=False)
     fbo.remove(self.canvas)
     if self.parent is not None:
         self.parent.canvas.insert(canvas_parent_index, self.canvas)
     return True
Esempio n. 24
0
	def __init__(self, **kwargs):
		super(MyW, self).__init__(**kwargs)

		with self.canvas:

			self.fbo = Fbo(size=(256, 256))
  
			Rectangle(size=(32, 32), texture=self.fbo.texture) 
			Rectangle(pos=(32, 0), size=(64, 64), texture=self.fbo.texture) 
			Rectangle(pos=(96, 0), size=(128, 128), texture=self.fbo.texture)
			Rectangle(pos=(224, 0), size=(256, 128), texture=self.fbo.texture)

		with self.fbo:
			Color(1, 0, 0, .8) 
			Rectangle(size=(256, 64)) 
			Color(0, 1, 1, .8) 
			Rectangle(size=(64, 256))
Esempio n. 25
0
    def __init__(self, **kwargs):
        super(FboTest, self).__init__(**kwargs)
        self.positions = ((260.0, 260.0), (192.0, 192.0), (96.0, 192.0),
                          (192.0, 96.0), (96.0, 96.0), (32.0, 192.0),
                          (192.0, 32.0), (32.0, 32.0))

        self.fbo = Fbo(size=(256, 256))
        with self.fbo:
            Color(0.56789, 0, 0, 1)
            Rectangle(size=(256, 64))
            Color(0, 0.56789, 0, 1)
            Rectangle(size=(64, 256))
            Color(0.56789, 0, 0, .5)
            Rectangle(pos=(64, 64), size=(192, 64))
            Color(0, 0.56789, 0, .5)
            Rectangle(pos=(64, 64), size=(64, 192))
        self.fbo.draw()
Esempio n. 26
0
 def __init__(self, **kwargs):
     # get raw rgb thumb is available
     self.thumb = kwargs.get('thumb', None)
     del kwargs['thumb']
     # extract controler now, we need it.
     self.ctrl = kwargs.get('ctrl')
     # create fbo for tiny texture
     self.fbo = Fbo(size=(160, 120))
     with self.fbo:
         Color(1, 1, 1)
         Rectangle(size=self.fbo.size)
         self.fborect = Rectangle(size=self.fbo.size)
     if self.thumb:
         self.upload_thumb()
     else:
         self.update_capture()
     super(Slide, self).__init__(**kwargs)
Esempio n. 27
0
    def __init__(self, **kwargs):
        super(Scaled, self).__init__(**kwargs)

        self.elements = []
        self.pointsize = 5  # this multiplies by two according to kivy docs

        with self.canvas:
            self._fbo = Fbo(size=self.size)
            self._rect = Rectangle(texture=self._fbo.texture)

        with self._fbo:
            Color(1, 1, 1)
            self._fborect = Rectangle(size=self._fbo.size)
            Color(0, 0, 1)
            self._points = Point(pointsize=self.pointsize)

        self._fbo.add_reload_observer(self._clear_fbo)
        self.bind(pos=self._update_rect, size=self._update_rect)
Esempio n. 28
0
    def __init__(self, **kwargs):
        super(Pad, self).__init__(**kwargs)

        # Which elements exist in the grid in the normalized coordinates
        self.elements = []
        self.oldxy = None

        with self.canvas:
            self._fbo = Fbo(size=self.size)
            self._rect = Rectangle(texture=self._fbo.texture)

        with self._fbo:
            Color(1, 1, 1)
            self._fborect = Rectangle(size=self._fbo.size)
            Color(1, 0, 0)

        self._fbo.add_reload_observer(self._clear_fbo)
        self.bind(pos=self._update_rect, size=self._update_rect)
Esempio n. 29
0
    def export_to_png(self, filename, *args):
        '''Saves an image of the widget and its children in png format at the
        specified filename. Works by removing the widget canvas from its
        parent, rendering to an :class:`~kivy.graphics.fbo.Fbo`, and calling
        :meth:`~kivy.graphics.texture.Texture.save`.

        .. note::

            The image includes only this widget and its children. If you want to
            include widgets elsewhere in the tree, you must call
            :meth:`~Widget.export_to_png` from their common parent, or use
            :meth:`~kivy.core.window.Window.screenshot` to capture the whole
            window.

        .. note::

            The image will be saved in png format, you should include the
            extension in your filename.

        .. versionadded:: 1.8.1
        '''

        if self.parent is not None:
            canvas_parent_index = self.parent.canvas.indexof(self.canvas)
            self.parent.canvas.remove(self.canvas)

        fbo = Fbo(size=self.size)

        with fbo:
            ClearColor(0, 0, 0, 1)
            ClearBuffers()
            Translate(-self.x, -self.y, 0)

        fbo.add(self.canvas)
        fbo.draw()
        fbo.texture.save(filename)
        fbo.remove(self.canvas)

        if self.parent is not None:
            self.parent.canvas.insert(canvas_parent_index, self.canvas)

        return True
Esempio n. 30
0
    def __init__(self, **kwargs):
        self.lock = Lock()
        self.gl_depth = -3
        self.mesh_data = MeshData()
        self.mesh_data.vertices = np.array([0, 0, 0, 0, 0, 0, 0, 0])
        self.mesh_data.indices = np.array([0])
        self.points = None

        self.canvas = Canvas()
        with self.canvas:
            self.fbo = Fbo(size=(10, 10), compute_normal_mat=True)
            self.fbo.add_reload_observer(self.populate_fbo)
        with self.fbo:
            ClearColor(1, 1, 1, 1)
            ClearBuffers()

        self.populate_fbo(self.fbo)

        super(ObjectRenderer, self).__init__(**kwargs)
        Clock.schedule_interval(self.update_glsl, 1 / 10.)