Difference between revisions of "OpenGL"

From HaskellWiki
Jump to navigation Jump to search
(Added OpenGLRaw; added category "Stub articles")
(Updated some links)
Line 12: Line 12:
 
* [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]
+
* [http://darcs.haskell.org/packages/OpenGL/ the darcs repo with the sources for the OpenGL binding]
   
 
* [http://darcs.haskell.org/packages/GLUT/ the darcs repo with the sources for the GLUT binding]
 
* [http://darcs.haskell.org/packages/GLUT/ the darcs repo with the sources for the GLUT binding]
Line 22: Line 22:
 
== Projects using the OpenGL bindings ==
 
== Projects using the OpenGL bindings ==
   
* [http://www.maths.tcd.ie/~icecube/2008/11/endless-cavern/ Endless Cavern], a 2D procedurally-generated exploration game.
+
* [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.
 
* [http://www.geocities.jp/takascience/haskell/monadius_en.html Monadius], a 2D scrolling arcade game.
 
* [http://www.geocities.jp/takascience/haskell/monadius_en.html Monadius], a 2D scrolling arcade game.
Line 47: Line 47:
 
* 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/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/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
   
Line 57: Line 57:
 
* [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
   
Somewhat related is [http://libsdl.org/ SDL], which is also based on OpenGL:
+
Somewhat related is [http://www.libsdl.org/ SDL], which is also 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

Revision as of 18:05, 11 June 2009

This article is a stub. You can help by expanding it. 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 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

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

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 the examples from v1.1 of the red book, with screen shots, can be found here

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 scroling arcade game.
  • Topkata, a jumping ball puzzle game.
  • PolyFunViz, a toolkit for scientific visualization (e.g. surfaces, flows, contours, volumes)

HOpenGL Resources

OpenGL Resources

Getting Started

Additional software

  • OpenGLRaw: A 1:1 mapping of OpenGL'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

Somewhat related is SDL, which is also 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:


Troubleshooting

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.001GLfloat)
renderString Roman "Test string"

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.

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?