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

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

18.08.2008 10:11:45
4 ОТВЕТА
РЕШЕНИЕ

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

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

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

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

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

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

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

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

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

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

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

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);

Ссылка: Переход за пределы OpenGL 1.1 для Windows от Дейва Астла. Эта статья немного устарела, но содержит всю информацию, необходимую для понимания, почему такая жалкая ситуация существует в Windows и как ее обойти.

20
23.05.2017 12:01:23
Я потратил целый день, пытаясь заставить OpenGL работать с GLEW, но продолжаю сталкиваться с проблемами ... Просто чтобы вы знали: OpenGL не так легко настроить. Но когда он работает: P
user896326 11.09.2014 14:27:07

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

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

0
20.08.2008 03:01:42
Последний релиз GLEW - 1.9.0 с 2012 года, 6 августа 2012 года.
Lars Pensjö 1.09.2012 22:59:53
Последний выпуск GLEW теперь 1.12.0 с 2015 года 26 января. Так что он, очевидно, активно поддерживается :)
iondune 28.01.2015 21:48:52

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

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

3
19.04.2009 12:01:59

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

https://github.com/skaslev/gl3w

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

0
26.03.2012 04:13:25