2014-09-13 9 views
7

Ich möchte sicherstellen, dass meine Anwendung OpenGL 2.1 entspricht. Wie kann ich das überprüfen?Wie überprüft man die Konformität mit der OpenGL-Version?

Da mein Computer GL4.4 unterstützt, auch wenn ich zum Beispiel glGenVertexArrays() verwende, wird es erfolgreich funktionieren. Aber glGenVertexArrays() ist nur mit GL3 + verfügbar.

Also, ich möchte überprüfen, dass meine App nur GL2.1-Funktionalität verwendet. Ein Weg ist, es auf meinem alten PC zu starten, der nur GL2.1 unterstützt, aber ich suche nach einem einfacheren Weg.

Antwort

1

Sie können es in einer Umgebung kompilieren, in der nur die OpenGL-2.1-Symbole verfügbar sind. Abhängig davon, welchen Erweiterungs-Wrapper/Loader Sie verwenden, kann dies einfach oder schwer sein.

Wenn Sie zum Beispiel die glloadgen OpenGL loader generator verwenden, können Sie eine Header-Datei und eine Kompilierungseinheit generieren, die nur die OpenGL-2.1-Symbole und -Token abdeckt. Wenn Sie dann Ihr Projekt mit diesem kompilieren, wird der Compiler Fehler bei allem, was nicht abgedeckt ist.

0

Wenn Sie einen Erweiterungslader finden, der das Erzeugen versionsspezifischer Header unterstützt, wie von @datenwolf beschrieben, ist dies wahrscheinlich Ihre einfachste Lösung. Es gibt noch weitere Optionen, die Sie ggf. ausprobieren können.

Die offiziellen OpenGL-Header, die Sie unter https://www.opengl.org/registry finden können, enthalten die Definitionen nach Version gruppiert und in Präprozessorbedingungen eingeschlossen. Das Layout sieht folgendermaßen aus:

... 
#ifndef GL_VERSION_2_1 
#define GL_VERSION_2_1 1 
// GL 2.1 definitions 
#endif 
#ifndef GL_VERSION_3_0 
#define GL_VERSION_3_0 1 
// GL 3.0 definitions 
#endif 
#ifndef GL_VERSION_3_1 
#define GL_VERSION_3_1 1 
// GL 3.1 definitions 
#endif 
... 

Sie sollten in der Lage sein, den offiziellen Header mindestens für einen Versionstest einzubinden. Wenn Sie die Versionen deaktivieren, die Sie nicht verwenden möchten, indem Sie das entsprechende Vorprozessorsymbol definieren, erhalten Sie Kompilierungsfehler, wenn Sie versuchen, Features aus diesen Versionen zu verwenden. Zum Beispiel für GL 2.1:

#define GL_VERSION_3_0 1 
#define GL_VERSION_3_1 1 
#define GL_VERSION_3_2 1 
#define GL_VERSION_3_3 1 
#define GL_VERSION_4_0 1 
#define GL_VERSION_4_1 1 
#define GL_VERSION_4_2 1 
#define GL_VERSION_4_3 1 
#define GL_VERSION_4_4 1 
#define GL_VERSION_4_5 1 
#include <GL/glext.h> 

// your code 
0

Versuchen Sie https://github.com/cginternals/glbinding. Es ist eine OpenGL-Wrapper-Bibliothek, die genau unterstützt, was Sie fragen nach:

Eigenschaft Zentrierte Header-Entwurf

Die OpenGL API iterativ entwickelt und in Versionen veröffentlicht, intern (für die API-Spezifikation) benannt Funktionen. Das neueste Feature/Version von OpenGL ist 4.5. Die vorherige Version sind 1.0, 1.1, 1.2, 1.3, 1.4, 1.5, 2.0, 2.1, 3.0, 3.1, 3.2, 3.3, 4.0, 4.1, 4.2, 4.3 und 4.4. OpenGL verwendet ein veraltetes Modell zum Entfernen veralteter Teile seiner API, die Kompatibilität (mit veralteten API) und Kern (ohne veraltetes API) Verwendung, die im Ziel OpenGL-Kontext manifestiert. Darüber hinaus werden neue API-Konzepte als Erweiterungen (häufig herstellerspezifisch) vorgeschlagen, die möglicherweise in zukünftige Versionen integriert werden. All dies führt zu vielen möglichen spezifischen Manifestationen der OpenGL API, die Sie in Ihrem Programm verwenden können.

Eine schwierige Aufgabe ist es, sich an eine der Funktionen in Ihrem eigenen OpenGL Programms vereinbart (zum Beispiel OpenGL 3.2-Core, wenn Sie alle für Windows, MacOS und Linux in den letzten 4 Jahren freigegeben entwickeln wollen).glbinding erleichtert dies durch die Bereitstellung per-Feature-Header mit Hilfe von gut definierten/generierten Teilmengen der OpenGL-API.

All-Funktionen OpenGL-Header

Wenn Sie pro-Funktion nicht Header verwenden die OpenGL-Programm wie aussehen kann dieses:

#include <glbinding/gl/gl.h> 

// draw code 
gl::glClear(gl::GL_COLOR_BUFFER_BIT | gl::GL_DEPTH_BUFFER_BIT); 
gl::glUniform1i(u_numcubes, m_numcubes); 
gl::glDrawElementsInstanced(gl::GL_TRIANGLES, 18, gl::GL_UNSIGNED_BYTE, 0, m_numcubes * m_numcubes); 

Einzel-Eigenschaft OpenGL-Header

Bei der Entwicklung Ihres Codes unter Windows mit den neuesten installierten Treibern wird der obige Code wahrscheinlich kompiliert und Renn. Aber wenn Sie auf Systeme mit weniger ausgereifter Treiberunterstützung portieren möchten (z. B. macOS oder Linux mit Open-Source-Treibern), fragen Sie sich vielleicht, ob glDrawElementsInstanced verfügbar ist. In diesem Fall schalten nur pro-Feature-Header von glbinding und die Core-Header OpenGL 3.2 wählen (wie Sie wissen, dass bei dest diese Version auf allen Zielplattformen verfügbar ist):

#include <glbinding/gl32core/gl.h> 

// draw code 
gl32core::glClear(gl32core::GL_COLOR_BUFFER_BIT | gl32core::GL_DEPTH_BUFFER_BIT); 
gl32core::glUniform1i(u_numcubes, m_numcubes); 
gl32core::glDrawElementsInstanced(gl32core::GL_TRIANGLES, 18, gl32core::GL_UNSIGNED_BYTE, 0, m_numcubes * m_numcubes); 

Wenn die Code kompiliert, als Sie sicher sein können, dass es OpenGL 3.2 Core konform ist. Die Verwendung von Funktionen, die noch nicht verfügbar sind oder auf veraltete Funktionen basieren, wird verhindert.

Verwandte Themen