GLFW открывает контекст OpenGL 3.2, а Freeglut не может — почему?

Я работаю на Mac, у меня скомпилирован и установлен FreeGlut, но я не могу получить с ним контекст OpenGL 3.2. Однако я могу без проблем получить его при использовании GLFW. Итак, в GLFW этот код отлично работает:

    glfwOpenWindowHint(GLFW_OPENGL_VERSION_MAJOR, 3);
    glfwOpenWindowHint(GLFW_OPENGL_VERSION_MINOR, 2);
    glfwOpenWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
    glfwOpenWindow(500, 500, 8, 8, 8, 8, 24, 8, GLFW_WINDOW)

Но с FreeGlut этот код не работает (на glutCreateWindow):

glutInitContextVersion (3, 2);
glutInitContextProfile(GLUT_CORE_PROFILE);  
glutInitWindowSize (width, height); 
glutInitWindowPosition (300, 200);
int window = glutCreateWindow (argv[0]);

Ошибка, с которой он не работает:

X Error of failed request:  BadRequest (invalid request code or no such operation)
  Major opcode of failed request:  34 (X_UngrabKey)
  Serial number of failed request:  29
  Current serial number in output stream:  29

Я работаю на MacOS X 10.8 Mountain Lion с графикой Intel HD4000, установил XQuartz в качестве сервера X11, скомпилировал и установил FreeGlut 2.8 из исходников.

Кто-нибудь знает, в чем может быть проблема?


person gambiting    schedule 26.02.2013    source источник
comment
У меня точно такая же проблема, но я использую FreeGlut, включенный в XQuartz (opt/x11/lib opt/x11/include). Вы решили проблему?   -  person Christoph    schedule 29.09.2013
comment
Та же проблема здесь - вы смогли решить проблему?   -  person M-V    schedule 12.11.2013
comment
Кто-нибудь из вас решил проблему? У меня такая же проблема. Я использую freeGlut, включенный в XQuartz.   -  person ammar26    schedule 29.01.2014
comment
Лучше всего просто придерживаться glfw, я застрял с той же проблемой в OS X 10.10. Код компилируется нормально, но потом вылетает при запуске. Настройте XQuartz. Безуспешно пытался получить версию 3.2   -  person Joseph    schedule 03.04.2015


Ответы (3)


В 10.8 и 10.7 GL 3.2 доступен, если вы явно вызываете его при настройке контекста GL. Apple называет это «основным профилем», чтобы отличить его от «устаревшего профиля», которым является GL 2.1.

Я столкнулся с этой проблемой с Wine на OSX, он не поддерживает OpenGL 3.2. Насколько я понимаю, сервер X11 (либо Apple X11, либо XQuartz) в настоящее время не реализует поддержку 3.2, и нет переключателя, который можно было бы где-то перевернуть, чтобы включить его. Это может быть связано с проблемами совместимости, поскольку профиль 3.2 нарушит некоторые существующие приложения GL

В этом сообщении предлагается использовать GLFW (или, может быть, GLUT.framework от Apple, если еще есть такое)

Эта страница объясняет стек GL на OSX и подтверждает проблему 2.1 с GLX.

person wally    schedule 26.02.2013
comment
Извините, но не понимаю, как это относится к моему вопросу. Как я показал, он РАБОТАЕТ с GLFW, который работает поверх XQuartz в моей системе, поэтому он определенно поддерживает контексты 3.2. - person gambiting; 27.02.2013
comment
Извините, но не понимаю, как это относится к моему вопросу. Как я уже сказал, OpenGL 3.2 РАБОТАЕТ с GLFW, который работает поверх XQuartz в моей системе, поэтому он определенно поддерживает контексты 3.2. Моя единственная проблема заключается в том, что я хотел бы использовать freeglut, просто потому, что это более удобно. Но если это невозможно, то я буду разрабатывать с помощью GLFW. Но, пожалуйста, не говорите мне, что невозможно получить контекст 3.2, потому что он у меня уже есть. - person gambiting; 27.02.2013
comment
У glfw также есть порт Cocoa и Carbon. уверены, что он работает поверх XQuartz? - person wally; 27.02.2013

Freeglut является расширенной реализацией SGI GLUT Toolkit и (за некоторыми исключениями, связанными с устаревшим оборудованием) реализует те же функции.

К сожалению, это включает в себя ряд функций, которые не работают в строго CORE/FORWARD COMPATIBLE реализации.

Как правило, если вы запрашиваете контекст БЕЗ указания версии или профиля, вы получите лучшее, что может предложить комбинация драйвера и инструментария GL, что обычно является профилем совместимости, а не основным профилем.

Обратите внимание, что единственное, что вы теряете при использовании профиля совместимости, — это предполагаемая проверка устаревших функций. Все новые основные функции должны работать без проблем.

Эта проблема с freeglut не ограничивается Apple, она также проявляется в Linux с использованием некоторых драйверов Gallium. Неясно, есть ли какое-либо краткосрочное намерение исправить это, поэтому, если вам нужно использовать CORE/FORWARD COMPATIBLE, вам, вероятно, следует переключиться на GLFW или SDL.

person Roger Barrett    schedule 23.02.2014

Вам нужно включить флаг. обычно под версией. Это должно выглядеть примерно так:

glutInitContextFlag(GLUT_FOWARD_COMPATIBLE);
person jonny    schedule 14.07.2014