Haskell OpenGL не откроется в Ubuntu

#opengl #haskell #sdl #ubuntu-11.04 #glfw

#opengl #haskell #sdl #ubuntu-11.04 #glfw

Вопрос:

Это немного странно, но я начну с самого начала:

Насколько я понял, есть 3 способа открыть окно 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
  

Ответ №1:

Это сообщение об ошибке пытается сообщить вам, что ваша комбинация разрядности для цвета, глубины и альфа-буферов («GLX visual») не поддерживается. Чтобы узнать, какие из них вы можете использовать в своей системе, попробуйте запустить 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
...
  

Комментарии:

1. Атрибуты, переданные в glXChooseFBConfig, выбирают необходимые функции minium. Таким образом, выбор для 16-битного буфера глубины может вернуть 24-битный буфер глубины. Результат не возвращается, только если ни один режим не соответствует минимальным требованиям. Или Haskell GLFW выбирает именно запрошенную конфигурацию, что тоже может произойти.

2. Должен признать, что я не могу полностью прочитать эту таблицу, но я пытался возиться с настройками glSetAttribute , но безрезультатно.

3. Вы, вероятно, хотите изменить настройки setVideoMode в дополнение к настройкам в glSetAttribute — если, как у hammar, у вас только 24-разрядный дисплей, то запрос на 32-разрядный дисплей обречен на неудачу.

4. Я установил bpp параметр setVideoMode равным 0, что означает текущие настройки рабочего стола, и удалил все glSetAttribute вызовы, но снова безрезультатно.