Использование расширений OpenGL в Windows - PullRequest
16 голосов
/ 18 августа 2008

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

Ответы [ 4 ]

20 голосов
/ 18 августа 2008

Простое решение : Используйте 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 () .

Пример: * 1 076 *

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 и как обойти это.

3 голосов
/ 19 апреля 2009

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

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

0 голосов
/ 26 марта 2012

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

https://github.com/skaslev/gl3w

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

0 голосов
/ 20 августа 2008

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

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

...