Planen der Portierung von OpenGL ES 2.0 zu Direct3D

Wichtige APIs

Wenn Sie ein Spiel von den iOS- oder Android-Plattformen portieren, haben Sie wahrscheinlich eine erhebliche Investition in OpenGL ES 2.0 getätigt. Bei der Vorbereitung der Umstellung Ihrer Grafikpipeline auf Direct3D 11 und die Windows Runtime sollten Sie einige Dinge beachten, bevor Sie beginnen.

Bei den meisten Portierungsbemühungen geht es zunächst darum, die Codebasis zu erkunden und gemeinsame APIs und Muster zwischen den beiden Modellen abzubilden. Dieser Prozess wird Ihnen etwas leichter fallen, wenn Sie sich etwas Zeit nehmen, um dieses Thema zu lesen und zu überprüfen.

Bei der Portierung von Grafiken von OpenGL ES 2.0 auf Direct3D 11 sind einige Dinge zu beachten.

Hinweise zu bestimmten OpenGL ES 2.0-Anbietern

Die Portierungsthemen in diesem Abschnitt beziehen sich auf die Windows-Implementierung der OpenGL ES 2.0-Spezifikation, die von der Khronos Group erstellt wurde. Alle OpenGL ES 2.0-Codebeispiele wurden mit Visual Studio 2012 und einfacher Windows-C-Syntax entwickelt. Wenn Sie von einer Objective-C- (iOS) oder Java- (Android) Codebasis kommen, beachten Sie bitte, dass die bereitgestellten OpenGL ES 2.0 Codebeispiele möglicherweise keine ähnliche API-Aufrufsyntax oder Parameter verwenden. Dieser Leitfaden versucht, so plattformunabhängig wie möglich zu bleiben.

Diese Dokumentation verwendet nur die APIs der Spezifikation 2.0 für den OpenGL ES-Code und die Referenz. Wenn Sie von OpenGL ES 1.1 oder 3.0 portieren, kann sich dieser Inhalt immer noch als nützlich erweisen, auch wenn einige der OpenGL ES 2.0-Codebeispiele und der Kontext möglicherweise nicht vertraut sind.

Die Direct3D 11-Beispiele in diesen Themen verwenden Microsoft Windows C++ mit Component Extensions (CX). Weitere Informationen zu dieser Version der C++-Syntax finden Sie unter Visual C++, Component Extensions for Runtime Platforms und Quick Reference (C++\CX).

Verstehen Sie Ihre Hardware-Anforderungen und Ressourcen

Die von OpenGL ES 2.0 unterstützten Grafikverarbeitungsfunktionen entsprechen in etwa den Funktionen von Direct3D 9.1. Wenn Sie die Vorteile der erweiterten Funktionen von Direct3D 11 nutzen möchten, lesen Sie die Dokumentation Direct3D 11, wenn Sie Ihre Portierung planen, oder lesen Sie die Portierung von DirectX 9 auf die Universal Windows Platform (UWP) Themen, wenn Sie mit den ersten Bemühungen fertig sind.

Um die erste Portierung zu vereinfachen, beginnen Sie mit einer Visual Studio Direct3D-Vorlage. Es bietet einen grundlegenden Renderer, der bereits für Sie konfiguriert ist, und unterstützt UWP-App-Funktionen wie die Neuerstellung von Ressourcen bei Fensterwechseln und Direct3D-Funktionsstufen.

Verstehen der Direct3D-Funktionsstufen

Direct3D 11 bietet Unterstützung für Hardware-„Feature-Level“ von 9_1 (Direct3D 9.1) für 11_1. Diese Funktionsstufen zeigen die Verfügbarkeit bestimmter Grafikfunktionen und Ressourcen an. In der Regel unterstützen die meisten OpenGL ES 2.0-Plattformen einen Satz von Direct3D 9.1-Funktionen (Feature Level 9_1).

Überprüfung der DirectX-Grafikfunktionen und APIs

