【问题标题】:Haskell OpenGL: Transparency not workingHaskell OpenGL:透明度不起作用
【发布时间】:2012-12-22 16:56:29
【问题描述】:

我正在使用 Haskell 制作一个非常简单的 OpenGL 应用程序,现在只是制作了一些多边形。我的主要功能如下所示:

main :: IO ()
main = do
    (pname, _) <- getArgsAndInitialize
    createWindow $ "Haskellisa"
    initialDisplayMode $= [RGBAMode, WithAlphaComponent]
    displayCallback $= display
    mainLoop

我的“显示”函数绘制了一些三角形并使用 Color4 设置颜色,该 Color4 具有随机生成的 RGBA 值,GLfloats 介于 0.0 和 1.0 之间。一切正常,但没有透明度,重叠的多边形不会混合它们的颜色。

我正在使用这个函数绘制三角形:

drawTri :: Tri Float -> Color4 GLfloat -> IO ()
drawTri ((x1,y1), (x2,y2), (x3,y3)) col = do
    renderPrimitive Triangles $ do
        color col
        vertex $ (Vertex3 (x1 :: GLfloat) (y1 :: GLfloat) 0)
        vertex $ (Vertex3 (x2 :: GLfloat) (y2 :: GLfloat) 0)
        vertex $ (Vertex3 (x3 :: GLfloat) (y3 :: GLfloat) 0)

为什么我的透明度在这里不起作用?

【问题讨论】:

  • 什么是深度缓冲区比较?如果您拒绝具有相等 Z 的像素,并且它们都处于相同的深度,则不会渲染重叠的像素。
  • WithAlphaComponent 启用GL_BLEND?

标签: opengl haskell transparency rgba


【解决方案1】:

我假设[RGBAMode, WithAlphaComponent] 只是为了设置位深度

我不确定它在 Haskell 中是如何完成的,但您必须致电 glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);glEnable( GL_BLEND );。您还必须将透明的脸重新画到前面。

在此处了解更多信息:http://www.opengl.org/wiki/Transparency_Sorting

【讨论】:

  • 成功了! Haskell 翻译:blend $= Enabled' and blendFunc $= (SrcAlpha, OneMinusSrcAlpha)`
  • 我也不知道为什么要设置[RGBAMode, WithAlphaComponent],这只是一个猜测,我删除了它,但一切仍然如我所愿。
【解决方案2】:

只需添加:

blend $= Enabled >>
blendFunc $= (SrcAlpha, OneMinusSrcAlpha) >>

到你的显示功能。

它对我有用! :)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多