#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
вызовы, но снова безрезультатно.