       (println (GL20/glGetShaderInfoLog shader-id 10000)))
     [gl-compile-status shader-id]))
 
+(defn- program-id [vs-id fs-id & attribute-names]
+  (let [pgm-id                (GL20/glCreateProgram)
+        _ (except-gl-errors "@ let init-shaders glCreateProgram")
+        _                     (GL20/glAttachShader pgm-id vs-id)
+        _ (except-gl-errors "@ let init-shaders glAttachShader VS")
+        _                     (GL20/glAttachShader pgm-id fs-id)
+        _ (except-gl-errors "@ let init-shaders glAttachShader FS")
+        _                     (GL20/glLinkProgram pgm-id)
+        _ (except-gl-errors "@ let init-shaders glLinkProgram")
+        gl-link-status        (GL20/glGetProgrami pgm-id GL20/GL_LINK_STATUS)
+        _ (except-gl-errors "@ let init-shaders glGetProgram link status")
+        _                     (when (== gl-link-status GL11/GL_FALSE)
+                                (println "ERROR: Linking Shaders:")
+                                (println (GL20/glGetProgramInfoLog pgm-id 10000)))
+        _ (except-gl-errors "@ let before GetUniformLocation")
+        ]
+    (doseq [[i attribute-name] (map-indexed vector attribute-names)]
+      (GL20/glBindAttribLocation pgm-id i attribute-name))
+    pgm-id))
 
 (defn- init-shaders
   []
-  (let [[ok? vs-id] (load-shader (-> "shader.vs" clojure.java.io/resource slurp)  GL20/GL_VERTEX_SHADER)
-        _           (assert (== ok? GL11/GL_TRUE)) ;; something is really wrong if our vs is bad
-        [ok? fs-id] (load-shader (-> "shader.fs" clojure.java.io/resource slurp) GL20/GL_FRAGMENT_SHADER)]
+  (let [[ok? vs-id]    (load-shader (-> "shader.vs" clojure.java.io/resource slurp)  GL20/GL_VERTEX_SHADER)
+        _              (assert (== ok? GL11/GL_TRUE)) ;; something is really wrong if our vs is bad
+        [ok? fs-id]    (load-shader (-> "shader.fs" clojure.java.io/resource slurp) GL20/GL_FRAGMENT_SHADER)
+        _              (assert (== ok? GL11/GL_TRUE)) ;; something is really wrong if our fs is bad
+        [ok? fx-vs-id] (load-shader (-> "shader.vs" clojure.java.io/resource slurp) GL20/GL_VERTEX_SHADER)
+        _              (assert (== ok? GL11/GL_TRUE)) ;; something is really wrong if our fs is bad
+        [ok? fx-fs-id] (load-shader (-> "fx.fs" clojure.java.io/resource slurp) GL20/GL_FRAGMENT_SHADER)
+        _              (assert (== ok? GL11/GL_TRUE)) ;; something is really wrong if our fs is bad
+       ]
     (if (== ok? GL11/GL_TRUE)
-      (let [pgm-id                (GL20/glCreateProgram)
-            _ (except-gl-errors "@ let init-shaders glCreateProgram")
-            _                     (GL20/glAttachShader pgm-id vs-id)
-            _ (except-gl-errors "@ let init-shaders glAttachShader VS")
-            _                     (GL20/glAttachShader pgm-id fs-id)
-            _ (except-gl-errors "@ let init-shaders glAttachShader FS")
-            _                     (GL20/glLinkProgram pgm-id)
-            _ (except-gl-errors "@ let init-shaders glLinkProgram")
-            gl-link-status        (GL20/glGetProgrami pgm-id GL20/GL_LINK_STATUS)
-            _ (except-gl-errors "@ let init-shaders glGetProgram link status")
-            _                     (when (== gl-link-status GL11/GL_FALSE)
-                                    (println "ERROR: Linking Shaders:")
-                                    (println (GL20/glGetProgramInfoLog pgm-id 10000)))
-            _ (except-gl-errors "@ let before GetUniformLocation")
-            ]
-        (GL20/glBindAttribLocation pgm-id 0 "aVertexPosition")
-        (GL20/glBindAttribLocation pgm-id 1 "aTextureCoord")
-        pgm-id)
+      (let [pgm-id    (program-id vs-id fs-id "aVertexPosition" "aTextureCoord")
+            fb-pgm-id (program-id fx-vs-id fx-fs-id "aVertexPosition" "aTextureCoord")]
+        [pgm-id fb-pgm-id])
       (log/error "Error loading shaders"))))
 
 (defn ortho-matrix-buffer

                                       :font-texture-height font-texture-height
                                       :glyph-tex-dim glyph-tex-dim
                                       :glyph-texture-width glyph-texture-width
                                       :glyph-texture-height glyph-texture-height}
                            :data {:glyph-image-data glyph-image-data
                                   :fg-image-data fg-image-data
                                   :bg-image-data bg-image-data}}

        (.flip fg-image-data)
        (.flip bg-image-data)
        (try
          (GL30/glBindFramebuffer GL30/GL_FRAMEBUFFER, fbo-id)
          (GL11/glViewport 0 0 screen-width screen-height)
          (except-gl-errors (str "glViewport " screen-width screen-height))
          (GL11/glClearColor 0.0 0.0 1.0 1.0)
