Portieren eines einfachen OpenGL ES 2.0-Renderers zu Direct3D 11
Für diese Portierungsübung beginnen wir mit den Grundlagen: Das Bereitstellen eines einfachen Renderers für einen sich drehenden, vertexschatteten Cube von OpenGL ES 2.0 in Direct3D, sodass er der DirectX 11-App -Vorlage (Universelle Windows-App) aus Visual Studio 2015 entspricht. Während wir diesen Portierungsprozess durchgehen, lernen Sie Folgendes:
- Portieren eines einfachen Satzes von Vertexpuffern zu Direct3D-Eingabepuffern
- Portieren von Uniforms und Attributen zu Konstantenpuffern
- Konfigurieren von Direct3D-Shaderobjekten
- So werden grundlegende HLSL-Semantik in der Direct3D-Shaderentwicklung verwendet
- So portieren Sie sehr einfache GLSL zu HLSL
Dieses Thema beginnt, nachdem Sie ein neues DirectX 11-Projekt erstellt haben. Informationen zum Erstellen eines neuen DirectX 11-Projekts finden Sie unter "Erstellen eines neuen DirectX 11-Projekts für Universelle Windows-Plattform (UWP)".
Das aus einer dieser Links erstellte Projekt hat den gesamten Code für die Direct3D-Infrastruktur vorbereitet, und Sie können sofort mit dem Portieren des Renderers von Open GL ES 2.0 zu Direct3D 11 beginnen.
In diesem Thema werden zwei Codepfade beschrieben, die dieselbe grundlegende Grafikaufgabe ausführen: Anzeigen eines sich drehenden Vertex-schattierten Würfels in einem Fenster. In beiden Fällen behandelt der Code den folgenden Prozess:
- Erstellen eines Würfelgitters aus hartcodierten Daten. Dieses Gitter wird als Liste von Scheitelpunkten dargestellt, wobei jeder Scheitelpunkt eine Position, einen normalen Vektor und einen Farbvektor besitzt. Dieses Gitter wird in einen Vertexpuffer für die zu verarbeitende Schattierungspipeline eingefügt.
- Erstellen von Shaderobjekten zum Verarbeiten des Würfelgitters. Es gibt zwei Shader: einen Vertex-Shader, der die Scheitelpunkte für die Rasterung verarbeitet, und ein Fragment-Shader (Pixel), der die einzelnen Pixel des Würfels nach der Rasterung farbt. Diese Pixel werden in ein Renderziel für die Anzeige geschrieben.
- Bilden der Schattierungssprache, die für die Vertex- und Pixelverarbeitung in den Vertex- bzw. Fragmentshadern verwendet wird.
- Anzeigen des gerenderten Würfels auf dem Bildschirm
Nach Abschluss dieser exemplarischen Vorgehensweise sollten Sie mit den folgenden grundlegenden Unterschieden zwischen Open GL ES 2.0 und Direct3D 11 vertraut sein:
- Die Darstellung von Vertexpuffern und Vertexdaten.
- Der Prozess zum Erstellen und Konfigurieren von Shadern.
- Schattierungssprachen sowie die Eingaben und Ausgaben für Shaderobjekte.
- Verhalten der Bildschirmzeichnung.
In dieser exemplarischen Vorgehensweise verweisen wir auf eine einfache und generische OpenGL-Rendererstruktur, die wie folgt definiert ist:
typedef struct
{
GLfloat pos[3];
GLfloat rgba[4];
} Vertex;
typedef struct
{
// Integer handle to the shader program object.
GLuint programObject;
// The vertex and index buffers
GLuint vertexBuffer;
GLuint indexBuffer;
// Handle to the location of model-view-projection matrix uniform
GLint mvpLoc;
// Vertex and index data
Vertex *vertices;
GLuint *vertexIndices;
int numIndices;
// Rotation angle used for animation
GLfloat angle;
GLfloat mvpMatrix[4][4]; // the model-view-projection matrix itself
} Renderer;
Diese Struktur verfügt über eine Instanz und enthält alle erforderlichen Komponenten zum Rendern eines sehr einfachen Vertex-schattierten Gitters.
Beachten Sie, dass openGL ES 2.0-Code in diesem Thema auf der Windows-API-Implementierung basiert, die von der Khronos-Gruppe bereitgestellt wird und die Windows C-Programmiersyntax verwendet.
Wichtige Informationen
Technologie
- Microsoft Visual C++
- OpenGL ES 2.0
Voraussetzungen
- Optional. Überprüfen Sie portieren von EGL-Code zu DXGI und Direct3D. Lesen Sie dieses Thema, um die von DirectX bereitgestellte Grafikschnittstelle besser zu verstehen.
Schritte
Thema | Beschreibung |
---|---|
Beim Portieren des einfachen Renderers von OpenGL ES 2.0 besteht der erste Schritt darin, die entsprechenden Vertex- und Fragmentshaderobjekte in Direct3D 11 einzurichten und sicherzustellen, dass das Hauptprogramm nach der Kompilierung mit den Shaderobjekten kommunizieren kann. |
|
In diesem Schritt definieren Sie die Vertexpuffer, die Ihre Gitter und die Indexpuffer enthalten, mit denen die Shader die Scheitelpunkte in einer angegebenen Reihenfolge durchlaufen können. |
|
Nachdem Sie den Code über den Code verschoben haben, der Ihre Puffer und Shaderobjekte erstellt und konfiguriert, ist es an der Zeit, den Code innerhalb dieser Shader aus der GL Shader Language (GLSL) von OpenGL ES 2.0 in die High-Level Shader Language (HLSL) von Direct3D 11 zu portieren. |
|
Schließlich portieren wir den Code, der den sich drehenden Würfel auf den Bildschirm zeichnet. |
Weitere Ressourcen:
- Vorbereiten der Entwicklungsumgebung für die Entwicklung von UWP-DirectX-Spielen
- Erstellen eines neuen DirectX 11-Projekts für UWP
- Zuordnen von OpenGL ES 2.0-Konzepten und -Infrastruktur zu Direct3D 11