Шейдеры OpenGL v2.0 с Dev-C++ и SDL?

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

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

EDIT: SDL_opengl.h включает gl.h и объявляет прототипы рассматриваемых функций. Итак, вопрос в том, почему я дал ошибки времени компиляции, а не ошибки компоновщика?

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

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


person zyndor    schedule 19.06.2009    source источник
comment
С какой стати вы хотите использовать Dev-C++? Сделайте себе одолжение и используйте IDE, которая была обновлена ​​за последние 4 года. (и в котором не было ошибок и недостающих функций, даже когда он был поддержан)   -  person jalf    schedule 19.06.2009
comment
Почему вы выбрали Dev-C++ вместо VC++2008 Express?   -  person Andrew Garrison    schedule 19.06.2009
comment
Это справедливое замечание, и я не могу сказать, что не предвидел этого. Windows не собиралась быть моей основной платформой, и я ненавидел жонглирование манифестами и шестью разновидностями сред выполнения MSVC. Кроме того, я собирался разрабатывать для GP2X, а его официальный девкит представляет собой изуродованный Dev-C++, так что я подумал, что это удобно... Да, это не так.   -  person zyndor    schedule 19.06.2009
comment
Что ж, выбор IDE — дело вкуса, но DevC++ больше не обновляется. Его назначенным преемником является Code::Blocks ( codeblocks.org ). Так что выберите этот или попробуйте другие (Eclipse, VC Express) и найдите тот, который вам больше нравится, но вам больше не следует использовать Dev C++.   -  person Ksempac    schedule 20.06.2009
comment
Спасибо за совет, я использовал VS, может быть, я просто вернусь к этому. Я не слышал об Eclipse, я обязательно проверю его, и у меня все еще есть Code::Blocks, чтобы вернуться, если это не сработает.   -  person zyndor    schedule 20.06.2009


Ответы (2)


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");

или для линукса:

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

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

EDIT: SDL_opengl.h выглядит так, как будто содержит копию glext.h (хотя и не обновленную). Поэтому, если вы используете это, приведенное выше все еще должно быть действительным. Если вы хотите использовать отдельный glext.h, вы должны определить NO_SDL_GLEXT перед включением SDL_opengl.h. Кроме того, прототипы функций недоступны до тех пор, пока не определен GL_GLEXT_PROTOTYPES или вы сами их пишете.

EDIT2: По-видимому, SDL имеет собственную функцию GetProcAddress, которая называется SDL_GL_GetProcAddress.

person Maurice Gilden    schedule 19.06.2009
comment
Кроме того, прототипы функций недоступны до тех пор, пока не определен GL_GLEXT_PROTOTYPES или вы сами их пишете. <- ЭТО. Спасибо! - person zyndor; 20.06.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");
person Andrew Garrison    schedule 19.06.2009