API-Familie Beschreibung
DXGI Die DirectX Graphics Infrastructure (DXGI) bietet eine Schnittstelle zwischen der Grafikhardware und Direct3D. Sie stellt den Geräteadapter und die Hardwarekonfiguration über die COM-Schnittstellen IDXGIAdapter und IDXGIDevice1 ein. Verwenden Sie es, um Ihre Puffer und andere Fensterressourcen zu erstellen und zu konfigurieren. Insbesondere wird das IDXGIFactory2 Fabrikmuster verwendet, um die Grafikressourcen zu erwerben, einschließlich der Swap-Kette (eine Reihe von Bildpuffern). Da DXGI Besitzer der Swap-Chain ist, wird die Schnittstelle IDXGISwapChain1 verwendet, um Frames auf dem Bildschirm darzustellen.
Direct3D Direct3D ist eine Reihe von APIs, die eine virtuelle Darstellung der Grafikschnittstelle bereitstellen und das Zeichnen von Grafiken mit dieser Schnittstelle ermöglichen. Version 11 ist von den Funktionen her in etwa mit OpenGL 4.3 vergleichbar. (OpenGL ES 2.0 hingegen ist von den Funktionen her ähnlich wie DirectX9 und OpenGL 2.0, jedoch mit der einheitlichen Shader-Pipeline von OpenGL 3.0) Die meiste Arbeit wird mit den Schnittstellen ID3D11Device1 und ID3D11DeviceContext1 erledigt, die den Zugriff auf einzelne Ressourcen und Unterressourcen bzw. den Rendering-Kontext ermöglichen.
Direct2D Direct2D bietet eine Reihe von APIs für GPU-beschleunigtes 2D-Rendering. Es kann als ähnlich zweckmäßig wie OpenVG angesehen werden.
DirectWrite DirectWrite bietet eine Reihe von APIs für GPU-beschleunigtes, hochwertiges Font-Rendering.
DirectXMath DirectXMath bietet eine Reihe von APIs und Makros für den Umgang mit gängigen linearen Algebra- und trigonometrischen Typen, Werten und Funktionen. Diese Typen und Funktionen sind so konzipiert, dass sie gut mit Direct3D und seinen Shader-Operationen zusammenarbeiten.
DirectX HLSL Die aktuelle HLSL-Syntax, die von Direct3D-Shadern verwendet wird. Es implementiert das Direct3D Shader Model 5.0.

 

Überprüfen Sie die Windows Runtime APIs und die Vorlagenbibliothek

Die Windows Runtime APIs stellen die gesamte Infrastruktur für UWP-Anwendungen bereit. Überprüfen Sie sie hier.

Zu den wichtigsten Windows Runtime APIs, die bei der Portierung Ihrer Grafikpipeline verwendet werden, gehören:

Darüber hinaus ist die Windows Runtime C++ Template Library (WRL) eine Vorlagenbibliothek, die eine Low-Level-Methode zur Erstellung und Verwendung von Windows Runtime-Komponenten bietet. Die Direct3D 11-APIs für UWP-Anwendungen werden am besten in Verbindung mit den Schnittstellen und Typen in dieser Bibliothek verwendet, wie z. B. Smart Pointer (ComPtr). Weitere Informationen über die WRL finden Sie unter Windows Runtime C++ Template Library (WRL).

Ändern Sie Ihr Koordinatensystem

Ein Unterschied, der manchmal die ersten Portierungsversuche verwirrt, ist der Wechsel vom traditionellen rechtshändigen OpenGL-Koordinatensystem zum standardmäßigen linkshändigen Direct3D-Koordinatensystem. Diese Änderung in der Koordinatenmodellierung wirkt sich auf viele Teile Ihres Spiels aus, von der Einrichtung und Konfiguration Ihrer Vertex-Puffer bis hin zu vielen Ihrer mathematischen Matrixfunktionen. Die beiden wichtigsten Änderungen, die vorgenommen werden müssen, sind:

  • Drehen Sie die Reihenfolge der Dreieckspunkte um, so dass Direct3D sie im Uhrzeigersinn von vorne durchläuft. Wenn Ihre Eckpunkte beispielsweise in Ihrer OpenGL-Pipeline als 0, 1 und 2 indiziert sind, übergeben Sie sie stattdessen als 0, 2, 1 an Direct3D.
  • Verwenden Sie die Ansichtsmatrix, um den Weltraum um -1.0f in z-Richtung zu skalieren, wodurch die Koordinaten der z-Achse effektiv umgekehrt werden. Drehen Sie dazu das Vorzeichen der Werte an den Positionen M31, M32 und M33 in Ihrer Ansichtsmatrix um (wenn Sie sie auf den Typ Matrix portieren). Wenn M34 nicht 0 ist, muss auch sein Vorzeichen umgedreht werden.

