2012-02-15 6 views
5

Я пытаюсь создать доску с использованием opengl. Чтобы сделать это, я пытаюсь нарисовать кучу строк, чтобы создать сетку. Тем не менее, на каждом сайте учебника (в том числе opengl's) есть примеры на C++, а вики Haskell не очень хорошо объясняют это. Я новичок в opengl и хотел бы получить учебник.Линии рисования с opengl в Haskell

ответ

12

Предполагаю, что вы хотите использовать OpenGL 2.1 или ранее. Для OpenGL 3.0 вам нужен другой код.

Так, в C можно было бы написать так:

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

Вы пишете эквивалент в Haskell, как это:

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

С этим кодом, так как я, например, 1 вместо некоторой переменной вы можете получить ошибки о неоднозначных типах (поэтому вы должны заменить 1 на (1 :: GLfloat)), но если вы используете фактические переменные, которые уже имеют тип GLfloat, вам не нужно это делать.

Вот полная программа, которая рисует белую диагональ в окне:

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 

по умолчанию OpenGL проекции фиксированной функция использует (-1, -1) в левом нижнем углу и (1, 1) для в правом верхнем углу окна. Вам нужно изменить матрицу проекции, чтобы получить разные координатные пространства.

Для получения более полных примеров см. the Haskell port of the NEHE tutorials. Они используют привязки RAW OpenGL, которые больше похожи на привязки C.

+0

Похоже, что это сработает для того, что я пытаюсь сделать, но похоже, что это не работает. Программа будет скомпилирована, но при ее запуске никаких строк не будет. Возможно, я не прав, или помещаю его в неправильную область. Опять же, я новичок в opengl и не знаю, как это работает. Есть ли способ, который вы могли бы дать мне, как более полную программу (которую понимал бы новичок)? – lewdsterthumbs

+0

Хорошо, я добавил полную примерную программу, которая работает на моем компьютере. – dflemstr

+2

@lewdsterthumbs Вам может понравиться [40 способов получить пустой черный экран] (http://dmalcolm.livejournal.com/2433.html). –

1

Быстрый Google появился этот:

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

В любом случае, так как OpenGL изначально библиотека C, вы можете получить ваши ноги мокрые в C (или C++) первой, так как вы 'можно использовать исходную документацию OpenGL как есть; после этого вы можете захотеть вникнуть в привязки Haskell и посмотреть, как вы используете те же вызовы OpenGL в Haskell.

+0

Я уже посмотрел на это. В нем много картин, но на самом деле это не объясняет, как это сделать. – lewdsterthumbs

+2

Он делает, но это не сразу очевидно. – tdammers

Смежные вопросы