Обязателен ли GLEW для современного приложения OpenGL?

Я читал в файле заголовка gl.h, включенном в мою версию Visual Studio, и кажется, что он сильно устарел.

Я не хочу, чтобы GLUT или любая другая промежуточная/утилитная библиотека между ними выполняли грязную работу для меня, включая GLEW. Мог ли кто-нибудь выяснить, почему и как получить/запросить современный набор функций спецификации 4.0 и какова идея GLEW вообще?

Ответ 1

Доставка gl.h с помощью MSVС++ распространяется только на функции, экспортируемые с помощью opengl32.dll, с Windows. Эта DLL в основном является только так называемым "батутом" в фактическом драйвере. Но он экспортирует очень старую версию OpenGL, а именно OpenGL-1.1.

Доступ к любой функции, превышающей должен через механизм расширения.

Я не хочу, чтобы GLUT или любая другая промежуточная/полезная библиотека между ними выполняли грязную работу для меня, включая GLEW.

GLUT полностью не связан с GLEW

Может ли кто-нибудь выяснить, почему и как получить/запросить современный набор функций спецификации 4.0 и какова идея GLEW вообще?

Вы приобретаете современный набор функций через уже упомянутую систему расширений.

Существует функция ?glGetProcAddress (точное имя в зависимости от среды ОС, в Windows wglGetProcAddress). Используя эту функцию, вы получаете указатели на функции расширений для текущего контекста OpenGL (в GLX указатели на функции одинаковы для всех контекстов, но в Windows они могут отличаться).

Загрузка расширения происходит примерно так:

typedef (*OGLEXTP_SOMEEXTENSIONFUNCTION)(...)
OGLEXTP_SOMEEXTENSIONFUNCTION oglextp_glSomeExtensionFunction = NULL;
#define glSomeExtensionFunction oglextp_glSomeExtensionFunction;


struct Extensions
{
    bool SomeExtensionFunction;
}

errorcode initGLExtensions(){
    Extensions available;

    GLubyte extensions = glGetStrings(GL_EXTENSIONS);
    parse_extension_string(extensions, available);

    if( available.SomeExtensionFunction ) {
        oglextp_glSomeExtensionFunction = wglGwtProcAddress("glSomeExtensionFunction");
        if( !oglextp_glSomeExtensionFunction )
             return errorcode;
    }
}

И вы должны написать массовый код этого для каждой функции. Никто не хочет писать это. Таким образом, разработчики GLEW разработали набор сценариев, которые извлекают спецификации расширения из opengl.org и автоматически создают всю загрузку расширения и переносят это в небольшую библиотеку, которая не создает дополнительных зависимостей.

Если вы хотите использовать более высокую функциональность OpenGL: используйте GLEW. Не потому, что это обязательно, а потому, что это самый простой способ сделать это.

Ответ 2

Не бойтесь GLEW. Во-первых, я действительно видел GLEW, используемый в примерах Nvidia OpenGL SDK. Это, безусловно, надежный инструмент с дружественной лицензией. Во-вторых, вы можете статически связать библиотеку и исправить ее как зависимость. (Лично я просто добавляю исходный код в свой проект и #define GLEW_STATIC, чтобы он работал.)

Ответ 3

Вы хотите получить доступ к OpenGL 4.0 расширениям? Возможно, вам нужно создать контекст OpenGL 4.0 и попросить GLEW связать соответствующие функции.

Вот пример с GLEW и GLFW, скопированным из моего проекта.

  ...

  if (!glfwInit()) {
    exit(EXIT_FAILURE);
  }

  glfwOpenWindowHint(GLFW_OPENGL_VERSION_MAJOR, 2);   // I requested OpenGL 2.1 context
  glfwOpenWindowHint(GLFW_OPENGL_VERSION_MINOR, 1);

  if(!glfwOpenWindow(640, 480, 8, 8, 8, 0, 24, 0, GLFW_WINDOW)) {  // get OpenGL context
    glfwTerminate();
    exit(EXIT_FAILURE);
  }

  if (glewInit() != GLEW_OK) {   // init glew, and bind gl* Extension functions
    glfwTerminate();
    exit(EXIT_FAILURE);
  }

  // now gl* extensions is available here

  ....

Ответ 4

GLee - еще одна библиотека для загрузки расширений OpenGL, и это довольно просто и легко понять исходный код (генератор кода - это совсем другая история). Таким образом, вы можете увидеть, как работают функции расширения загрузки.

Используете соединительную линию SVN, а не "выпущенную" версию, так как я работал с автором, чтобы добавить поддержку расширений OpenGL 4.x.

Что мне нравится в GLee, так это то, что он загружает только расширения, которые вы используете, в отличие от GLEW, который загружает 200+ разных расширений, что замедляет запуск программы и особенно замедляет профилирование OpenGL.