在Haskell中使用opengl绘制线条

时间:2012-02-15 20:25:12

标签: opengl haskell

我正在尝试使用opengl创建一个go board。为此,我试图绘制一堆线来创建网格。但是,每个教程站点(包括opengl)都有C ++中的示例,而Haskell wiki并没有很好地解释它。我是opengl的新手,想要一个教程。

2 个答案:

答案 0 :(得分: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绑定。

答案 1 :(得分:1)

快速谷歌出现了这个:

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

在任何情况下,由于OpenGL最初是一个C库,您可能希望首先使用C(或C ++),因为您将能够原样使用原始的OpenGL文档;之后,您可能想深入了解Haskell绑定,并了解如何在Haskell中使用相同的OpenGL调用。