Haskell OpenGL:透明度无效

4

我正在使用Haskell制作一个非常简单的OpenGL应用程序,目前只需要让一些多边形出现。我的主要函数如下:

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

我的“display”函数绘制了一些三角形,并使用具有随机生成的0.0到1.0之间的GLfloats RGBA值的Color4设置颜色。所有东西都能够正常工作,但是没有透明度,重叠的多边形不会混合它们的颜色。
我正在使用这个函数绘制三角形:
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值的像素,并且它们都在同一深度,那么不会呈现重叠像素。 - JasonD
WithAlphaComponent 是否启用了 GL_BLEND - Luke B.
2个回答

5

我假设 [RGBAMode, WithAlphaComponent] 只是用于设置位深度

我不确定在Haskell中如何实现,但您需要调用glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);glEnable(GL_BLEND);。您还需要按照后到前的顺序绘制透明面。

更多相关信息,请参阅:http://www.opengl.org/wiki/Transparency_Sorting


4
成功了!Haskell翻译:blend $= Enabled'和blendFunc $=(SrcAlpha,OneMinusSrcAlpha)`。 - Sam Stern
我也不知道为什么要设置 [RGBAMode, WithAlphaComponent],这只是一个猜测,但我将其删除后,一切都按照我的预期工作。 - Sam Stern

3

只需添加:

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

应用到你的显示函数中。

这对我起作用了! :)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接