Wie finde ich zur Laufzeit heraus, ob Vulkan- und / oder OpenGL-Unterstützung verfügbar ist?

7

Ich baue eine Engine, deren primäre Rendering-Engine Vulkan ist. Um jedoch zumindest eine gewisse Abwärtskompatibilität mit Geräten zu haben, für die keine Treiber (hauptsächlich für Mobilgeräte) verfügbar sind, möchte ich einen OpenGL-Fallback implementieren. Wie überprüfe ich nun, welche APIs im aktuellen System verfügbar sind?

Ich möchte überprüfen, ob Vulkan-Unterstützung vorhanden ist, wenn nicht, wenn GL-Unterstützung vorhanden ist und wenn nicht, dann abstürzt.

ThatFinnishGuy
quelle
Versuchen Sie, dies auf computergraphics.stackexchange.com zu veröffentlichen. Dort erhalten Sie wahrscheinlich eher eine Antwort.
Almo
Sie benötigen eine Art Bibliothek, um ein Fenster für Ihre Anwendung zu öffnen und eine Eingabe von dieser zu akzeptieren. Die genaue Art der Überprüfung der API-Unterstützung hängt davon ab, welche Bibliothek Sie auswählen.
HolyBlackCat
2
Warum überhaupt Vulkan verwenden? Es gibt nicht zu viele Geräte mit Vulkan-Unterstützung, und Sie haben viele Probleme, nur um zusätzliche Leistung zu erzielen. Benötigen Sie diese Leistung wirklich? Ist einfaches OpenGL nicht genug?
HolyBlackCat

Antworten:

6

Ihre erste Überprüfung ist wahrscheinlich ein LoadLibraryAufruf (oder ein gleichwertiger für Ihre Plattform) für die Vulkan-DLL:

HMODULE vulkanDll = LoadLibrary("vulkan-1.dll");

Dann möchten Sie den Zeiger auf erwerben vkCreateInstance.

PFN_vkCreateInstance vkCreateInstance;
// ...
vkCreateInstance = GetProcAddress(vulkanDll, "vkCreateInstance");

Dann möchten Sie die entsprechenden Parameter ausfüllen und aufrufen vkCreateInstance . Dies kann beteiligt sein, lesen Sie die Dokumentation. vkCreateInstancegibt einen Ergebniscode zurück, der möglicherweise darauf hinweist, dass das Laden fehlgeschlagen ist. Wenn dies fehlschlägt oder einer der vorherigen Schritte fehlschlägt (mit einem Fehler, der nicht "Sie haben die Funktion als falsch bezeichnet" oder ähnlich ist), ist Vulkan nicht verfügbar, greifen Sie auf OpenGL zurück.

Das Obige ist ein eher bibliotheksunabhängiger (aber nicht betriebssystemunabhängiger) Ansatz auf niedriger Ebene. Wenn Sie zusätzliche Frameworks verwenden, können diese einen Teil dieser Arbeit für Sie abstrahieren. Zum Beispiel bietet GLFW anscheinend eine Funktion, mit der Sie feststellen können, ob Vulkan verfügbar ist .


Für OpenGL ist für so ziemlich alles bereits die DLL oder eine gleichwertige Version verfügbar, aber Sie können dieselben LoadLibrarySchritte usw. anwenden, wenn Sie möchten. Das Initialisieren von OpenGL ist eine plattformspezifischere Aufgabe, die für diese Frage nicht in Frage kommt, aber fehlschlagen kann: Wenn sie fehlschlägt, ist OpenGL aus irgendeinem Grund nicht verfügbar.

Die Chancen stehen gut, dass es gelingt, aber Sie sind möglicherweise auf eine Version von OpenGL zurückgefallen, die Sie nicht wollten oder die für Ihr Spiel zu primitiv ist. Sie können anrufen glGetStringmit GL_VERSIONder aktuellen Version von OpenGL , um zu bestimmen Sie laden konnten. Andere Werte wie GL_VENDORoder GL_RENDERERkönnen Ihnen Informationen über den Treiber geben, an dem Sie interessiert sind. Auf dieser Grundlage können Sie anhand Ihrer eigenen Metriken feststellen, ob Ihre OpenGL-Gesamtlast "erfolgreich" war, und dies entsprechend behandeln (in Ihrem Fall abstürzen).


quelle