2008-08-18 2 views

ответ

19

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

Жесткий раствор: Если у вас есть действительно веская причина не использовать 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 в 2-х формах. Один из них - объявление указателя функции 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); 

Ссылка:Moving Beyond OpenGL 1.1 for Windows Дэйв Астл - Статья немного устарела, но имеет всю информацию, вам нужно понять, почему эта жалкая ситуация существует в Windows, и как обойти это.

+0

Я проводил весь день, пытаясь заставить OpenGL работать с GLEW, но у меня все время возникают проблемы ... Просто так вы знаете: OpenGL не так-то просто настроить. Но когда он работает: P – 2014-09-11 14:27:07

0

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

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

+0

Последний выпуск GLEW - 1.9.0 с 2012 по август 06. – 2012-09-01 22:59:53

3

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

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

0

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

https://github.com/skaslev/gl3w

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

Смежные вопросы