Я пытаюсь использовать более позднюю версию OpenGL, чем версия 2.1 по умолчанию на моем Mac с помощью GLUT_3_2_CORE_PROFILE
при инициализации GLUT. Однако это приводит к сбою первой операции OpenGL с недопустимая операция. До вызова этой первой функции не сообщалось об ошибке, и не было сгенерированной ошибки без GLUT_3_2_CORE_PROFILE
,
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_3_2_CORE_PROFILE | GLUT_DOUBLE | GLUT_RGBA);
glutInitWindowSize(500, 500);
glutCreateWindow("Demo");
glutDisplayFunc(displayListener);
errorCheck();
glMatrixMode(GL_PROJECTION);
errorCheck();
Содержание errorCheck
это просто:
GLenum error;
while ((error = glGetError())) {
std::cout << "OpenGL error " << error << ": " << gluErrorString(error);
}
Согласно заголовку, ошибка 1282 возникает при втором вызове errorCheck
только:
OpenGL error 1282: invalid operation
Строка версии сообщается как 2.1 ATI-1.51.8
без GLUT_3_2_CORE_PROFILE
а также 4.1 ATI-1.51.8
с. Требуется ли дальнейшая инициализация в этой новой версии OpenGL?
glMatrixMode
является частью устаревшей Трубопровод с фиксированной функцией и недоступен в профиле ядра OpenGL 3.2.
GLUT использует Legacy Profile по умолчанию для всех созданных контекстов OpenGL. Вы должны опустить GLUT_3_2_CORE_PROFILE
:
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA);
или же Вы должны ограничить себя функциональностью основного профиля.
Подробные спецификации и различия между профилем ядра и режимом прямой совместимости можно найти на Спецификация OpenGL — реестр Khronos OpenGL
Увидеть Khronos wiki — Контекст OpenGL:
В OpenGL версии 3.0 появилась идея об устаревании функциональности. Многие функции OpenGL объявлены устаревшими, что означает, что пользователям следует избегать их использования, поскольку они могут быть удалены из более поздних версий API. OpenGL 3.1 удалил почти всю функциональность, которая устарела в OpenGL 3.0. Это включает в себя Трубопровод с фиксированной функцией.
….
Новое расширение, ARB_compatibility, был представлен, когда был открыт OpenGL 3.1. Наличие этого расширения является сигналом для пользователя, что устаревшие или удаленные функции по-прежнему доступны через исходные точки входа и перечисления. Поведение таких реализаций определяется отдельным, гораздо большим, Спецификация OpenGL. Таким образом, была обратно-совместимая спецификация и не обратно-совместимая спецификация.
Однако, поскольку многие реализации в любом случае поддерживают устаревшие и удаленные функции, некоторые реализации хотят иметь возможность предоставить пользователям старших версий GL возможность получить доступ к старым API. Было опробовано несколько методик, и он попал в разделение между контекстами Core и Compatibility.
Увидеть Khronos wiki — конвейер с фиксированной функцией:
OpenGL 3.0 был последней редакцией спецификации, которая полностью поддерживала как фиксированные, так и программируемые функции. Тем не менее, большинство аппаратных средств со времен поколения OpenGL 2.0 испытывали недостаток в реальном оборудовании с фиксированной функцией. Вместо этого процессы с фиксированной функцией эмулируются шейдерами, созданными системой.
В OpenGL 3.2 Основной профиль не хватает этих концепций с фиксированной функцией. Профиль совместимости держит их вокруг. Однако большинство новых функций OpenGL не могут работать с фиксированной функцией, даже если теоретически возможно, что они взаимодействуют.
Увидеть Хронос вики — Legacy OpenGL:
В 2008 году была выпущена версия 3.0 спецификации OpenGL. С этой ревизией Трубопровод с фиксированной функцией а также большинство связанных функций и констант OpenGL объявлены устаревшими. Эти устаревшие элементы и концепции теперь обычно называют устаревшим OpenGL.
Устаревший OpenGL по-прежнему поддерживается некоторыми реализациями, которые поддерживают ядро OpenGL 3.1 или выше, и GL_ARB_compatibility расширение. Реализации, которые не предоставляют это расширение, предлагают только функции, определенные в базовой спецификации OpenGL, на которой основана реализация.
Других решений пока нет …