diff --git a/pixelgl/canvas.go b/pixelgl/canvas.go
index 89521ca19726246f63ff83618544f67e5c46cfe4..1292d3b717ec2b45c73924cac46ffa8e19a46b27 100644
--- a/pixelgl/canvas.go
+++ b/pixelgl/canvas.go
@@ -23,6 +23,8 @@ type Canvas struct {
 	mat    mgl32.Mat3
 	col    mgl32.Vec4
 	smooth bool
+
+	sprite *pixel.Sprite
 }
 
 var _ pixel.ComposeTarget = (*Canvas)(nil)
@@ -52,6 +54,8 @@ func NewCanvas(bounds pixel.Rect) *Canvas {
 	})
 	c.shader = shader
 
+	c.sprite = pixel.NewSprite(c, c.Bounds())
+
 	return c
 }
 
@@ -117,6 +121,7 @@ func (c *Canvas) SetComposeMethod(cmp pixel.ComposeMethod) {
 // SetBounds resizes the Canvas to the new bounds. Old content will be preserved.
 func (c *Canvas) SetBounds(bounds pixel.Rect) {
 	c.gf.SetBounds(bounds)
+	c.sprite.Set(c, c.Bounds())
 }
 
 // Bounds returns the rectangular bounds of the Canvas.
@@ -211,6 +216,14 @@ func (c *Canvas) Texture() *glhf.Texture {
 	return c.gf.Texture()
 }
 
+// Draw draws a rectangle equal to Canvas's Bounds containing the Canvas's content to another
+// Target.
+//
+// Note, that the matrix and the color mask of this Canvas have no effect here.
+func (c *Canvas) Draw(t pixel.Target) {
+	c.sprite.Draw(t)
+}
+
 type canvasTriangles struct {
 	*GLTriangles
 	dst *Canvas