Если вы используете хотя бы OpenGL 3.0, вы можете запросить все данные с помощью glGetIntegerv()
. Если вы имеете дело с еще более старой версией, сначала вам нужно будет проверить glGetString(GL_VERSION)
. Если это ниже 3.0, все готово (с поддерживаемыми списками отображения). В противном случае выполните приведенные ниже проверки.
В 3.0 и выше, вы также можете получить текущую версию с:
GLint majVers = 0, minVers = 0;
glGetIntegerv(GL_MAJOR_VERSION, &majVers);
glGetIntegerv(GL_MINOR_VERSION, &minVers);
Хотя основной профиль был введен только в 3.2, списки отображения были уже отмечены как осуждается с 3.0. В то время был введен флаг «прямой совместимости». Поэтому теоретически вы можете реализовать версию 3.0 без поддержки списков отображения. Затем, начиная с 3.2, все, что использует основной профиль, очевидно, не имеет списков отображения.
Это проверялось, но я считаю, что правильная логика, чтобы проверить это будет выглядеть следующим образом:
bool hasDisplayLists = true;
if (strcmp(glGetString(GL_VERSION), "3") > 0) {
// Check for forward-compatible flag in 3.0 and higher.
GLint ctxFlags = 0;
glGetIntegerv(GL_CONTEXT_FLAGS, &ctxFlags);
if (ctxFlags & GL_CONTEXT_FLAG_FORWARD_COMPATIBLE_BIT) {
hasDisplayLists = false;
} else {
GLint majVers = 0, minVers = 0;
glGetIntegerv(GL_MAJOR_VERSION, &majVers);
glGetIntegerv(GL_MINOR_VERSION, &minVers);
// Check for core profile in 3.2 and higher.
if (majVers > 3 || minVers >= 2) {
GLint profMask = 0;
glGetIntegerv(GL_CONTEXT_PROFILE_MASK, profMask);
if (profMask & GL_CONTEXT_CORE_PROFILE_BIT) {
hasDisplayLists = false;
}
}
}
}
Aha! Спасибо за это. С сайта NVIDIA: «Это означает, что если в расширительной строке OpenGL присутствует имя расширения ARB_compatibility, реализация OpenGL поддерживает полностью совместимый OpenGL 3.1 с обратной совместимостью». –
_ "Если версия равна или ниже 2,1" _ Должно быть 3.1 –