möchte ich die Funktionen verwenden, die unter den OpenGL-Erweiterungen verfügbar sind. Ich bin auf Windows, wie mache ich das?Verwenden von OpenGL-Erweiterungen Unter Windows
Antwort
Einfache Lösung: Verwenden Sie GLEW. Siehe wie here.
Hart Lösung: Wenn Sie einen wirklich guten Grund haben nicht GLEW zu verwenden, ist hier, wie die gleiche, ohne es zu erreichen:
Identifizieren Sie die OpenGL-Erweiterung und die Erweiterungs-APIs Sie verwenden möchten. OpenGL-Erweiterungen sind in der OpenGL Extension Registry aufgelistet.
Beispiel: Ich möchte die Fähigkeiten der Erweiterung EXT_framebuffer_object verwenden. Die APIs Ich möchte von dieser Erweiterung verwenden sind:
glGenFramebuffersEXT()
glBindFramebufferEXT()
glFramebufferTexture2DEXT()
glCheckFramebufferStatusEXT()
glDeleteFramebuffersEXT()
Überprüfen Sie, ob Ihre Grafikkarte unterstützt die Erweiterung, die Sie verwenden möchten. Wenn dies der Fall ist, ist Ihre Arbeit fast abgeschlossen! Downloaden und installieren Sie die neuesten Treiber und SDKs für Ihre Grafikkarte.
Beispiel: Die Grafikkarte in meinem PC ist ein NVIDIA 6600 GT. Also, ich besuche die NVIDIA OpenGL Extension Specifications Webseite und finde, dass die EXT_framebuffer_object Erweiterung unterstützt wird. Ich lade dann das neueste NVIDIA OpenGL SDK herunter und installiere es.
Ihre Grafikkartenhersteller stellt eine glext.h Header-Datei (oder einen ähnlichen Namen Header-Datei) mit allen Erklärungen notwendig, um die unterstützten OpenGL-Erweiterungen zu verwenden. (Beachten Sie, dass nicht alle Erweiterungen möglicherweise unterstützt werden.) Platzieren Sie diese Headerdatei entweder an einem beliebigen Ort, den Ihr Compiler aufheben kann, oder fügen Sie ihr Verzeichnis in die Include-Verzeichnisliste Ihres Compilers ein.
Fügen Sie in Ihrem Code eine #include <glext.h>
Zeile hinzu, um die Headerdatei in Ihren Code aufzunehmen.
öffnen glext.h, finden die API Sie wollen ihre verwenden und ergreifen entsprechende hässlich aussehende Erklärung.
Beispiel: Ich suche für die oben genannten APIs Framebuffer und ihre entsprechenden hässlich aussehenden Erklärungen finden:
typedef void (APIENTRYP PFNGLGENFRAMEBUFFERSEXTPROC) (GLsizei n, GLuint *framebuffers); for GLAPI void APIENTRY glGenFramebuffersEXT (GLsizei, GLuint *);
bedeutet dies lediglich, dass Ihre Header-Datei, die die API-Deklaration in zwei Formen hat. Eine ist eine wgl-artige hässliche Funktionszeigerdeklaration. Die andere ist eine vernünftige Funktionsdeklaration.
Fügen Sie für jede Erweiterungs-API, die Sie verwenden möchten, Ihre Codedeklarationen des Funktionsnamens als einen Typ der hässlich aussehenden Zeichenfolge hinzu.
Beispiel:
PFNGLGENFRAMEBUFFERSEXTPROC glGenFramebuffersEXT;
PFNGLBINDFRAMEBUFFEREXTPROC glBindFramebufferEXT;
PFNGLFRAMEBUFFERTEXTURE2DEXTPROC glFramebufferTexture2DEXT;
PFNGLCHECKFRAMEBUFFERSTATUSEXTPROC glCheckFramebufferStatusEXT;
PFNGLDELETEFRAMEBUFFERSEXTPROC glDeleteFramebuffersEXT;
Obwohl es hässlich aussieht, alles, was wir tun, ist Funktionszeiger des Typs deklarieren zu dem Erweiterungs-API entspricht.
Initialisieren Sie diese Funktionszeiger mit ihren rechtmäßigen Funktionen. Diese Funktionen werden von der Bibliothek oder dem Treiber verfügbar gemacht. Wir müssen wglGetProcAddress() Funktion verwenden, um dies zu tun.
Beispiel:
glGenFramebuffersEXT = (PFNGLGENFRAMEBUFFERSEXTPROC) wglGetProcAddress("glGenFramebuffersEXT");
glBindFramebufferEXT = (PFNGLBINDFRAMEBUFFEREXTPROC) wglGetProcAddress("glBindFramebufferEXT");
glFramebufferTexture2DEXT = (PFNGLFRAMEBUFFERTEXTURE2DEXTPROC) wglGetProcAddress("glFramebufferTexture2DEXT");
glCheckFramebufferStatusEXT = (PFNGLCHECKFRAMEBUFFERSTATUSEXTPROC) wglGetProcAddress("glCheckFramebufferStatusEXT");
glDeleteFramebuffersEXT = (PFNGLDELETEFRAMEBUFFERSEXTPROC) wglGetProcAddress("glDeleteFramebuffersEXT");
Vergessen Sie nicht die Funktionszeiger für NULL zu überprüfen. Wenn zufällig wglGetProcAddress() die Erweiterungsfunktion nicht finden konnte, hätte es den Zeiger mit NULL initialisiert.
Beispiel:
if (NULL == glGenFramebuffersEXT || NULL == glBindFramebufferEXT || NULL == glFramebufferTexture2DEXT
|| NULL == glCheckFramebufferStatusEXT || NULL == glDeleteFramebuffersEXT)
{
// Extension functions not loaded!
exit(1);
}
Das ist es, wir sind fertig! Sie können diese Funktionszeiger jetzt genauso verwenden, als ob die Funktionsaufrufe existierten.
Beispiel:
glGenFramebuffersEXT(1, &fbo);
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, fbo);
glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D, colorTex[0], 0);
Referenz:Moving Beyond OpenGL 1.1 for Windows von Dave Astle - Der Artikel ist ein bisschen veraltet, aber hat alle Informationen, die Sie brauchen, um zu verstehen, warum diese pathetische Situation auf Windows vorhanden ist und wie man es schafft.
@Kronikarz: Vom Aussehen her scheint GLEW der Weg der Zukunft zu sein. NVIDIA liefert es bereits zusammen mit seiner OpenGL SDK. Und seine neueste Veröffentlichung war 2007 im Vergleich zu GLEE, die 2006 war.
Aber die Verwendung beider Bibliotheken sieht fast gleich aus. (GLEW hat eine init(), die jedoch vor allem anderen aufgerufen werden muss.) Sie müssen also nicht wechseln, wenn Sie nicht feststellen, dass eine Erweiterung unter GLEE nicht unterstützt wird.
Die neueste GLEW-Version ist 1.9.0 von 2012 August 06. –
Die neueste GLEW-Version ist jetzt 1.12.0 von 2015 26. Januar. So wird es offensichtlich aktiv unterstützt :) – iondune
Ein 'sehr starker Grund', GLEW nicht zu verwenden, könnte sein, dass die Bibliothek nicht von Ihrem Compiler/IDE unterstützt wird. ZB: Borland C++ Builder.
In diesem Fall möchten Sie möglicherweise die Bibliothek aus der Quelle neu erstellen. Wenn es funktioniert, ist es großartig, sonst ist das Laden der manuellen Erweiterung nicht so schlimm wie es klingt.
GL3W ist ein public-domain-Skript, das eine Bibliothek erstellt, die nur Kernfunktionen für OpenGL 3/4 lädt.
https://github.com/skaslev/gl3w
GL3W erfordert Python 2: Es kann auf Github zu finden.6 um die Bibliotheken und Header für OpenGL zu generieren; Danach ist Python nicht mehr erforderlich.
Ich habe den ganzen Tag damit verbracht, OpenGL zu bekommen, um mit GLEW zu arbeiten, aber ich laufe immer wieder in Probleme ... Nur damit Sie wissen: OpenGL ist nicht so einfach einzurichten. Aber wenn es läuft: P –