2012-05-21 52 views
1

我想在OpenGL中的Haskell中獲得一些在3D空間中渲染的對象。不過,我無法弄清楚如何在Z維中渲染形狀。調整三角形點的值會導致它不呈現。 (是否有glEnable等效的,我很想念建立深度緩衝?)如何在Haskell的OpenGL中調整渲染深度?

這裏(編輯爲簡潔起見)代碼:

initGL :: IO() 
initGL = do 
      shadeModel $= Smooth 
      clearDepth $= 1 
      depthFunc $= Just Lequal 
      hint PerspectiveCorrection $= Nicest 

drawFrame :: WindowRefreshCallback 
drawFrame = do 
       clear [ ColorBuffer, DepthBuffer ] 
       loadIdentity 

       renderPrimitive Triangles $ foldl1' (>>) $ map vertex 
        [ Vertex3 0  1 0 -- top 
        , Vertex3 1 (-1) 0 -- bottom right 
        , Vertex3 (-1) (-1) (0 :: GLdouble) -- bottom left 
        ] 

       flush 

main :: IO() 
main = do 
      True <- initialize 
      True <- openWindow (Size 800 600) [] Window 

      ... -- Set window title, set up callbacks 

      initGL 
      clearColor $= toGLColor (Color4 0 175 200 0) 

      doWhile (not <$> readIORef isClosed) $ drawFrame >> swapBuffers 
+0

你改變任何轉換矩陣的第三行? – Nobody

+0

我用'translate'嘗試了一些代碼,但是它沒有做任何事情(w.r.t. Z軸)| Z | <= 1,並沒有渲染| Z | > 1 除此之外,只有對'loadIdentity'的調用影響矩陣(AFAIK) – bfops

+3

沒有任何修改,矩陣將是單位矩陣。因此,您在z軸上的視錐的範圍將介於0和-1之間(相機從座標原點沿着負z軸向下看)。 – Nobody

回答

1

這是我做的設置窗口。我正在使用GLUT進行設置。

main = do 
    (progName, _) <- getArgsAndInitialize 
    initialDisplayMode $= [DoubleBuffered, WithDepthBuffer] 
    createWindow progName 
    windowSize $= Size 640 480 
    <...code omitted...> 

你可能以後是該生產線是設置了一個窗口WithDepthBuffer