Вопрос

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

Это было полезно?

Решение

Простое решение:Использование РАДОВАТЬСЯ.Видишь , как здесь.

Сложное решение:Если у вас есть действительно веская причина чтобы не использовать 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");

Не забудьте проверить указатели на функции на наличие НОЛЬ.Если случайно 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 существует такая жалкая ситуация и как ее обойти.

Другие советы

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

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

@Kronikarz:Судя по всему, это так, РАДОВАТЬСЯ похоже, это путь в будущее.NVIDIA уже поставляет его вместе со своим OpenGL SDK.И его последний релиз состоялся в 2007 году по сравнению с GLEE, который вышел в 2006 году.

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

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

https://github.com/skaslev/gl3w

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top