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