Frage

Ich verwenden möchten die Funktionen ausgesetzt, die unter der OpenGL-Erweiterungen.Ich bin auf Windows, wie mache ich das?

War es hilfreich?

Lösung

Einfache Lösung:Verwenden GLEW.Sehen Sie, wie hier.

Hart-Lösung:Wenn Sie haben ein wirklich starken Grund nicht verwenden, GLEW, hier ist, wie zu erreichen das gleiche, ohne es:

Identifizieren Sie die OpenGL-Erweiterung und die Erweiterung APIs, die Sie verwenden möchten.OpenGL-Erweiterungen aufgelistet werden, in der OpenGL Extension Registry.

Beispiel:Ich möchte die Funktionen der EXT_framebuffer_object Erweiterung.Die APIs, die ich verwenden möchten, von dieser Erweiterung sind:

glGenFramebuffersEXT()
glBindFramebufferEXT()
glFramebufferTexture2DEXT()
glCheckFramebufferStatusEXT()
glDeleteFramebuffersEXT()

Überprüfen Sie, ob Ihre Grafikkarte unterstützt die Erweiterung, die Sie verwenden möchten.Wenn es funktioniert, dann Ihre Arbeit ist fast fertig!Herunterladen und installieren der neuesten Treiber und SDKs für Ihre Grafikkarte.

Beispiel:Die Grafikkarte in mein PC ist ein NVIDIA 6600 GT.So, ich Besuche die NVIDIA OpenGL Extension-Spezifikationen Webseite und finden, dass die EXT_framebuffer_object die Erweiterung ist unterstützt.Ich habe dann laden Sie die neueste NVIDIA OpenGL SDK und installieren Sie es.

Die Grafikkarte bietet der Hersteller eine glext.h header-Datei (oder eine gleichnamige header-Datei) mit allen Erklärungen nötig, um die unterstützten OpenGL-Erweiterungen.(Beachten Sie, dass nicht alle Erweiterungen vielleicht unterstützt werden.) Entweder legen Sie diese header-Datei irgendwo Ihre compiler können es abholen oder include-Verzeichnis in Ihrem compiler die include-Verzeichnisse-Liste.

Fügen Sie ein #include <glext.h> Zeile in Ihrem code zum einbinden der header-Datei in Ihren code.

Öffnen glext.h, finden Sie die API, die Sie verwenden möchten, und greifen Sie seine entsprechenden hässlich aussehende Erklärung.

Beispiel:Ich Suche für die oben genannten framebuffer-APIs und finden Sie Ihre entsprechende hässlich aussehende Erklärungen:

typedef void (APIENTRYP PFNGLGENFRAMEBUFFERSEXTPROC) (GLsizei n, GLuint *framebuffers); for GLAPI void APIENTRY glGenFramebuffersEXT (GLsizei, GLuint *);

All dies bedeutet, dass Sie Ihre header-Datei hat die API-Deklaration, in 2 Formen.Eines ist ein wgl-wie hässlich Funktion Zeiger-Deklaration.Die andere ist eine vernünftige Suche Funktion Erklärung.

Für jede Erweiterung der API, die Sie verwenden möchten, fügen Sie in Ihrem code die Deklarationen von den Namen der Funktion, als ein Typ die hässlich aussehende Zeichenfolge.

Beispiel:

PFNGLGENFRAMEBUFFERSEXTPROC glGenFramebuffersEXT;
PFNGLBINDFRAMEBUFFEREXTPROC glBindFramebufferEXT;
PFNGLFRAMEBUFFERTEXTURE2DEXTPROC glFramebufferTexture2DEXT;
PFNGLCHECKFRAMEBUFFERSTATUSEXTPROC glCheckFramebufferStatusEXT;
PFNGLDELETEFRAMEBUFFERSEXTPROC glDeleteFramebuffersEXT;

Obwohl es hässlich aussieht, alles, was wir tun, ist zu erklären, Funktions-Zeiger des Typs entsprechend der Erweiterungs-API.

Initialisieren diese Funktion Zeiger mit Ihren rechtmäßigen Funktionen.Diese Funktionen sind ausgesetzt, die von der Bibliothek oder Treiber.Wir müssen Sie nutzen wglGetProcAddress() Funktion, 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, überprüfen Sie die Funktion Zeiger für NULL.Wenn durch Zufall wglGetProcAddress() nicht finden konnte der Verlängerung Funktion, es würde haben initialisiert den Zeiger mit NULL.

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 jetzt verwenden diese Funktion-Zeiger, als wenn die Funktion fordert, existiert.

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 für Windows von Dave Astle — Der Artikel ist ein bisschen veraltet, hat aber alle Informationen, die Sie benötigen, um zu verstehen, warum dieser erbärmlichen situation auf Windows vorhanden ist, und wie zu umgehen.

Andere Tipps

Ein 'Sehr guten Grund," nicht zu verwenden GLEW könnte sein, dass die Bibliothek nicht unterstützt werden von Ihrem compiler/IDE.E. g:Borland C++ Builder.

In diesem Fall möchten Sie vielleicht, um den Wiederaufbau der Bibliothek von der Quelle.Wenn es funktioniert, großartig, sonst manuelle Erweiterung laden ist nicht so schlimm, wie es klingen.

@Kronikarz:Von den blicken von ihm, GLEW scheint der Weg der Zukunft.NVIDIA bereits Schiffe, die er zusammen mit seiner OpenGL SDK.Und seine neueste Veröffentlichung war im Jahr 2007 im Vergleich zu GLEE, die wurde in 2006.

Aber die Verwendung der beiden Bibliotheken, die sieht fast die gleiche zu mir.(GLEW hat eine init() muss aufgerufen werden, bevor irgendetwas anderes, though.) So brauchen Sie nicht zu wechseln, es sei denn, Sie finden einige Erweiterung nicht unterstützt wird unter GLEE.

GL3W ist ein public-domain-Skript erstellt eine Bibliothek, die lädt nur die Grundfunktionen für OpenGL 3/4.Es ist auf github zu finden unter:

https://github.com/skaslev/gl3w

GL3W erfordert Python 2.6 zu generieren, die Bibliotheken und Header-Dateien für OpenGL;es nicht erfordern Python nach, dass.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top