Сведения о вопросе

ЧОВИД

21:06, 1st October, 2020

Теги

opengl   glew    

Использование расширений OpenGL на Windows

Просмотров: 473   Ответов: 4

Я хочу использовать функции, представленные в расширениях OpenGL. Я на Windows, как мне это сделать?



  Сведения об ответе

qwerty101

04:22, 6th August, 2020

Простое решение: используйте GLEW . Смотрите, как здесь .

Трудное решение : Если у вас есть действительно веская причина не использовать GLEW, вот как добиться того же самого без него:

Определите расширение OpenGL и расширение APIs, которые вы хотите использовать. Расширения OpenGL перечислены в реестре расширений OpenGL .

Пример: я хочу использовать возможности расширения EXT_framebuffer_object. APIs, которые я хочу использовать из этого расширения, являются:

glGenFramebuffersEXT()
glBindFramebufferEXT()
glFramebufferTexture2DEXT()
glCheckFramebufferStatusEXT()
glDeleteFramebuffersEXT()

Проверьте, поддерживает ли ваша графическая карта расширение, которое вы хотите использовать. Если это так, то ваша работа почти закончена! Загрузите и установите последние версии драйверов и SDKs для вашей видеокарты.

Пример: видеокарта в моем PC - это NVIDIA 6600 GT . Итак, я посещаю веб-страницу спецификаций расширений NVIDIA OpenGL и обнаруживаю, что расширение EXT_framebuffer_object поддерживается. Затем я загружаю последнюю версию NVIDIA OpenGL SDK и устанавливаю ее.

Производитель графической карты предоставляет файл заголовка glext.h (или аналогично именованный файл заголовка) со всеми объявлениями, необходимыми для использования поддерживаемых расширений OpenGL. (Обратите внимание, что не все расширения могут быть поддержаны.) Либо поместите этот файл заголовка туда, где компилятор может его забрать, либо включите его каталог в список включаемых каталогов вашего компилятора.

Добавьте строку #include <glext.h> в код, чтобы включить в него файл заголовка.

Откройте glext.h , найдите API, который вы хотите использовать, и возьмите соответствующее уродливое объявление.

Пример: я ищу вышеупомянутый фреймбуфер APIs и нахожу соответствующие ему уродливые объявления:

typedef void (APIENTRYP PFNGLGENFRAMEBUFFERSEXTPROC) (GLsizei n, GLuint *framebuffers); for GLAPI void APIENTRY glGenFramebuffersEXT (GLsizei, GLuint *);

Все это означает, что ваш заголовочный файл имеет объявление API в 2 формах. Один из них-это объявление указателя уродливой функции типа wgl. Другой-это вменяемое на вид объявление функции.

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

Пример:

PFNGLGENFRAMEBUFFERSEXTPROC glGenFramebuffersEXT;
PFNGLBINDFRAMEBUFFEREXTPROC glBindFramebufferEXT;
PFNGLFRAMEBUFFERTEXTURE2DEXTPROC glFramebufferTexture2DEXT;
PFNGLCHECKFRAMEBUFFERSTATUSEXTPROC glCheckFramebufferStatusEXT;
PFNGLDELETEFRAMEBUFFERSEXTPROC glDeleteFramebuffersEXT;

Хотя это выглядит некрасиво, все, что мы делаем, - это объявляем указатели функций типа, соответствующего расширению API.

Инициализируйте эти указатели функций их законными функциями. Эти функции предоставляются библиотекой или драйвером. Для этого нам нужно использовать функцию wglGetProcAddress().

Пример:

glGenFramebuffersEXT = (PFNGLGENFRAMEBUFFERSEXTPROC) wglGetProcAddress("glGenFramebuffersEXT");
glBindFramebufferEXT = (PFNGLBINDFRAMEBUFFEREXTPROC) wglGetProcAddress("glBindFramebufferEXT");
glFramebufferTexture2DEXT = (PFNGLFRAMEBUFFERTEXTURE2DEXTPROC) wglGetProcAddress("glFramebufferTexture2DEXT");
glCheckFramebufferStatusEXT = (PFNGLCHECKFRAMEBUFFERSTATUSEXTPROC) wglGetProcAddress("glCheckFramebufferStatusEXT");
glDeleteFramebuffersEXT = (PFNGLDELETEFRAMEBUFFERSEXTPROC) wglGetProcAddress("glDeleteFramebuffersEXT");

Не забудьте проверить указатели функций на NULL . Если бы случайно wglGetProcAddress() не смог найти функцию расширения, он бы инициализировал указатель с помощью NULL.

Пример:

if (NULL == glGenFramebuffersEXT || NULL == glBindFramebufferEXT || NULL == glFramebufferTexture2DEXT
    || NULL == glCheckFramebufferStatusEXT || NULL == glDeleteFramebuffersEXT)
{
    // Extension functions not loaded!
    exit(1);
}

Вот и все, мы закончили! Теперь вы можете использовать эти указатели функций так же, как если бы они существовали.

Пример:

glGenFramebuffersEXT(1, &fbo);
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, fbo);
glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D, colorTex[0], 0);

Ссылка: Moving Beyond OpenGL 1.1 for Windows by Dave Astle-статья немного устарела, но содержит всю необходимую информацию, чтобы понять, почему эта жалкая ситуация существует на Windows и как ее обойти.


  Сведения об ответе

$DOLLAR

13:55, 20th August, 2020

"Очень веская причина" не использовать GLEW может заключаться в том, что библиотека не поддерживается вашим compiler/IDE. E.g: Borland C++ Builder.

В этом случае может потребоваться перестроить библиотеку из исходного кода. Если это работает, отлично, в противном случае ручная загрузка расширения не так плоха, как это должно звучать.


  Сведения об ответе

DINO

21:24, 28th August, 2020

@Kronikarz: судя по всему, GLEW -это путь в будущее. NVIDIA уже отправляет его вместе с его OpenGL SDK . И его последний релиз был в 2007 году по сравнению с GLEE, который был в 2006 году.

Но использование обеих библиотек выглядит для меня почти одинаково. (У GLEW есть init() , который должен быть вызван прежде всего.) Таким образом, вам не нужно переключаться, если вы не найдете какое-то расширение, не поддерживаемое под GLEE.


  Сведения об ответе

$DOLLAR

09:26, 7th August, 2020

GL3W-это скрипт открытого домена, который создает библиотеку, которая загружает только основные функциональные возможности для OpenGL 3/4. он может быть найден на github по адресу:

https://github.com/skaslev/gl3w

GL3W требует Python 2.6 для создания библиотек и заголовков для OpenGL; после этого он не требует Python.


Ответить на вопрос

Чтобы ответить на вопрос вам нужно войти в систему или зарегистрироваться