code: def read(self, viewport=None, components=3, *, attachment=0, alignment=1, dtype='f1') -> bytes:
          '''
              Read the content of the framebuffer.
  
              Args:
                  viewport (tuple): The viewport.
                  components (int): The number of components to read.
  
              Keyword Args:
                  attachment (int): The color attachment.
                  alignment (int): The byte alignment of the pixels.
                  dtype (str): Data type.
  
              Returns:
                  bytes
          '''
  
          return self.mglo.read(viewport, components, attachment, alignment, dtypef read(self, viewport=None, components=3, *, attachment=0, alignment=1, dtype='f1') -> bytes:
          '''
              Read the content of the framebuffer.
  
              Args:
                  viewport (tuple): The viewport.
                  components (int): The number of components to read.
  
              Keyword Args:
                  attachment (int): The color attachment.
                  alignment (int): The byte alignment of the pixels.
                  dtype (str): Data type.
  
              Returns:
                  bytes
          '''
  
          return self.mglo.read(viewport, components, attachment, alignment, dtype)
docs: Read the content of the framebuffer.
  
              Args:
                  viewport (tuple): The viewport.
                  components (int): The number of components to read.
  
              Keyword Args:
                  attachment (int): The color attachment.
                  alignment (int): The byte alignment of the pixels.
                  dtype (str): Data type.
  
              Returns:
                  bytes