OpenGL v2.0 шейдеры с Dev-C ++ и SDL? - PullRequest
7 голосов
/ 19 июня 2009

Я собирался перестроить мою библиотеку в 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?

Ответы [ 2 ]

8 голосов
/ 19 июня 2009

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 .

0 голосов
/ 19 июня 2009

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

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

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