Это немного странно, но я начну с самого начала:
Насколько я понял, существует три способа открыть окно OpenGL в Haskell: GLUT, GLFW и SDL.Я вообще не хочу использовать GLUT, потому что он заставляет вас использовать IORef
s и в основном работать только в монаде IO
.Поэтому я попробовал GLFW и сделал небольшую штуку на своем ноутбуке, который использует Xubuntu с настольной системой XFCE.
Теперь я был счастлив и скопировал его на свой рабочий стол, довольно свежую установленную стандартную Ubuntu с Unity, и былпоражен, ничего не увидев.Тот же самый код GLFW, который отлично работал на ноутбуке, был пойман в бесконечный цикл, прежде чем он открыл окно.
Именно тогда я перенес все это на SDL.С тем же кодом, тем же окном и SDL происходит сбой с
Main.hs: user error (SDL_SetVideoMode
SDL message: Couldn't find matching GLX visual)
Я проверил с помощью SDLgears , используя тот же метод для открытия окна, и он работает нормально.То же самое с некоторыми другими 3D-приложениями, и OpenGL прекрасно работает.
Что меня смущает, так это то, что оно работает под XUbuntu, но не на Ubuntu.Я что-то здесь упускаю?Да, и если это поможет, функция открытия окна:
runGame w h (Game g) = withInit [InitVideo] $ do
glSetAttribute glRedSize 8
glSetAttribute glGreenSize 8
glSetAttribute glBlueSize 8
glSetAttribute glAlphaSize 8
glSetAttribute glDepthSize 16
glSetAttribute glDoubleBuffer 1
_ <- setVideoMode w h 32 [OpenGL, Resizable]
matrixMode $= Projection
loadIdentity
perspective 45 (fromIntegral w / fromIntegral h) 0.1 10500.0
matrixMode $= Modelview 0
loadIdentity
shadeModel $= Smooth
hint PerspectiveCorrection $= Nicest
depthFunc $= Just Lequal
clearDepth $= 1.0
g