2016-03-24 8 views
4

Ich habe versucht, etwas opengl Code zu schreiben, der überall funktioniert, aber ohne mich zu sehr einzuschränken.
Ich wollte OpenGLES2 auf Geräten verwenden, die es nur unterstützen, und openGL Core wurde unterstützt.Kompatibilität von OpenGL mit OpenGLES2

Außerdem wollte ich in der Lage sein zu wählen, welche ich verwenden würde, in Laufzeit (wenn verfügbar, natürlich).

Meine Fragen sind:
wenn ich meinen Code mit OpenGL-Bibliothek verknüpfen, um eine GLES2 oder GL Kern Kontext jedes Mal, es verfügbar ist, und dann entweder erstellen, wird das Verhalten GLES2 Kontext genau die gleichen wie GLESv2 Bibliothek? Was sind die Auswirkungen davon, Header-weise? Zum Beispiel, GLESv2 definiert nicht BGRA Textur-Formate, also würde ich denke, ich müsste alle in RGBA konvertieren. Es ist nicht viel Ärger, aber ich bin daran interessiert, über Alternativen zu wissen.

Ich habe gedacht, die Bibliothek dynamisch laden und alle verwendeten Funktionen Zeiger laden, aber das ist eine riesige Menge an Arbeit für etwas, das vielleicht eine einfachere Antwort hat. In diesem Fall würde ich einfach glext.h einschließen und alle Funktionszeiger für die verwendeten Funktionen deklarieren und sie füllen. Das Problem hier ist, dass glext keine Datentypen definiert (Glenum, etc), also muss ich immer gl.h. Indem ich beide einbeziehe, bekomme ich die gl.h-Funktionsdeklaration UND meine eigene Funktionszeigerdeklaration, also konnte ich nicht einfach den allgemeinen Namespace für die Funktionszeiger verwenden ... Und selbst dann scheinen einige Funktionen (wie glGetError) nicht einen Typtyp für ihren Funktionszeiger haben.

Ich weiß über GLEW, aber leider verbreiten die meisten Linux-Distributionen eine Version von GLEW, die immer noch nicht GLES2-kompatibel ist (debian, ich schaue dich an). Es segnet einfach.

Wie würdest du das machen? Irgendwelche anderen Ansätze für OpenGL-Funktion verknüpfen?

Antwort

1

Ich bin in der Luftfahrtindustrie, wo ich mit allen Arten von OpenGL Subsets arbeiten kann, da jeder Hardwareanbieter eine eigene Version hat. (Ich würde gerne mit einem vollständigen dokumentierten Profil von ... nun ... allem arbeiten.) Es scheint, dass wir ähnliche Probleme haben. Ich werde dir das geben, was ich bisher gelernt habe.

Zunächst einmal wollen Sie in Richtung der größten Bad Superset aller Profile entwickeln, die Sie bekommen können. Verwenden Sie die neueste Version der OpenGL-Header, die von Ihrem Hardwarehersteller bereitgestellt werden. Auf diese Weise löst Ihr Programm zumindest den kompilierenden Teil.

BGRA-Makro/enum wird Teil Ihrer GLESv2-Laufzeit sein, aber Sie werden sicher nie in Runtime verwenden, wenn Ihre Plattform nur RGBA unterstützt.

Laufzeitentscheidungen basierend auf Plattformfähigkeiten basieren auf der OpenGL-Erweiterungsliste. Vergleichen Sie die Erweiterungsliste mit der Anwendung, die Sie verwenden, deaktivieren Sie nicht unterstützte Zweige und aktivieren Sie unterstützte Zweige. Sie können auf diese Weise zwischen OpenGL und GLES unterscheiden.