code: def __init__(self):
      app.Canvas.__init__(
          self,
          title="Framebuffer post-processing",
          keys="interactive",
          size=(512, 512),
      )
  
      # Build cube data
      # --------------------------------------
      vertices, indices, _ = create_cube()
      vertices = VertexBuffer(vertices)
      self.indices = IndexBuffer(indices)
  
      # Build program
      # --------------------------------------
      view = translate((0, 0, -7))
      self.phi, self.theta = 60, 20
      model = rotate(self.theta, (0, 0, 1)).dot(
          rotate(self.phi, (0, 1, 0))
      )
  
      self.cube = Program(cube_vertex, cube_fragment)
      self.cube.bind(vertices)
      self.cube["texture"] = checkerboard()
      self.cube["texture"].interpolation = "linear"
      self.cube["model"] = model
      self.cube["view"] = view
  
      color = Texture2D((512, 512, 3), interpolation="linear")
      self.framebuffer = FrameBuffer(color, RenderBuffer((512, 512)))
  
      self.quad = Program(quad_vertex, quad_fragment, count=4)
      self.quad["texcoord"] = [(0, 0), (0, 1), (1, 0), (1, 1)]
      self.quad["position"] = [(-1, -1), (-1, +1), (+1, -1), (+1, +1)]
      self.quad["texture"] = color
  
      # OpenGL and Timer initalization
      # --------------------------------------
      set_state(clear_color=(0.3, 0.3, 0.35, 1), depth_test=True)
      self.timer = app.Timer("auto", connect=self.on_timer, start=True)
      self._set_projection(self.physical_size)
  
      self.show()
  
file_path: vispy/examples/gloo/post_processing.py
imports: import numpy
  from vispy import app
  from vispy.geometry import create_cube
  from vispy.util.transforms import perspective, translate, rotate
  from vispy.gloo import Program, VertexBuffer, IndexBuffer, Texture2D, clear, FrameBuffer, RenderBuffer, set_viewport, set_state
label_desc: Use image node_id 1 to create a new Canvas object from inherited base classes: app with example: obj = Canvas()