Рисование линий с помощью opengl в Haskell - PullRequest
5 голосов
/ 16 февраля 2012

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

Ответы [ 2 ]

12 голосов
/ 16 февраля 2012

Я предполагаю, что вы хотите использовать 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.

1 голос
/ 16 февраля 2012

Быстрый Google обнаружил это:

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...