Что делает GLEW и зачем мне это нужно?

Итак, я уже знаю, зачем мне нужен GLEW, но только до определенного момента.

Если я использую современные материалы OpenGL, возможно, начиная с версии 3.0 и/или использую Core Profile, то требуется GLEW, так как без него компиляция выдает ошибку, например glGenVertexArrays не была объявлена.

Таким образом, GLEW выполняет небольшую фоновую работу, включая современные функции OpenGL, которые мы, вероятно, хотели бы использовать.

Кроме этого, он делает что-нибудь еще? Кроме того, как это работает.

Например, улучшает ли это кроссплатформенную компиляцию? (Требуется меньше модификаций кода, например, при переходе с Linux на Windows или OS X?

Это также улучшило «кроссплатформенность» графического оборудования? Например, скажем, у нас было два одинаковых компьютера, включая ОС. Программа компилируется с использованием команд OpenGL 4.3 в одной системе. Если в другой системе есть видеокарта или драйвер, поддерживающий только OpenGL 3.3, поможет ли в этом GLEW? (Возможно, компиляция шейдеров для старой версии OpenGL?)

Так что вы, вероятно, видите, что я на самом деле не знаю, что делает GLEW или как он это делает.

Последний пункт; Кто-нибудь знает, как использовать GLEW с GLFW? На самом деле я мог бы опубликовать это как отдельный вопрос.


person FreelanceConsultant    schedule 23.07.2013    source источник


Ответы (2)


GLEW не «требуется», как вы выразились. Вы можете использовать заголовок glcorearb.h или что-то в этом роде. Однако, если вы связываетесь с какой-либо функцией, она должна существовать на целевой платформе, иначе ваша программа не запустится. GLEW и другие точно справятся с этим - вы не связываетесь с функциями GL напрямую, а вместо этого получаете указатели функций после фазы инициализации. Это позволяет вам проверять во время выполнения, какие расширения присутствуют и какие функции могут быть использованы.

Единственное, что помогает с переносимостью, это получение указателей на функции — это может быть wglGetProcAddress/glxGetProcAddress и его аналог для яблочных ОС. Так что нет, это не случай. Однако разнообразие доступных расширений GL велико.

GLEW не требует точек соприкосновения с предпочитаемой вами библиотекой инициализации GL — просто вызовите glewInit после создания контекста GL.

person keltar    schedule 23.07.2013
comment
Если я создам окно, а затем вызову glewInit(), я получу ошибку segfault? - person FreelanceConsultant; 23.07.2013
comment
@EdwardBird: Вы создали контекст OpenGL в этом окне? Активен ли контекст OpenGL при вызове glewInit? - person datenwolf; 23.07.2013
comment
Да, я сделал, но теперь я решил проблему - все равно спасибо (: - person FreelanceConsultant; 23.07.2013

Для корректной инициализации необходимо создать контекст OpenGL и wglMakeCurrent() необходимо вызвать перед вызовом glewInit();

Я бы поместил это в комментарии к ответу Келтара, но не понимаю, как это сделать.

person tamato    schedule 23.07.2013
comment
зачем нужен wglMakeCurrent()? это специфично для платформы или это нужно каждой ОС? - person Bilal Siddiqui; 25.02.2021
comment
Его окна специфичны, и он должен сделать контекст рендеринга активным, чтобы вы могли вызывать команды gl без получения ошибки. - person tamato; 25.02.2021
comment
поэтому я предполагаю, что Linux или OS X могут не нуждаться в этом? Кстати, впечатляющая скорость отклика. - person Bilal Siddiqui; 25.02.2021
comment
У каждого свои версии - person tamato; 25.02.2021