2013-03-28 2 views
0

Я пытаюсь использовать расширение координат тумана с OpenGL под Windows. Ниже приведены первые несколько строк моего кода:OpenGL Fog Coordinate Extension в Windows

#include <windows.h> 
#include <gl\glut.h> 
#include "GLEXT.h" 

#define GL_FOG_COORDINATE_SOURCE_EXT 0x8450  
#define GL_FOG_COORDINATE_EXT  0x8451     

PFNGLFOGCOORDFEXTPROC glFogCoordfEXT = NULL; 

glFogCoordfEXT = (PFNGLFOGCOORDFEXTPROC) wglGetProcAddress("glFogCoordfEXT"); 

Если компилятор намекает, что glFogCoordfEXT не может быть найден. Но как только я поставил перед настройками параметров тумана, компиляция прошла, и программа работает нормально.

Я не знаком с вызовами функций Windows, хотя я много использую Windows. Может ли кто-нибудь сказать мне, как это работает?

ответ

0

В Microsoft Windows вы компилируете одну библиотеку (.lib) и запускаетесь с другой библиотекой (ваши .dll). Microsoft контролирует содержимое библиотеки компиляции, но поставщики могут заменить исполняемый файл. В случае OpenGL библиотека компиляции довольно старая (поддерживает только функции OpenGL 1.1 и несколько расширений), и поскольку эта библиотека предоставляет экспортированные функции, необходимые компилятору для связывания, новые функции OpenGL там не включены. Таким образом, было необходимо использовать указатели на функции, так как они могут быть извлечены во время выполнения из DLL. Функция wglGetProcAddress() выполняет поиск этой функции, и все те типы, которые вы видите заглавными буквами (например, PFNGLFOGCOORDFEXTPROC), являются typedefs для функции, которую вы можете получить с помощью wglGetProcAddress(). Таким образом, чтобы использовать функцию glFogCoordfEXT(), вам необходимо извлечь ее из .dll, прежде чем вы ее вызвали. Как правило, вам необходимо собрать все функции, необходимые для использования wglGetProcAddress(), чтобы получить код инициализации в начале вашей программы (но после создания контекста OpenGL).

Еще один момент: вы должны убедиться, что доступна соответствующая версия OpenGL (позвонив по номеру glGetString(GL_VERSION) и поддерживая любые расширения, которые могут вам понадобиться (вызывая либо glGetString(GL_EXTENSIONS), либо анализируя строку, или если вы используете более недавний OpenGL, позвоните glGetStringi(), чтобы получить отдельные строки расширения). wglGetProcAddress() вернет NULL, если эта функция недоступна в вашей реализации OpenGL. Она вернет допустимый указатель функции, но это не обязательно означает, что вам нужны функции (вот почему вы должны проверить строку расширения) .Это ситуация редко, но может произойти из-за взаимодействий с расширением.

+0

Или вы могли бы просто использовать [pro в библиотеке загрузки OpenGL] (http://www.opengl.org/wiki/OpenGL_Loading_Library) и не нужно заботиться. –

+0

Это действительно самый простой ответ. – radical7