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