Personal tools

OpenGL

From HaskellWiki

(Difference between revisions)
Jump to: navigation, search
(Projects using the OpenGL bindings: Added a link to the reverse dependencies list on haskellers.com)
m
Line 30: Line 30:
   
 
See also the [http://packdeps.haskellers.com/reverse/OpenGL reverse dependencies list on haskellers.com]
 
See also the [http://packdeps.haskellers.com/reverse/OpenGL reverse dependencies list on haskellers.com]
  +
   
 
== HOpenGL Resources ==
 
== HOpenGL Resources ==
Line 78: Line 79:
 
Experiments with raw bindings to GLFW/OpenGL produced with [[HSFFIG]]
 
Experiments with raw bindings to GLFW/OpenGL produced with [[HSFFIG]]
 
* [http://code.google.com/p/hs-ogl-misc/ hs-ogl-misc]
 
* [http://code.google.com/p/hs-ogl-misc/ hs-ogl-misc]
  +
   
 
== Troubleshooting ==
 
== Troubleshooting ==
Line 102: Line 104:
 
</haskell>
 
</haskell>
 
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)].
 
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) ===
 
=== The depth buffer doesn't work (things that are closer to the camera are occluded by things that are farther from the camera) ===

Revision as of 20:29, 19 October 2013

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

Contents

1 References

  • Starting with 2013.2.0.0, the OpenGL packages are part of the Haskell platform, so you can find the API documentation there.
  • Hackage hosts the individual OpenGL binding packages, including their latest API documentation:
    • OpenGLRaw contains a low-level wrapper around OpenGL, which is basically a 1:1 mapping of the C API.
    • GLURaw is similar to OpenGLRaw, just for the GLU part of OpenGL.
    • OpenGL is the high-level view on OpenGL, wrapping OpenGLRaw into something more Haskell-like.
    • GLUT is a binding for the OpenGL Utility Toolkit.
  • The HOpenGL mailing list can be used for all discussions regarding the use of OpenGL from Haskell.

The examples directory in the GLUT package contains lots of examples, including translations of the Red Book examples. Both the API documentation and theses 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

See also the reverse dependencies list on haskellers.com


3 HOpenGL Resources


4 OpenGL Resources


5 Getting Started


6 Additional software

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