Personal tools

OpenGL

From HaskellWiki

(Difference between revisions)
Jump to: navigation, search
(update link to PolyFunViz)
m (Additional software)
(36 intermediate revisions by 13 users not shown)
Line 1: Line 1:
This is a stub page for Haskell's OpenGL and GLUT bindings. It is meant as a starting point to replace the outdated and misleading documentation at the
+
{{Stub}}
[http://www.haskell.org/HOpenGL-old/ old page].
 
 
First, note that the implementation is far more up-to-date than that old page suggested (originally, it was quite useful, but the page hasn't kept up with the implementation for a long time now).
 
   
 
== References ==
 
== References ==
  +
 
* [http://www.haskell.org/mailman/listinfo/hopengl the HOpenGL mailing list]
 
* [http://www.haskell.org/mailman/listinfo/hopengl the HOpenGL mailing list]
   
Line 8: Line 9:
 
* [http://hackage.haskell.org/packages/archive/GLUT/latest/doc/html/ the API docs for the GLUT binding]
 
* [http://hackage.haskell.org/packages/archive/GLUT/latest/doc/html/ the API docs for the GLUT binding]
   
* [http://darcs.haskell.org/packages/OpenGL the darcs repo with the sources for the OpenGL binding]
+
* [https://github.com/haskell-opengl/ The github organization for Haskell OpenGL development].
   
* [http://darcs.haskell.org/packages/GLUT/ the darcs repo with the sources for the GLUT binding]
+
In particular, note that the [http://code.haskell.org/GLUT/examples/ examples/] directory in the GLUT repo contains lots of examples, including translations of the red book examples.
   
In particular, note that the [http://darcs.haskell.org/packages/GLUT/examples/ examples/] directory in the GLUT repo contains lots of examples, including translations of the red book examples.
+
(Note: at least some of these resources appear to be missing from [http://darcs.haskell.org/packages/ /packages], but there are copies at [http://darcs.haskell.org/ghc-6.8/packages/ /ghc-6.8/packages].)
  +
  +
Both the API documentation and the examples are best studied with the [http://www.opengl.org/documentation/specs/ original specs] and the original [http://www.opengl.org/documentation/books/#the_opengl_programming_guide_the_official_guide_to_learning_opengl_version red book] examples at hand. An index of examples can be found at the OpenGL wiki page [http://www.opengl.org/wiki/Code_Resources Code Resources].
   
Both the API documentation and the examples are best studied with the [http://www.opengl.org/documentation/specs/ original specs] and the original [http://www.opengl.org/documentation/red_book/ red book] examples at hand. An index of the examples from v1.1 of the red book, with screen shots, can be found [http://www.opengl.org/resources/code/samples/redbook/ here]
 
   
 
== Projects using the OpenGL bindings ==
 
== Projects using the OpenGL bindings ==
   
  +
* [http://www.increpare.com/2008/11/endless-cavern/ Endless Cavern], a 2D procedurally-generated exploration game.
 
* [[Frag]], a 3D first-person shooter game.
 
* [[Frag]], a 3D first-person shooter game.
* [[Monadius]], a 2D scrolling arcade game.
+
* [http://www.geocities.jp/takascience/haskell/monadius_en.html Monadius], a 2D scrolling arcade game.
* [[Roguestar]], a roguelike adventure game using 3D graphics.
+
* [http://roguestar.downstairspeople.org/ Roguestar], a roguelike adventure game using 3D graphics.
* [[Shu-thing]], a 2D scroling arcade game.
+
* [http://hackage.haskell.org/cgi-bin/hackage-scripts/package/Shu-thing Shu-thing], a 2D scrolling arcade game.
* [[Topkata]], a jumping ball puzzle game.
+
* [http://home.arcor.de/chr_bauer/topkata.html Topkata], a jumping ball puzzle game.
 
* [http://www.comp.leeds.ac.uk/funvis/ PolyFunViz], a toolkit for scientific visualization (e.g. surfaces, flows, contours, volumes)
 
* [http://www.comp.leeds.ac.uk/funvis/ PolyFunViz], a toolkit for scientific visualization (e.g. surfaces, flows, contours, volumes)
  +
* [http://raincat.bysusanlin.com Raincat], a 2d puzzle game
  +
* [http://trac.haskell.org/gloss/ Gloss], hides the pain of drawing simple vector graphics behind a nice data type and a few display functions
  +
   
 
== HOpenGL Resources ==
 
== HOpenGL Resources ==
   
 
* [[OpenGLTutorial1]] and [[OpenGLTutorial2]]
 
* [[OpenGLTutorial1]] and [[OpenGLTutorial2]]
* [http://bluheron.europa.renci.org/docs/BeautifulCode.pdf Beautiful Code, Compelling Evidence: Functional Programming for Information Visualization and Visual Analytics] - Writing visualizations using OpenGL or Cairo (PDF)
+
* [http://www.renci.org/publications/tutorials/BeautifulCode.pdf Beautiful Code, Compelling Evidence: Functional Programming for Information Visualization and Visual Analytics] - Writing visualizations using OpenGL or Cairo (PDF)
 
* [http://www.cin.ufpe.br/~haskell/hopengl/ Andre Furtado's nice tutorial] written in 2001 (bitrotted)
 
* [http://www.cin.ufpe.br/~haskell/hopengl/ Andre Furtado's nice tutorial] written in 2001 (bitrotted)
* [http://www.haskell.org/~pairwise/HOpenGL/HOpenGL.html#texLoad Spriting with HOpenGL], David Morra
+
   
 
== OpenGL Resources ==
 
== OpenGL Resources ==
   
* [http://www.opengl.org/resources/faq/technical/ OpenGL FAQ and Toubleshooting Guide] Assumes some knowledge of OpenGL. Good for those who have written something but want to avoid common pitfalls.
+
* [http://www.opengl.org/archives/resources/faq/technical/ OpenGL FAQ and Troubleshooting Guide] Assumes some knowledge of OpenGL. Good for those who have written something but want to avoid common pitfalls.
  +
** [http://www.opengl.org/archives/resources/faq/technical/gettingstarted.htm#0050 2.100: What is the general form of an OpenGL program?]
  +
   
 
== Getting Started ==
 
== Getting Started ==
   
  +
* Windows users can read how to install OpenGL in the blog article [http://netsuperbrain.com/blog/posts/freeglut-windows-hopengl-hglut/ freeglut + Windows + HOpenGL + HGLUT]
  +
* use the [http://hackage.haskell.org/package/nehe-tuts Haskell port] (Hackage package) of the [http://nehe.gamedev.net/tutorial/lessons_01__05/22004/ NeHe Tutorials]
 
* assuming you know Haskell, any OpenGL tutorial of your choice should get you going (browsing the [http://www.opengl.org OpenGL] site is also a good idea)
 
* assuming you know Haskell, any OpenGL tutorial of your choice should get you going (browsing the [http://www.opengl.org OpenGL] site is also a good idea)
* use the [http://www.opengl.org/documentation/red_book/ Red Book], and its example code translations, to understand the small differences between OpenGL and HOpenGL
+
* use the [http://www.opengl.org/documentation/books/#the_opengl_programming_guide_the_official_guide_to_learning_opengl_version Red Book], and its example code translations, to understand the small differences between OpenGL and HOpenGL
* use the [http://www.opengl.org/documentation/specs/ OpenGL and GLUT specs] to find your way around the [http://hackage.haskell.org/packages/archive/OpenGL/latest/doc/html HOpenGL Haddock documentation]
+
* use the [http://www.opengl.org/documentation/specs/ OpenGL and GLUT specs] to find your way around the [http://hackage.haskell.org/packages/archive/OpenGL/latest/doc/html/ HOpenGL Haddock documentation]
 
* use the [http://www.haskell.org/mailman/listinfo/hopengl HopenGL list] for questions and success stories
 
* use the [http://www.haskell.org/mailman/listinfo/hopengl HopenGL list] for questions and success stories
  +
   
 
== Additional software ==
 
== Additional software ==
  +
  +
* [http://hackage.haskell.org/package/OpenGLRaw OpenGLRaw]: A 1:1 mapping of OpenGL's C API, intended as a basis for a nicer interface. ([http://aedion.de/haskell/SmoothRaw.hs Example code])
  +
* [http://hackage.haskell.org/package/StateVar StateVar]: This package contains state variables, which are references in the IO monad, like IORefs or parts of the OpenGL state
  +
* [http://hackage.haskell.org/package/ObjectName ObjectName]: Explicitly handled object names. This tiny package contains the class ObjectName, which corresponds to the general notion of explicitly handled identifiers for API objects, e.g. a texture object name in OpenGL or a buffer object name in OpenAL
  +
* [http://hackage.haskell.org/package/GLURaw GLURaw]: A raw binding for the OpenGL graphics system. GLURaw is a raw Haskell binding for the GLU 1.3 OpenGL utility library. It is basically a 1:1 mapping of GLU's C API, intended as a basis for a nicer interface
 
* [[FTGL]]: Portable TrueType font rendering for OpenGL using the Freetype2 library
 
* [[FTGL]]: Portable TrueType font rendering for OpenGL using the Freetype2 library
* [http://hackage.haskell.org/cgi-bin/hackage-scripts/package/GLFW GLFW]: A binding for GLFW, An OpenGL Framework
+
* [[GLFW]]: A binding for GLFW, An OpenGL Framework
 
* [http://hackage.haskell.org/cgi-bin/hackage-scripts/package/GLUT GLUT]: A binding for the OpenGL Utility Toolkit
 
* [http://hackage.haskell.org/cgi-bin/hackage-scripts/package/GLUT GLUT]: A binding for the OpenGL Utility Toolkit
 
* [http://hackage.haskell.org/cgi-bin/hackage-scripts/package/graphics-drawingcombinators graphics-drawingcombinators]: A functional interface to 2D drawing in OpenGL
 
* [http://hackage.haskell.org/cgi-bin/hackage-scripts/package/graphics-drawingcombinators graphics-drawingcombinators]: A functional interface to 2D drawing in OpenGL
  +
* [http://hackage.haskell.org/package/Tensor Tensor]: This package contains tensor data types and their instances for some basic type classes.
  +
* [http://hackage.haskell.org/package/GPipe GPipe]: A functional graphics API for programmable GPUs
  +
* [http://hackage.haskell.org/package/freetype2 The freetype2 package]; bindings to [http://www.freetype.org/freetype2/index.html FreeType], a software font engine
   
Somewhat related is [http://libsdl.org/ SDL], which is also based on OpenGL:
+
Somewhat related is [http://www.libsdl.org/ SDL], which is based on OpenGL:
 
* [http://hackage.haskell.org/cgi-bin/hackage-scripts/package/SDL SDL]: Binding to libSDL
 
* [http://hackage.haskell.org/cgi-bin/hackage-scripts/package/SDL SDL]: Binding to libSDL
 
* [http://hackage.haskell.org/cgi-bin/hackage-scripts/package/SDL-gfx SDL-gfx]: Binding to libSDL_gfx
 
* [http://hackage.haskell.org/cgi-bin/hackage-scripts/package/SDL-gfx SDL-gfx]: Binding to libSDL_gfx
 
* [http://hackage.haskell.org/cgi-bin/hackage-scripts/package/SDL-image SDL-image]: Binding to libSDL_image
 
* [http://hackage.haskell.org/cgi-bin/hackage-scripts/package/SDL-image SDL-image]: Binding to libSDL_image
 
* [http://hackage.haskell.org/cgi-bin/hackage-scripts/package/SDL-mixer SDL-mixer]: Binding to libSDL_mixer
 
* [http://hackage.haskell.org/cgi-bin/hackage-scripts/package/SDL-mixer SDL-mixer]: Binding to libSDL_mixer
* [http://hackage.haskell.org/cgi-bin/hackage-scripts/package/SDL-mpeg SDL-mpeg]: Binding to the SMPEG library
+
* [http://hackage.haskell.org/cgi-bin/hackage-scripts/package/SDL-mpeg SDL-mpeg]: Binding to the SMPEG library
 
* [http://hackage.haskell.org/cgi-bin/hackage-scripts/package/SDL-ttf SDL-ttf]: Binding to libSDL_ttf
 
* [http://hackage.haskell.org/cgi-bin/hackage-scripts/package/SDL-ttf SDL-ttf]: Binding to libSDL_ttf
   
Line 61: Line 76:
 
* [http://hackage.haskell.org/cgi-bin/hackage-scripts/package/ALUT ALUT]: A binding for the OpenAL Utility Toolkit
 
* [http://hackage.haskell.org/cgi-bin/hackage-scripts/package/ALUT ALUT]: A binding for the OpenAL Utility Toolkit
   
  +
A fork of HOpenGL:
  +
* [[OGL]]
  +
  +
Experiments with raw bindings to GLFW/OpenGL produced with [[HSFFIG]]
  +
* [http://code.google.com/p/hs-ogl-misc/ hs-ogl-misc]
   
 
== Troubleshooting ==
 
== Troubleshooting ==
  +
 
=== I can't display text with renderString ===
 
=== I can't display text with renderString ===
  +
 
It's probably because the text is displayed too big. Setting a much smaller scale factor before calling renderString should solve the problem.
 
It's probably because the text is displayed too big. Setting a much smaller scale factor before calling renderString should solve the problem.
 
<haskell>
 
<haskell>
Line 69: Line 91:
 
renderString Roman "Test string"
 
renderString Roman "Test string"
 
</haskell>
 
</haskell>
  +
  +
 
=== Animations flicker ===
 
=== Animations flicker ===
  +
 
If you're not using DoubleBuffered display mode, turn that on. Also, you must set the display mode '''before''' creating the window you're going to be drawing in. To check if you've enabled double buffering use something like:
 
If you're not using DoubleBuffered display mode, turn that on. Also, you must set the display mode '''before''' creating the window you're going to be drawing in. To check if you've enabled double buffering use something like:
 
<haskell>
 
<haskell>
Line 79: Line 104:
 
createWindow "My Window"
 
createWindow "My Window"
 
</haskell>
 
</haskell>
You will also need to call [http://hackage.haskell.org/packages/archive/GLUT/latest/doc/html/Graphics-UI-GLUT-Window.html#v%3AswapBuffers <haskell>swapBuffers</haskell>] at the end of your draw function.
+
You will also need to call <haskell> swapBuffers </haskell> at the end of your draw function [http://hackage.haskell.org/packages/archive/GLUT/latest/doc/html/Graphics-UI-GLUT-Window.html#v%3AswapBuffers (Read more about swapBuffers)].
  +
  +
=== The depth buffer doesn't work (things that are closer to the camera are occluded by things that are farther from the camera) ===
  +
  +
Make sure that ''depthFunc'' is set:
  +
<haskell>depthFunc $= Just Less</haskell>
  +
  +
Furthermore, if you're using GLFW, the following var has to be greater than zero:
  +
<haskell>get (windowParam DepthBits)</haskell>
  +
  +
If DepthBits is 0, you probably forgot to initialize the window, like so:
  +
<haskell>openWindow size [DisplayDepthBits 16] Window</haskell>
  +
  +
Once you enable the depth buffer, you will need to clear it before each cycle of your drawing method:
  +
<haskell>clear [ColorBuffer, DepthBuffer]</haskell>
  +
  +
See also: [http://www.opengl.org/archives/resources/faq/technical/depthbuffer.htm#0010 The OpenGL FAQ: 12.010 How do I make depth buffering work?]
  +
  +
  +
== Blog articles ==
  +
  +
* [http://yannesposito.com/Scratch/en/blog/Haskell-OpenGL-Mandelbrot/ Haskell Progressive Example]
  +
  +
   
 
[[Category:Packages]]
 
[[Category:Packages]]
  +
[[Category:Libraries]]
  +
[[Category:Graphics]]
  +
[[Category:3D]]

Revision as of 20:36, 18 July 2013

This article is a stub. You can help by expanding it.

Contents

1 References

In particular, note that the examples/ directory in the GLUT repo contains lots of examples, including translations of the red book examples.

(Note: at least some of these resources appear to be missing from /packages, but there are copies at /ghc-6.8/packages.)

Both the API documentation and the examples are best studied with the original specs and the original red book examples at hand. An index of examples can be found at the OpenGL wiki page Code Resources.


2 Projects using the OpenGL bindings

  • Endless Cavern, a 2D procedurally-generated exploration game.
  • Frag, a 3D first-person shooter game.
  • Monadius, a 2D scrolling arcade game.
  • Roguestar, a roguelike adventure game using 3D graphics.
  • Shu-thing, a 2D scrolling arcade game.
  • Topkata, a jumping ball puzzle game.
  • PolyFunViz, a toolkit for scientific visualization (e.g. surfaces, flows, contours, volumes)
  • Raincat, a 2d puzzle game
  • Gloss, hides the pain of drawing simple vector graphics behind a nice data type and a few display functions


3 HOpenGL Resources


4 OpenGL Resources


5 Getting Started


6 Additional software

  • OpenGLRaw: A 1:1 mapping of OpenGL's C API, intended as a basis for a nicer interface. (Example code)
  • StateVar: This package contains state variables, which are references in the IO monad, like IORefs or parts of the OpenGL state
  • ObjectName: Explicitly handled object names. This tiny package contains the class ObjectName, which corresponds to the general notion of explicitly handled identifiers for API objects, e.g. a texture object name in OpenGL or a buffer object name in OpenAL
  • GLURaw: A raw binding for the OpenGL graphics system. GLURaw is a raw Haskell binding for the GLU 1.3 OpenGL utility library. It is basically a 1:1 mapping of GLU's C API, intended as a basis for a nicer interface
  • FTGL: Portable TrueType font rendering for OpenGL using the Freetype2 library
  • GLFW: A binding for GLFW, An OpenGL Framework
  • GLUT: A binding for the OpenGL Utility Toolkit
  • graphics-drawingcombinators: A functional interface to 2D drawing in OpenGL
  • Tensor: This package contains tensor data types and their instances for some basic type classes.
  • GPipe: A functional graphics API for programmable GPUs
  • The freetype2 package; bindings to FreeType, a software font engine

Somewhat related is SDL, which is based on OpenGL:

To add sound to OpenGL applications:

  • OpenAL: A binding to the OpenAL cross-platform 3D audio API
  • ALUT: A binding for the OpenAL Utility Toolkit

A fork of HOpenGL:

Experiments with raw bindings to GLFW/OpenGL produced with HSFFIG

7 Troubleshooting

7.1 I can't display text with renderString

It's probably because the text is displayed too big. Setting a much smaller scale factor before calling renderString should solve the problem.

scale 0.001 0.001 (0.001∷GLfloat)
renderString Roman "Test string"


7.2 Animations flicker

If you're not using DoubleBuffered display mode, turn that on. Also, you must set the display mode before creating the window you're going to be drawing in. To check if you've enabled double buffering use something like:

db <- get doubleBuffered

and set DoubleBuffered mode (before creating your windows!) like this:

initialDisplayMode $= [DoubleBuffered]
createWindow "My Window"
You will also need to call
 swapBuffers
at the end of your draw function (Read more about swapBuffers).

7.3 The depth buffer doesn't work (things that are closer to the camera are occluded by things that are farther from the camera)

Make sure that depthFunc is set:

depthFunc $= Just Less

Furthermore, if you're using GLFW, the following var has to be greater than zero:

get (windowParam DepthBits)

If DepthBits is 0, you probably forgot to initialize the window, like so:

openWindow size [DisplayDepthBits 16] Window

Once you enable the depth buffer, you will need to clear it before each cycle of your drawing method:

clear [ColorBuffer, DepthBuffer]

See also: The OpenGL FAQ: 12.010 How do I make depth buffering work?


8 Blog articles