2015-02-21 1 views
0

Я читал, что в списках отображения OpenGL v3 устарели, хотя некоторые производители будут поддерживать их в обозримом будущем.Списки отображения OpenGL (устаревшие, но поддерживаемые), как сказать, поддерживаются ли они?

Есть ли функция OpenGL get ..., которая явно говорит мне, если отображаемые списки поддерживаются в драйвере, который я допрашиваю?

ответ

1

Звоните glGetString с помощью GL_VERSION. Если версия равна или меньше 2.1, списки отображения, безусловно, поддерживаются. В случае, если версия больше, это зависит от того, запросили ли вы профиль OpenGL CORE или профиль OpenGL COMPATIBILITY.

Чтобы упростить, если вы создаете контекст с wglCreateContext (или равным на других платформах), вы создаете профиль совместимости. Вы также можете проверить поддержку GL_ARB_compatibility, набрав номер glGetString с помощью GL_EXTENSIONS.

+0

Aha! Спасибо за это. С сайта NVIDIA: «Это означает, что если в расширительной строке OpenGL присутствует имя расширения ARB_compatibility, реализация OpenGL поддерживает полностью совместимый OpenGL 3.1 с обратной совместимостью». –

+0

_ "Если версия равна или ниже 2,1" _ Должно быть 3.1 –

3

Если вы используете хотя бы 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; 
      } 
     } 
    } 
} 
+0

Магия, большое спасибо за это. –

Смежные вопросы