Проблема с портированием приложения OpenGL на Windows - PullRequest
5 голосов
/ 24 марта 2009

Я пытаюсь переместить приложение OpenGL в Windows.

Насколько я понимаю, в Windows была достойная реализация OpenGL. Но я начинаю думать, что это не ...

В частности, я использую буферы массивов и glDrawArrays .

Когда я пытался скомпилировать свой код в Visual Studio 2008 Pro, я получил следующие ошибки:

vertexbuffers.cpp(31) : error C3861: 'glGenBuffers': identifier not found
vertexbuffers.cpp(32) : error C2065: 'GL_ARRAY_BUFFER' : undeclared identifier
vertexbuffers.cpp(32) : error C3861: 'glBindBuffer': identifier not found
vertexbuffers.cpp(33) : error C2065: 'GL_ARRAY_BUFFER' : undeclared identifier
vertexbuffers.cpp(33) : error C2065: 'GL_STATIC_DRAW' : undeclared identifier
vertexbuffers.cpp(33) : error C3861: 'glBufferData': identifier not found

Когда я исследовал <GL\gl.h> (содержится в C:\Program Files\Microsoft SDKs\Windows\v6.0A\Include\gl), я увидел:

/* ClientArrayType */ 
/*      GL_VERTEX_ARRAY */
/*      GL_NORMAL_ARRAY */
/*      GL_COLOR_ARRAY */

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

Как я должен генерировать буферы, если у меня нет доступа к этим функциям?

В документации не сказано, что эти типы массивов отключены. Как получить доступ к реализации real в OpenGL в Windows?

Ответы [ 4 ]

8 голосов
/ 25 марта 2009

Вы можете дать GLEW шанс:

http://glew.sourceforge.net/

Я почти уверен, что использовал его когда-то в прошлом, и это немного облегчает и делает его более портативным.

6 голосов
/ 25 марта 2009

#defines закомментированы в заголовочном файле всякий раз, когда они будут повторяться. Посмотрите на строку 1054 gl.h:

/* vertex_array */
#define GL_VERTEX_ARRAY                   0x8074

Если этот #define фактически отсутствует, то вам, вероятно, следует заменить файл новой копией.

Если вы посмотрите документацию для glGenBuffers , вы увидите, что она доступна только в OpenGL 1.5 и выше. Заголовочный файл для Windows поставляется только с OpenGL 1.2, и вы должны использовать механизм расширения для доступа к новым функциям. Если вы вызываете wglGetProcAddress с именем функции, например,

void (__stdcall *glGenBuffers)(GLsizei,GLuint*) =
    wglGetProcAddress("glGenBuffers");

тогда у вас есть указатель на функцию.

2 голосов
/ 25 марта 2009

Казалось бы, функции буфера доступны только в Windows как методы расширения.

OpenGL предоставляет glext.h , который объявляет указатели на все эти функции. Затем мое приложение использует wglGetProcAddress для получения указателей на функции.

Например:

PFNGLGENBUFFERSPROC myglBindBuffers = 
    (PFNGLGENBUFFERSPROC)wglGetProcAddress("glGenBuffersARB");

К счастью, мне нужно сделать это только для 4 функций. К сожалению, теперь мне нужно добавить платформо-зависимый код в мое приложение.

1 голос
/ 10 ноября 2011

Поддержка Microsoft для OpenGL распространяется только на OpenGL-1.1 до Windows XP и OpenGL-1.4 начиная с Vista. Любые функциональные возможности OpenGL, помимо этих, должны предоставляться и поддерживаться устанавливаемым клиентским драйвером (ICD), то есть реализацией OpenGL драйвера графического процессора. Для доступа к расширенным функциям OpenGL предоставляет так называемую систему расширений , образованную wglGetProcAddress , которая похожа на GetProcAddress для DLL, но предоставляет доступ к функциям реализации OpenGL (= драйвер).

Чтобы упростить задачу, были разработаны красивые библиотеки-обертки, такие как GLEW, которые выполняют всю основную работу, инициализируя все доступные расширения OpenGL, предоставляя их конечному пользователю.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...