Frage

Ich wollte gerade meine Bibliothek in Dev-C ++, unter Windows wieder aufzubauen; aber ich die Shader-Funktionalität haben in der Zwischenzeit hinzugefügt wird nicht unterstützt, könnte der Compiler nicht die entsprechenden Funktionen finden (:: glCreateShader () :: glCreateProgram () usw.)

Graben rund um das Internet und das Dev-C ++ Ordner habe ich festgestellt, dass die OpenGL-Implementierung (gl.h) nur v1.1 ist. Ich habe gefunden Empfehlungen die neuesten Header von SGI . Ich habe gl3.h gefunden, aber nach genauerem Hinsehen habe ich, dass gl.h realisiert wird ohnehin nicht in meinem Projekt enthalten ist, und ich soll bei SDL / SDL_opengl.h suchen.

EDIT: SDL_opengl.h hat sind gl.h und erklärt Prototypen der Funktionen in Frage. Die Frage ist also, warum ame ich gegeben Kompilierung-Fehler eher als Linker Fehler?

(Meine Bibliothek Links nur gegen mingw32, libOpenGL32, libSDL, libSDL_Image und libSDL_Mixer, ähnlich wie unter OSX (außer mingw32, natürlich), wo ich keine Probleme habe.)

Wie kann ich mit OpenGL v2.0 Shadern mit Dev-C ++ und SDL?

War es hilfreich?

Lösung

gl.h ist nur für OpenGL 1.1 (und in einigen Fällen bis zu 1,3 je nachdem, welche Version der Datei, die Sie verwenden, und dem Betriebssystem). Für alles andere müssen Sie zusätzlich glext.h und wahrscheinlich glxext.h (Linux / Unix) oder wglext.h (Windows).

Alle Funktionen von neueren Versionen von OpenGL muss zur Laufzeit verknüpft werden. Also, um sie zu benutzen, müssen Sie die richtige Funktion Adresse erhalten und es zu einem Funktionszeiger zuweisen. Der einfachste Weg, dies zu tun ist durch etwas mit wie GLEW .

Die manuelle Art und Weise so etwas wie dies wäre:

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

oder für Linux:

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

Wenn Sie GL_GLEXT_PROTOTYPES definieren, bevor einschließlich glext.h Sie die erste Zeile weglassen kann.

EDIT: SDL_opengl.h sieht aus wie eine Kopie von glext.h (nicht aktuell aber) enthält. Also, wenn Sie verwenden, dass die oben noch gültig sein sollte. Wenn Sie eine separate glext.h verwenden wollen, müssen Sie NO_SDL_GLEXT bevor einschließlich SDL_opengl.h definieren. Auch sind die Funktionsprototypen nicht verfügbar, solange GL_GLEXT_PROTOTYPES nicht definiert ist oder Sie diese selbst schreiben.

EDIT2: Anscheinend SDL seine eigene GetProcAddress Funktion aufgerufen SDL_GL_GetProcAddress .

Andere Tipps

Können Sie die Adressen der Funktionen zur Laufzeit laden?

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

typedef GLhandle (APIENTRYP PFNGLCREATEPROGRAMPROC) ();
PFNGLCREATEPROGRAMPROC glCreateProgram = NULL;
glCreateProgram = (PFNGLCREATEPROGRAMPROC)wglGetProcAddress("glCreateProgram");
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top