Haskell OpenGL: прозрачность не работает

Я делаю очень простое приложение OpenGL с Haskell, в данный момент просто заставляю несколько полигонов появляться. Моя основная функция выглядит так:

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

моя функция «отображение» рисует несколько треугольников и устанавливает цвета, используя 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)

Почему моя прозрачность здесь не работает?


person Sam Stern    schedule 08.01.2013    source источник
comment
Что такое сравнение буфера глубины? Если вы отклоните пиксели с одинаковым Z, и все они будут иметь одинаковую глубину, никакие перекрывающиеся пиксели не будут визуализированы.   -  person JasonD    schedule 08.01.2013
comment
WithAlphaComponent включает GL_BLEND?   -  person Luke B.    schedule 08.01.2013


Ответы (2)


Я предполагаю, что [RGBAMode, WithAlphaComponent] просто устанавливает битовую глубину

Я не уверен, как это делается в Haskell, но вы должны вызывать glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); и glEnable( GL_BLEND );. Вам также придется рисовать прозрачные лица задом наперед.

Подробнее об этом здесь: http://www.opengl.org/wiki/Transparency_Sorting

person Luke B.    schedule 08.01.2013
comment
Это сработало! Перевод Haskell: blend $= Enabled' and blendFunc $= (SrcAlpha, OneMinusSrcAlpha)` - person Sam Stern; 08.01.2013
comment
Также я понятия не имел, почему я устанавливал [RGBAMode, WithAlphaComponent], это было просто предположение, я удалил его, и все по-прежнему работает так, как я хотел. - person Sam Stern; 08.01.2013

Просто добавь:

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

к вашей функции отображения.

Это сработало для меня! :)

person Juan Carlos Kuri Pinto    schedule 13.01.2014