2012-02-15 13 views
5

Estoy tratando de crear una tabla de paso usando OpenGL. Para hacer esto, estoy tratando de dibujar un montón de líneas para crear la grilla. Sin embargo, cada sitio de tutorial (incluyendo OpenGL) tiene los ejemplos en C++ y el wiki de Haskell no hace un buen trabajo de explicarlo. Soy nuevo en opengl y me gustaría un tutorial.Dibujando líneas con OpenGL en Haskell

Respuesta

12

Supongo que quiere usar OpenGL 2.1 o una versión anterior. Para OpenGL 3.0, necesita un código diferente.

Así, en C que iba a escribir esto:

glBegin(GL_LINES); 
glVertex3f(1, 2, 3); 
glVertex3f(5, 6, 7); 
glEnd(); 

Usted escribe el equivalente en Haskell como esto:

renderPrimitive Lines $ do 
    vertex $ Vertex3 1 2 3 
    vertex $ Vertex3 5 6 7 

Con este código, que no uso, por ejemplo, 1 en lugar de alguna variable, puede obtener errores sobre tipos ambiguos (por lo tanto, debe reemplazar 1 con (1 :: GLfloat)), pero si usa variables reales que ya tienen el tipo GLfloat, no debería tener que hacer esto.

Aquí está un programa completo que traza una diagonal blanco en la ventana:

import Graphics.Rendering.OpenGL 
import Graphics.UI.GLUT 

main :: IO() 
main = do 
    -- Initialize OpenGL via GLUT 
    (progname, _) <- getArgsAndInitialize 

    -- Create the output window 
    createWindow progname 

    -- Every time the window needs to be updated, call the display function 
    displayCallback $= display 

    -- Let GLUT handle the window events, calling the displayCallback as fast as it can 
    mainLoop 

display :: IO() 
display = do 
    -- Clear the screen with the default clear color (black) 
    clear [ ColorBuffer ] 

    -- Render a line from the bottom left to the top right 
    renderPrimitive Lines $ do 
    vertex $ (Vertex3 (-1) (-1) 0 :: Vertex3 GLfloat) 
    vertex $ (Vertex3 1 1 0 :: Vertex3 GLfloat) 

    -- Send all of the drawing commands to the OpenGL server 
    flush 

El OpenGL predeterminado utiliza la proyección de función fija (-1, -1) para la parte inferior izquierda y (1, 1) para la parte superior derecha de la ventana. Necesita modificar la matriz de proyección para obtener diferentes espacios de coordenadas.

Para obtener ejemplos más completos como este, consulte the Haskell port of the NEHE tutorials. Usan los enlaces RAW OpenGL, que son más parecidos a los enlaces C.

+0

Parece que funcionará para lo que intento hacer, sin embargo, parece que no funciona. El programa se compilará, pero no se dibujan líneas cuando lo ejecuto. Tal vez no estoy haciendo lo correcto, o lo estoy poniendo en el área incorrecta. De nuevo, soy nuevo en opengl y realmente no sé cómo funciona. ¿Hay alguna forma de que me la puedas dar como más un programa completo (uno que un principiante pueda entender)? – lewdsterthumbs

+0

Ok, he agregado un programa de ejemplo completo que funciona en mi computadora. – dflemstr

+2

@lewdsterthumbs Puede disfrutar de [40 formas de obtener una pantalla en negro] (http://dmalcolm.livejournal.com/2433.html). –

1

Una rápida de Google apareció esto:

http://www.haskell.org/haskellwiki/OpenGLTutorial1

En cualquier caso, ya que OpenGL es originalmente una biblioteca de C, es posible que desee conseguir sus pies mojados en C (o C++) en primer lugar, ya que se Podré usar la documentación original de OpenGL tal como está; después de eso, es posible que desee profundizar en las vinculaciones de Haskell y ver cómo utiliza las mismas llamadas OpenGL en Haskell.

+0

Ya he visto esto. Tiene muchas fotos, pero realmente no explica cómo hacer nada. – lewdsterthumbs

+2

Sí, pero no es inmediatamente obvio. – tdammers