diff --git a/README.md b/README.md
--- a/README.md
+++ b/README.md
@@ -24,4 +24,5 @@
 ```
 cabal run gloss-relative-checkers
 cabal run gloss-relative-button
+cabal run gloss-relative-drag
 ```
diff --git a/gloss-relative.cabal b/gloss-relative.cabal
--- a/gloss-relative.cabal
+++ b/gloss-relative.cabal
@@ -1,6 +1,6 @@
 cabal-version:      3.0
 name:               gloss-relative
-version:            0.1.1.0
+version:            0.1.2.0
 synopsis: Painless relative-sized pictures in Gloss.
 description: A new Frame data type for Gloss that simplifies drawing vector graphics with relative sizes and flexible layouts -- no more hardcoding distances. Bonus: graphics automatically resize when the screen changes, and native mouse hover events over defined screen regions.
 
@@ -46,21 +46,21 @@
 executable gloss-relative-checkers
     import:           warnings
     main-is:          Checkers.hs
-    build-depends:    base < 5, gloss-relative >= 0.1.1.0
+    build-depends:    base < 5, gloss-relative >= 0.1.2.0
     hs-source-dirs:   examples
     default-language: Haskell2010
 
 executable gloss-relative-button
     import:           warnings
     main-is:          Button.hs
-    build-depends:    base < 5, gloss-relative >= 0.1.1.0
+    build-depends:    base < 5, gloss-relative >= 0.1.2.0
     hs-source-dirs:   examples
     default-language: Haskell2010
 
 executable gloss-relative-drag
     import:           warnings
     main-is:          Drag.hs
-    build-depends:    base < 5, gloss-relative >= 0.1.1.0
+    build-depends:    base < 5, gloss-relative >= 0.1.2.0
     hs-source-dirs:   examples
     default-language: Haskell2010
 
diff --git a/src/Graphics/Gloss/Relative/Interface.hs b/src/Graphics/Gloss/Relative/Interface.hs
--- a/src/Graphics/Gloss/Relative/Interface.hs
+++ b/src/Graphics/Gloss/Relative/Interface.hs
@@ -62,7 +62,7 @@
 displayRelative dis backColor frame = do
     screen <- getDisplayDimension dis
     let pic = renderStaticFrame frame screen
-    Gloss.display dis backColor pic
+    Gloss.display dis backColor pic (Picture.flattenPicture pic)
 
 -- | A variant of 'Gloss.displayIO' using 'Frame'.
 displayRelativeIO
@@ -77,7 +77,7 @@
     let makePicture = do
             frame <- makeFrame
             let pic = renderStaticFrame frame screen
-            return pic
+            return (Picture.flattenPicture pic)
     Gloss.displayIO dis backColor makePicture eatController
 
 -- | A variant of 'Gloss.play' using 'Frame'. The resulting picture is automatically redimensioned on resize events.
@@ -127,7 +127,7 @@
             writeIORef handler $! h
             writeIORef currentFrame $! i + 1
             Cache.evictOldCacheTable (i+1) simResolution cache
-            return pic
+            return (Picture.flattenPicture pic)
     let handleEvent ev (w,s) = do
             h <- readIORef handler
             fromGlossEvent ev h >>= \e -> case e of
diff --git a/src/Graphics/Gloss/Relative/Internal/Picture.hs b/src/Graphics/Gloss/Relative/Internal/Picture.hs
--- a/src/Graphics/Gloss/Relative/Internal/Picture.hs
+++ b/src/Graphics/Gloss/Relative/Internal/Picture.hs
@@ -28,6 +28,64 @@
 catPictures [x] = x
 catPictures xs = Pictures xs
 
+-- | Flattens a picture, by eliminating some nested transforms.
+-- NOTE: OpenGL backends have a nested transforms stack of only 32, so we need to make sure to flatten Pictures before rendering to avoid stack overflows.
+flattenPicture :: Picture -> Picture
+flattenPicture p = Pictures $ flatten identityMatrix p
+
+-- Representing Affine Transformation Matrices.
+-- | a c e |
+-- | b d f |
+-- | 0 0 1 |
+data Matrix = Matrix Float Float Float Float Float Float
+
+identityMatrix :: Matrix
+identityMatrix = Matrix 1 0 0 1 0 0
+
+isShearedMatrix :: Matrix -> Bool
+isShearedMatrix (Matrix a b c d _ _) = 
+    let dotProduct = a * c + b * d
+        epsilon = 0.0001
+    in abs dotProduct > epsilon
+
+multiplyMatrix :: Matrix -> Matrix -> Matrix
+multiplyMatrix (Matrix a1 b1 c1 d1 e1 f1) (Matrix a2 b2 c2 d2 e2 f2) =
+    Matrix (a1*a2 + c1*b2) (b1*a2 + d1*b2)
+           (a1*c2 + c1*d2) (b1*c2 + d1*d2)
+           (a1*e2 + c1*f2 + e1) (b1*e2 + d1*f2 + f1)
+
+flatten :: Matrix -> Picture -> [Picture]
+flatten m pic | isShearedMatrix m = [transformLeaf m pic]
+flatten m Blank = []
+flatten m (Pictures ps) = concatMap (flatten m) ps
+flatten m (Translate x y p) = flatten (m `multiplyMatrix` Matrix 1 0 0 1 x y) p
+flatten m (Scale sx sy p) = flatten (m `multiplyMatrix` Matrix sx 0 0 sy 0 0) p
+flatten m (Rotate deg p) =
+        let rad = -deg * pi / 180 -- Gloss is clockwise
+            s = sin rad
+            c = cos rad
+        in flatten (m `multiplyMatrix` Matrix c (-s) s c 0 0) p
+flatten m (Polygon points) = [Polygon (map (transformPoint m) points)]
+flatten m (Line points) = [Line (map (transformPoint m) points)]
+flatten m pic = [transformLeaf m pic]
+
+transformPoint :: Matrix -> Point -> Point
+transformPoint (Matrix a b c d e f) (x, y) = 
+    (a*x + c*y + e, b*x + d*y + f)
+
+transformLeaf :: Matrix -> Picture -> Picture
+transformLeaf (Matrix a b c d e f) leaf =
+    let
+        tx = e
+        ty = f
+        sx = sqrt (a*a + b*b)
+        -- Use the determinant to handle negative scaling/flipping
+        det = a*d - b*c
+        sy = (signum det) * sqrt (c*c + d*d)
+        angle = atan2 b a * 180 / pi
+    in
+        Translate tx ty $ Rotate (-angle) $ Scale sx sy leaf
+
 -- * Regions
 
 -- | A rectangular region within the screen.
