今度は面に色をつけて描いてみます。
隠面消去するためにデプスバッファを有効にします。デプスバッファを有効にするには、initialDisplayModeにWithDepthBufferを追加した上で、depthFuncを指定します。
さらに、視点から見て裏側の面を描画しないようにするために、cullFaceにBackを指定します。視点から見て反時計回りに点が回る面が表面になります。
import Control.Monad import Graphics.Rendering.OpenGL import Graphics.UI.GLUT main = do (progName, _) <- getArgsAndInitialize initialDisplayMode $= [RGBAMode, WithDepthBuffer] createWindow "Window" clearColor $= Color4 1.0 1.0 1.0 0.0 depthFunc $= Just Less cullFace $= Just Back displayCallback $= display reshapeCallback $= Just reshape mainLoop display = do clear [ColorBuffer, DepthBuffer] color $ (Color3 0.0 0.0 0.0 :: Color3 GLfloat) let points :: [(GLfloat, GLfloat, GLfloat)] points = [(0.0, 0.0, 0.0), (1.0, 0.0, 0.0), (1.0, 1.0, 0.0), (0.0, 1.0, 0.0), (0.0, 0.0, 1.0), (1.0, 0.0, 1.0), (1.0, 1.0, 1.0), (0.0, 1.0, 1.0)] faces :: [((Int, Int, Int, Int), Color3 GLfloat)] faces = [((3, 2, 1, 0), Color3 1.0 0.0 0.0), ((2, 6, 5, 1), Color3 0.0 1.0 0.0), ((6, 7, 4, 5), Color3 0.0 0.0 1.0), ((7, 3, 0, 4), Color3 1.0 1.0 0.0), ((0, 1, 5, 4), Color3 1.0 0.0 1.0), ((7, 6, 2, 3), Color3 0.0 1.0 1.0)] preservingMatrix $ do renderPrimitive Quads $ forM_ faces $ \((p, q, r, s), c) -> do let v n = let (x, y, z) = points !! n in Vertex3 x y z color c mapM_ (vertex . v) [p, q, r, s] flush reshape size@(Size w h) = do viewport $= (Position 0 0, size) matrixMode $= Projection loadIdentity perspective 30.0 (fromIntegral w / fromIntegral h) 1.0 100.0 lookAt (Vertex3 3.0 4.0 5.0) (Vertex3 0.0 0.0 0.0) (Vector3 0.0 1.0 0.0)