Подтвердить что ты не робот

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

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

4b9b3361

Ответ 1

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

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

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

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

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

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

Пример: графическая карта на моем ПК - это NVIDIA 6600 GT. Итак, я нахожусь на веб-странице NVIDIA OpenGL Extension Specifications и обнаруживаю, что Расширение 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 в двух формах. Один из них - объявление указателя функции wgl-like уродливого. Другой - это декларация функциональной функции.

Для каждого 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 от Dave Astle - статья немного устарела, но имеет всю необходимую информацию, чтобы понять, почему эта жалкая ситуация существует в Windows и как обойти ее.

Ответ 2

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

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

Ответ 3

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

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

Ответ 4

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

https://github.com/skaslev/gl3w

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