Использование расширений OpenGL в Windows

Вы можете использовать max() следующим образом:

print(max(int(x), x))

16
задан Ashwin Nanjappa 26 September 2008 в 05:51
поделиться

3 ответа

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

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

Определяют расширение OpenGL и дополнительные API, которые Вы хотите использовать. Расширения OpenGL перечислены в Пример Реестра .

Расширения OpenGL: Я хочу использовать возможности расширение EXT_framebuffer_object. API, которые я хочу использовать от этого расширения:

glGenFramebuffersEXT()
glBindFramebufferEXT()
glFramebufferTexture2DEXT()
glCheckFramebufferStatusEXT()
glDeleteFramebuffersEXT()

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

Пример: видеокарта в моем ПК 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");

не забывают проверять указатели функции на [1 124] ПУСТОЙ УКАЗАТЕЛЬ . Если бы случайно wglGetProcAddress () не мог бы найти дополнительную функцию, он инициализировал бы указатель с ПУСТЫМ УКАЗАТЕЛЕМ.

Пример:

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

20
ответ дан Community 26 September 2008 в 05:51
поделиться
  • 1
    Извините, проигнорируйте это, я вижу, что Вы уже включали его. вышеупомянутые сообщения должны решить Вашу проблему. – FruityMo 9 December 2011 в 08:18

@Kronikarz: От взглядов его GLEW, кажется, способ будущего. NVIDIA уже поставляет его наряду с OpenGL SDK. И его последний выпуск был в 2007 по сравнению с ЛИКОВАНИЕМ, которое было в 2006.

, Но, использование обеих библиотек смотрит почти то же мне. (GLEW имеет init () , который нужно назвать перед чем-либо еще все же.) Так, Вы не должны переключаться, если Вы не находите некоторое расширение, не поддерживаемое под ЛИКОВАНИЕМ.

0
ответ дан Ashwin Nanjappa 26 September 2008 в 05:51
поделиться
  • 1
    Действительно, " маленький dev shop" точно целевой рынок для той кампании, и все это стоит Вам 100$ за 3 года если Вы don' t заканчивают тем, что делали любые значительные деньги из того ($1 миллион ежегодно то, где you' ll должны заплатить за лицензии полностью - или выбыть и внести плату в размере 100$). – Pavel Minaev 14 November 2009 в 04:46

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

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

3
ответ дан 30 November 2019 в 21:55
поделиться
Другие вопросы по тегам:

Похожие вопросы: