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.
Antworten:
Ihre erste Überprüfung ist wahrscheinlich ein
LoadLibrary
Aufruf (oder ein gleichwertiger für Ihre Plattform) für die Vulkan-DLL:Dann möchten Sie den Zeiger auf erwerben
vkCreateInstance
.Dann möchten Sie die entsprechenden Parameter ausfüllen und aufrufen
vkCreateInstance
. Dies kann beteiligt sein, lesen Sie die Dokumentation.vkCreateInstance
gibt 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
LoadLibrary
Schritte 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
glGetString
mitGL_VERSION
der aktuellen Version von OpenGL , um zu bestimmen Sie laden konnten. Andere Werte wieGL_VENDOR
oderGL_RENDERER
kö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