Direct3D kann jedoch ein rechtshändiges Koordinatensystem unterstützen. DirectXMath bietet eine Reihe von Funktionen, die sowohl mit linkshändigen als auch mit rechtshändigen Koordinatensystemen arbeiten. Sie können verwendet werden, um einen Teil der ursprünglichen Netzdaten und der Matrixverarbeitung zu erhalten. Dazu gehören:

DirectXMath-Matrix-Funktion Beschreibung
XMMatrixLookAtLH Erstellt eine Ansichtsmatrix für ein linkshändiges Koordinatensystem unter Verwendung einer Kameraposition, einer Aufwärtsrichtung und eines Brennpunkts.
XMMatrixLookAtRH Erstellt eine Ansichtsmatrix für ein rechtshändiges Koordinatensystem unter Verwendung einer Kameraposition, einer Aufwärtsrichtung und eines Brennpunkts.
XMMatrixLookToLH Erstellt eine Ansichtsmatrix für ein linkshändiges Koordinatensystem unter Verwendung einer Kameraposition, einer Aufwärtsrichtung und einer Kamerarichtung.
XMMatrixLookToRH Erstellt eine Ansichtsmatrix für ein rechtshändiges Koordinatensystem unter Verwendung einer Kameraposition, einer Aufwärtsrichtung und einer Kamerarichtung.
XMMatrixOrthographicLH Erzeugt eine orthogonale Projektionsmatrix für ein linkshändiges Koordinatensystem.
XMMatrixOrthographicOffCenterLH Erstellt eine eigene orthogonale Projektionsmatrix für ein linkshändiges Koordinatensystem.
XMMatrixOrthographicOffCenterRH Erstellt eine eigene orthogonale Projektionsmatrix für ein rechtshändiges Koordinatensystem.
XMMatrixOrthographicRH Erzeugt eine orthogonale Projektionsmatrix für ein rechtshändiges Koordinatensystem.
XMMatrixPerspectiveFovLH Erstellt eine linkshändige perspektivische Projektionsmatrix auf der Grundlage eines Sichtfelds.
XMMatrixPerspectiveFovRH Erstellt eine rechtshändige perspektivische Projektionsmatrix auf der Grundlage eines Sichtfelds.
XMMatrixPerspectiveLH Erzeugt eine linkshändige perspektivische Projektionsmatrix.
XMMatrixPerspectiveOffCenterLH Erstellt eine benutzerdefinierte Version einer linkshändigen perspektivischen Projektionsmatrix.
XMMatrixPerspectiveOffCenterRH Erstellt eine benutzerdefinierte Version einer rechtshändigen perspektivischen Projektionsmatrix.
XMMatrixPerspectiveRH Erzeugt eine rechtshändige perspektivische Projektionsmatrix.

 

OpenGL ES2.0-nach-Direct3D 11-Portierung Häufig gestellte Fragen

  • Frage: „Kann ich generell nach bestimmten Zeichenfolgen oder Mustern in meinem OpenGL-Code suchen und sie durch die Direct3D-Entsprechungen ersetzen?“
  • Antwort: Nein. OpenGL ES 2.0 und Direct3D 11 stammen aus unterschiedlichen Generationen der Grafikpipeline-Modellierung. Obwohl es einige oberflächliche Ähnlichkeiten zwischen Konzepten und APIs gibt, wie z. B. den Rendering-Kontext und die Instanzerstellung von Shadern, sollten Sie diese Anleitung sowie die Direct3D 11-Referenz lesen, damit Sie die besten Entscheidungen treffen können, wenn Sie Ihre Pipeline neu erstellen, anstatt eine 1:1-Zuordnung zu versuchen. Wenn Sie jedoch von GLSL auf HLSL portieren, kann die Erstellung eines Satzes gemeinsamer Aliase für GLSL-Variablen, Intrinsics und Funktionen nicht nur die Portierung vereinfachen, sondern es ermöglicht Ihnen auch, nur einen Satz von Shader-Code-Dateien zu pflegen.