Вопрос

Я собирался перестроить мою библиотеку в Dev-C ++ под Windows; однако функциональность шейдера, которую я добавил тем временем, не поддерживается, компилятор не может найти связанные функции (:: glCreateShader (), :: glCreateProgram () и т. д.)

Покопавшись в Интернете и в папке Dev-C ++, я обнаружил, что реализация OpenGL (gl.h) - только v1.1. Я нашел рекомендации , чтобы загрузить последние заголовки из SGI . Однако я обнаружил gl3.h, но после более тщательного изучения я понял, что gl.h в любом случае не включен в мой проект, и мне следует посмотреть на SDL / SDL_opengl.h.

РЕДАКТИРОВАТЬ: SDL_opengl.h не содержит , включает gl.h и объявляет прототипы рассматриваемых функций. Поэтому вопрос в том, почему я дал ошибки времени компиляции, а не ошибки компоновщика?

(Моя библиотека ссылается только на mingw32, libOpenGL32, libSDL, libSDL_Image и libSDL_Mixer, очень похоже на OSX (за исключением, конечно, mingw32), где у меня не было проблем.)

Как я могу использовать шейдеры OpenGL v2.0 с Dev-C ++ и SDL?

Это было полезно?

Решение

gl.h предназначен только для OpenGL 1.1 (а в некоторых случаях до 1.3 в зависимости от того, какую версию файла вы используете и какую операционную систему). Для всего остального вам дополнительно понадобится glext.h и, вероятно, glxext.h (Linux / Unix) или wglext.h (Windows).

Все функции из более новых версий OpenGL должны быть связаны во время выполнения. Таким образом, чтобы использовать их, вы должны получить правильный адрес функции и назначить его указателю на функцию. Самый простой способ сделать это - использовать что-то вроде GLEW .

Ручной способ будет выглядеть примерно так:

PFNGLCREATESHADERPROC glCreateShader = NULL;
glCreateShader = (PFNGLCREATESHADERPROC) wglGetProcAddress("glCreateShader");

или для Linux:

PFNGLCREATESHADERPROC glCreateShader = NULL;
glCreateShader = (PFNGLCREATESHADERPROC) glXGetProcAddress((GLubyte*) "glCreateShader");

Если вы определите GL_GLEXT_PROTOTYPES перед включением glext.h, вы можете пропустить первую строку.

РЕДАКТИРОВАТЬ: SDL_opengl.h выглядит так, как будто он содержит копию glext.h (хотя и не актуально). Так что, если вы используете это, все равно должно быть в силе. Если вы хотите использовать отдельный glext.h, вы должны определить NO_SDL_GLEXT, прежде чем включать SDL_opengl.h. Кроме того, прототипы функций недоступны, если GL_GLEXT_PROTOTYPES не определен или вы пишете их сами.

EDIT2: . Очевидно, в SDL есть собственная функция GetProcAddress, которая называется SDL_GL_GetProcAddress .

Другие советы

Можете ли вы загрузить адреса функций во время выполнения?

typedef GLhandle (APIENTRYP PFNGLCREATESHADERPROC) (GLenum shaderType);
PFNGLCREATESHADERPROC glCreateShader = NULL;
glCreateShader = (PFNGLCREATESHADERPROC)wglGetProcAddress("glCreateShader");

typedef GLhandle (APIENTRYP PFNGLCREATEPROGRAMPROC) ();
PFNGLCREATEPROGRAMPROC glCreateProgram = NULL;
glCreateProgram = (PFNGLCREATEPROGRAMPROC)wglGetProcAddress("glCreateProgram");
scroll top