Haskell OpenGL赢得了';无法在Ubuntu中打开
这个有点奇怪,但我将从一开始开始: 据我所知,有3种方法可以在Haskell中打开OpenGL窗口:GLUT、GLFW和SDL。我根本不想使用GLUT,因为它迫使您使用Haskell OpenGL赢得了';无法在Ubuntu中打开,opengl,haskell,sdl,ubuntu-11.04,glfw,Opengl,Haskell,Sdl,Ubuntu 11.04,Glfw,这个有点奇怪,但我将从一开始开始: 据我所知,有3种方法可以在Haskell中打开OpenGL窗口:GLUT、GLFW和SDL。我根本不想使用GLUT,因为它迫使您使用IORefs,并且基本上只在IOmonad中工作。所以我尝试了GLFW,在我的笔记本电脑上做了一点东西,它使用Xubuntu和XFCE桌面系统 现在我很高兴,把它复制到我的桌面上,这是一个安装了Unity的全新标准Ubuntu,我惊讶地发现什么都没有。在笔记本电脑上运行良好的GLFW代码在打开窗口之前就陷入了无休止的循环 然后我把
IORef
s,并且基本上只在IO
monad中工作。所以我尝试了GLFW,在我的笔记本电脑上做了一点东西,它使用Xubuntu和XFCE桌面系统
现在我很高兴,把它复制到我的桌面上,这是一个安装了Unity的全新标准Ubuntu,我惊讶地发现什么都没有。在笔记本电脑上运行良好的GLFW代码在打开窗口之前就陷入了无休止的循环
然后我把它全部移植到SDL。相同的代码、相同的窗口和SDL崩溃
Main.hs: user error (SDL_SetVideoMode
SDL message: Couldn't find matching GLX visual)
我用同样的方法打开了一个窗口,它工作得很好。和其他一些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
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
_此错误消息试图告诉您,不支持颜色、深度和alpha缓冲区的位深度组合(“GLX视觉”)。要查看您可以在系统上使用哪些,请尝试运行glxinfo
$ glxinfo
...
65 GLX Visuals
visual x bf lv rg d st colorbuffer sr ax dp st accumbuffer ms cav
id dep cl sp sz l ci b ro r g b a F gb bf th cl r g b a ns b eat
----------------------------------------------------------------------------
0x023 24 tc 0 32 0 r y . 8 8 8 8 . . 0 24 8 16 16 16 16 0 0 None
0x024 24 tc 0 32 0 r . . 8 8 8 8 . . 0 24 8 16 16 16 16 0 0 None
0x025 24 tc 0 32 0 r y . 8 8 8 8 . . 0 24 0 16 16 16 16 0 0 None
0x026 24 tc 0 32 0 r . . 8 8 8 8 . . 0 24 0 16 16 16 16 0 0 None
0x027 24 tc 0 32 0 r y . 8 8 8 8 . . 0 24 8 0 0 0 0 0 0 None
...
传递给glXChooseFBConfig的属性选择所需的最小功能。因此,选择16位深度缓冲区可能会返回24位深度缓冲区。只有当没有模式符合最低要求时,才会返回结果。或者Haskell GLFW也会为请求的配置选择正确的配置。我必须承认,我不能完全阅读该表,但我尝试过摆弄glSetAttribute
上的设置,但是没有用。除了glSetAttribute
上的设置之外,你可能还想摆弄setVideoMode
上的设置——如果像hammar一样,你只有24位显示器,那么要求32位显示器肯定会失败。我已经将setVideoMode
的bpp
参数设置为0,这意味着当前桌面设置,并删除了所有glSetAttribute
调用,但再次无效。