具有haskell GLUT绑定的透明度/ Alpha

时间:2017-11-11 23:59:44

标签: haskell opengl glut

使用Haskell GLUT binding,我以两种方式修改了Hello World example

  1. WithAlphaComponent添加到initialDisplayMode
  2. 将颜色更改为Color4 0.5不透明度。
  3. 我希望它能显示一个半透明的白色方块,背景为红色。相反,它显示一个纯白色方块,就好像忽略了不透明度一样。我无法弄清楚为什么这不起作用?

    import Graphics.UI.GLUT
    
    display :: DisplayCallback
    display = do
       -- clear all pixels
       clear [ ColorBuffer ]
    
       -- draw white polygon (rectangle) with corners at
       -- (0.25, 0.25, 0.0) and (0.75, 0.75, 0.0)
    
       -- CHANGE #2
       color (Color4 1.0 1.0 (1.0 :: GLfloat) 0.5)
    
       -- resolve overloading, not needed in "real" programs
       let vertex3f = vertex :: Vertex3 GLfloat -> IO ()
       renderPrimitive Polygon $ mapM_ vertex3f [
          Vertex3 0.25 0.25 0.0,
          Vertex3 0.75 0.25 0.0,
          Vertex3 0.75 0.75 0.0,
          Vertex3 0.25 0.75 0.0]
    
       -- don't wait!
       -- start processing buffered OpenGL routines
       flush
    
    myInit :: IO ()
    myInit = do
       -- select clearing color
       clearColor $= Color4 0.7 0 0 0
    
       -- initialize viewing values
       matrixMode $= Projection
       loadIdentity
       ortho 0 1 0 1 (-1) 1
    
    -- Declare initial window size, position, and display mode (single buffer and
    -- RGBA). Open window with "hello" in its title bar. Call initialization
    -- routines. Register callback function to display graphics. Enter main loop and
    -- process events.
    main :: IO ()
    main = do
       _ <- getArgsAndInitialize
       -- CHANGE #1
       initialDisplayMode $= [ SingleBuffered, RGBMode, WithAlphaComponent ]
       initialWindowSize $= Size 250 250
       initialWindowPosition $= Position 100 100
       _ <- createWindow "hello"
       myInit
       displayCallback $= display
       mainLoop
    

1 个答案:

答案 0 :(得分:3)

取自Alpha.hs示例。

-- Initialize alpha blending function.
myInit :: IO ()
myInit = do
   blend $= Enabled
   blendFunc $= (SrcAlpha, OneMinusSrcAlpha)
   shadeModel $= Flat
   clearColor $= Color4 0 0 0 0