Я предполагаю, что вы хотите использовать 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) для верхнего правого угла окна. Вам нужно изменить матрицу проекции, чтобы получить разные координатные пространства.
Более полные примеры, подобные этому, см. порт Haskell из учебников NEHE . Они используют привязки RAW OpenGL, которые больше похожи на привязки C.