This package exposes several modules to work with GPUs in a stateless and type-safe way. Currently, it uses OpenGL as backend hardware technology but others will be added later on, such as Vulkan.

One very important point is the fact that luminance has nothing to do with 3D engines or scene development kits. Don’t expect to find materials, lights or mesh loaders. It’s just a graphics framework initiated to fix the design choices of OpenGL. It won’t change in any other way. However, as it grows, the plan is to make luminance a good graphics framework following the Haskell philosophy. In the end, it should be used as-is, not as an OpenGL abstraction.

luminance is a small yet powerful graphics API. It was designed so that people can quickly get their feet wet and start having fun with graphics in Haskell. The main idea is to unleash the graphical and visual properties of GPUs in a stateless and type-safe way.

This library doesn’t expose any architectural patterns or designs. It’s up to you to design your program as you want and following your own plans.


  • GHC 8 support.

  • Updated the documentation in Luminance crate module.

  • Added support for dlist-0.8.

  • Fixed documentation broken links.


  • Removed Regions. Now using commands (FrameCmd, ShadingCmd, DrawCmd and RenderCmd). Safer interface.

  • Fixed Buffer documentation.

  • Fixed gl45 backend (didn’t compile).
  • Added documentation/tutorial for Buffer.


Breaking changes

  • Region was removed in favor of Buffer; just a type renaming, don’t freak out.
  • Removed batches in favor of Regions.
  • Removed Decidable and Divisible instances for U as uniforms are not supposed to be used this way.

Patch changes

  • Internal changes to make createStage errors more verbose about the type of the stage.

  • Support for contravariant-1.4.
  • Support for GL_ARB_separate_shader_objects for gl33 backend (shader pragma).

  • Several minor changes (clean up mostly).


  • Made Program an instance of Eq and Show.


  • Dropped gl32 for gl33.

  • Removed the MonadIO constraint on createGeometry as it’s already brought by MonadResource.
  • Clean some code about createGeometry conditional (gl32 / gl45).


  • Exposed SomeUniformName.


  • Exposed UniformName – forgotten in 0.8 release.


Breaking changes

  • createProgram now has a new rank 2 type parameter to map uniform values. It uses the newly added first-class UniformName type to select which kind of uniform is wanted – up to now, simple uniforms or uniform block. That change is great because it unifies everything under the same type and future adds won’t break the existing code – the signature of createProgram for instance.


  • Made UniformInterface visible (type only).


  • Added Graphics.Luminance.Pixel in the export-list of Graphics.Luminance.Texture.


Breaking changes

  • Shader creation can fail with the UnsupportedStage error, holding the stage (and not a String) as it used to.
  • Fixed cubemap size interface.
  • Shader interface now uses the type StageType and createStage to create new shader stages.

Minor changes

  • Several internal architectural changes.
  • Added gl45-bindless-textures caps.
  • Added gl32 and gl45 backends. The default backend is gl32 and backends can be selected via compilation flags.

Patch changes

  • Simplified and fixed UBO implementation.
  • Added more debug symbols.
  • OpenGL debugging now shows the callstack in a fancy way.
  • Several internal architectural changes.

  • semigroups-0.18 support.

  • Extensions are now set per module.

  • Updated .cabal documentation.
  • Support for semigroups-0.17.

  • Fixed typo in the hackage documentation.

  • Fixed (:*:) for UniformBlock.
  • Dumped the Storable constraint in the uniBlock function (rank2 function passed to build uniform interfaces to createProgram).
  • Added (:.), (,), (,,) and (,,,) into UniformBlock.


Breaking changes

  • Added a new function to the createProgram and createProgram_ uniform interface builder argument. That function can now be used to retrieve U (Region rw (UB a)), which is a UBO.
  • The uniform interface creation is not performed in a arbitrary, user-defined monad anymore. A dedicated type was introduced for that very purpose – UniformInterface – constraining the user to only use the uniformize functions to map semantics to U values.

Non-breaking changes

  • Added UB, which can be used along with Buffer to create UBO buffers and pass them to shaders.

  • Relaxed lower bound of linear to accept linear-1.19.*. That changes should enable lumimance to be included into stackage.
  • Changed internal representation of Region.


Non-breaking changes

  • Added texture arrays:
    • Texture1DArray
    • Texture2DArray
    • CubemapArray


Non-breaking changes

  • Added several Uniform instances for linear.

Patch changes

  • Fixed the indexed render.
  • Fixed the vertex attributes being ignored.


Breaking changes

  • Changed the interface of texels transfer and filling. We dropped the Foldable instance and now require a Data.Vector.Storable.Vector for performance purposes.

Non-breaking changes

  • Added MirrorRepeat constructor to Wrap.

Patch changes

  • Fixed prerequisites in README.


  • Fixed the sizeOf implementation of a :. b.
  • Added nubDirect, which can be used to turn direct geometry into indirect geometry.


Non-breaking changes

  • Added .gitignore.

Breaking changes

  • V2, V3 and V4 replaced by vec2, vec3 and vec4.
  • V is not anymore luminance’s. We use linear’s one, because it already has all the instances we need and is more generic. The interface is then impacted.


  • Added Core.Tuple into the export liste of Luminance for easier uses in client code space.

  • Fixed Geometry haddock documentation.

  • Fixed haddock escaping issues.


  • Added CubeFace in the interface.

  • Enhanced Texture documentation.


  • All textures can now be used in shaders.
  • Added support for more OpenGL textures – though, framebuffers are not impacted yet.
    • Texture1D
    • Texture2D
    • Texture3D
    • Cubemap
  • Changed the texture interface with type families so that we can add more in an easier way!


Breaking changes

  • Automatically insert GLSL pragmas in shaders.

Non-breaking changes

  • Added documentation for RenderCmd.
  • Added stdRenderCmd_.
  • Added shaderProgramBatch_.

  • Fixed a typo in the Graphics.Luminance documentation.


  • Added a tutoral in Graphics.Luminance.


  • Initial revision. Do not consider this revision as a stable release. It’s experimental. The first stable release will be 1.0.