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