Planen der Portierung von OpenGL ES 2.0 zu Direct3DPlan your port from OpenGL ES 2.0 to Direct3D

Wichtige APIsImportant APIs

Wenn Sie ein Spiel von der iOS- oder Android-Plattform portieren, haben Sie vermutlich erheblich in OpenGL ES 2.0 investiert.If you are porting a game from the iOS or Android platforms, you have probably made a significant investment in OpenGL ES 2.0. Beim Vorbereiten der Portierung Ihrer Grafikpipeline-Codebasis zu Direct3D 11 und der Windows-Runtime sind im Vorfeld einige Dinge zu beachten.When preparing to move your graphics pipeline codebase to Direct3D 11 and the Windows Runtime, there are a few things you should consider before you start.

Meist beinhaltet das Portieren eine anfängliche Überprüfung der Codebasis und die Zuordnung allgemeiner APIs und Muster zwischen den beiden Modellen.Most porting efforts usually involving initially walking the codebase and mapping common APIs and patterns between the two models. Sie können diesen Vorgang vereinfachen, indem Sie sich die Zeit für die Lektüre dieses Themas nehmen.You'll find this process a bit easier if you take some time to read and review this topic.

Folgende Punkte sind beim Portieren von Grafiken von OpenGL ES 2.0 zu Direct3D 11 zu beachten.Here are some things to be aware of when porting graphics from OpenGL ES 2.0 to Direct3D 11.

Hinweise zu bestimmten OpenGL ES 2.0-AnbieternNotes on specific OpenGL ES 2.0 providers

Die Themen zur Portierung in diesem Abschnitt beziehen sich auf die Windows-Implementierung der von der Khronos Group erstellten OpenGL ES 2.0-Spezifikation.The porting topics in this section reference the Windows implementation of the OpenGL ES 2.0 specification created by the Khronos Group. Alle OpenGL ES 2.0-Codebeispiele wurden mit Visual Studio 2012 und einfacher Windows C-Syntax entwickelt.All OpenGL ES 2.0 code samples were developed using Visual Studio 2012 and basic Windows C syntax. Bedenken Sie im Fall einer Objective-C (iOS)- oder Java (Android)-Codebasis, dass in den gezeigten OpenGL ES 2.0-Codebeispielen möglicherweise keine ähnliche API-Aufrufsyntax oder ähnlichen Parameter verwendet werden.If you are coming from an Objective-C (iOS) or Java (Android) codebase, be aware that the provided OpenGL ES 2.0 code samples may not use similar API calling syntax or parameters. Wir haben versucht, diesen Leitfaden so plattformagnostisch wie möglich zu halten.This guidance tries to stay as platform agnostic as possible.

In dieser Dokumentation werden nur die APIs der 2.0-Spezifikation für den OpenGL ES-Code und die zugehörige Referenz verwendet.This documentation only uses the 2.0 specification APIs for the OpenGL ES code and reference. Falls Sie von OpenGL ES 1.1 oder 3.0 portieren, kann diese Dokumentation trotzdem hilfreich sein, auch wenn Ihnen einige der OpenGL ES 2.0-Codebeispiele und der Kontext vielleicht nicht vertraut sind.If you are porting from OpenGL ES 1.1 or 3.0, this content can still prove useful, although some of the OpenGL ES 2.0 code examples and context may be unfamiliar.

In den Direct3D 11-Beispielen in diesem Thema wird Microsoft Windows C++ mit Komponentenerweiterungen (CX) verwendet.The Direct3D 11 samples in these topics use Microsoft Windows C++ with Component Extensions (CX). Weitere Informationen zu dieser Version der C++-Syntax finden Sie unter Visual C++, Komponenten Erweiterungen für laufzeitplattformenund Kurzübersicht (C++ \ CX).For more info on this version of the C++ syntax, read Visual C++, Component Extensions for Runtime Platforms, and Quick Reference (C++\CX).

Verständnis der Hardwareanforderungen und RessourcenUnderstand your hardware requirements and resources

Die von OpenGL ES 2.0 unterstützten Grafikverarbeitungsfunktionen entsprechen in etwa den in Direct3D 9.1 verfügbaren Funktionen.The set of graphics processing features supported by OpenGL ES 2.0 roughly maps to the features provided in Direct3D 9.1. Wenn Sie die Vorteile der umfassenderen Funktionen von Direct3D 11 nutzen möchten, lesen Sie beim Planen der Portierung die Dokumentation zu Direct3D 11 oder im Anschluss an die Planung die Themen zum Portieren von DirectX 9 zur Universellen Windows-Plattform (UWP).If you want to take advantage of the more advanced features provided in Direct3D 11, review the Direct3D 11 documentation when planning your port, or review the Port from DirectX 9 to Universal Windows Platform (UWP) topics when you're done with the initial effort.

Um Ihre erste Portierung möglichst einfach zu machen, sollten Sie mit einer Visual Studio Direct3D-Vorlage beginnen.To make your initial porting effort simple, start with a Visual Studio Direct3D template. Sie enthält einen einfachen bereits konfigurierten Renderer und unterstützt Features von UWP-Apps wie das Neuerstellen von Ressourcen bei Fensteränderungen und Direct3D-Funktionsebenen.It provides a basic renderer already configured for you, and supports UWP app features like recreating resources on window changes and Direct3D feature levels.

Verständnis der Direct3D-FunktionsebenenUnderstand Direct3D feature levels

Direct3D 11 bietet Unterstützung für Hardware-Funktionsebenen von 9 _ 1 (Direct3D 9,1) für 11 _ 1.Direct3D 11 provides support for hardware "feature levels" from 9_1 (Direct3D 9.1) for 11_1. Diese Funktionsebenen geben die Verfügbarkeit bestimmter Grafikfunktionen und -ressourcen an.These feature levels indicate the availability of certain graphics features and resources. In der Regel unterstützen die meisten OpenGL es 2,0-Plattformen einen Direct3D 9,1 (Feature Level 9 _ 1)-Satz von Features.Typically, most OpenGL ES 2.0 platforms support a Direct3D 9.1 (feature level 9_1) set of features.

Überprüfen der DirectX-Grafikfunktionen und -APIsReview DirectX graphics features and APIs

API-FamilieAPI Family BESCHREIBUNGDescription
DXGIDXGI Die DirectX Graphics Infrastructure (DXGI) stellt eine Schnittstelle zwischen der Grafikhardware und Direct3D bereit.The DirectX Graphics Infrastructure (DXGI) provides an interface between the graphics hardware and Direct3D. Sie legt die Geräteadapter- und Hardwarekonfiguration mit den COM-Schnittstellen IDXGIAdapter und IDXGIDevice1 fest.It sets the device adapter and hardware configuration using the IDXGIAdapter and IDXGIDevice1 COM interfaces. Verwenden Sie sie zum Erstellen und Konfigurieren Ihrer Puffer und anderen Fensterressourcen.Use it to create and configure your buffers and other window resources. Beachten Sie insbesondere, dass das IDXGIFactory2-Factorymuster zum Erfassen der Grafikressourcen verwendet wird, einschließlich der Swapchain (eine Gruppe von Framepuffern).Notably, the IDXGIFactory2 factory pattern iis used to acquire the graphics resources, including the swap chain (a set of frame buffers). Da DXGI der Besitzer der Swapchain ist, wird die IDXGISwapChain1-Schnittstelle verwendet, um Frames auf dem Bildschirm darzustellen.Since DXGI owns the swap chain, the IDXGISwapChain1 interface is used to present frames to the screen.
Direct3DDirect3D Direct3D ist der Satz von APIs, die eine virtuelle Darstellung der Grafikschnittstelle bereitstellen und es Ihnen ermöglichen, damit Grafiken zu zeichnen.Direct3D is the set of APIs that provide a virtual representation of the graphics interface and allow you to draw graphics using it. Version 11 ist von den Funktionen her in etwa mit OpenGL 4.3 vergleichbar.Version 11, is roughly comparable, feature-wise, to OpenGL 4.3. (OpenGL ES .0 ähnelt hinsichtlich der Funktionen dagegen DirectX9 und OpenGL 2.0, verwendet aber die einheitliche Shaderpipeline von OpenGL 3.0.) Der Großteil der Arbeit wird mit den ID3D11Device1- und ID3D11DeviceContext1-Schnittstellen erledigt, die Zugriff auf einzelne Ressourcen und Unterressourcen bzw. den Renderkontext bieten.(OpenGL ES 2.0, on the other hand, is similar to DirectX9, feature-wise, and OpenGL 2.0, but with OpenGL 3.0's unified shader pipeline.) Most of the heavy lifting is done with the ID3D11Device1 and ID3D11DeviceContext1 interfaces which provide access to individual resources and subresources, and the rendering context, respectively.
Direct2DDirect2D Direct2D stellt einen Satz von APIs für GPU-beschleunigtes 2D-Rendering bereit.Direct2D provides a set of APIs for GPU-accelerated 2D rendering. Hinsichtlich des Verwendungszwecks ist es mit OpenVG vergleichbar.It can be considered similar in purpose to OpenVG.
DirectWriteDirectWrite DirectWrite stellt einen Satz von APIs für GPU-beschleunigtes Schriftartrendering in hoher Qualität bereit.DirectWrite provides a set of APIs for GPU-accelerated, high-quality font rendering.
DirectXMathDirectXMath DirectXMath stellt einen Satz von APIs und Makros für die Behandlung allgemeiner linearer Algebra sowie trigonometrischer Typen, Werte und Funktionen bereit.DirectXMath provides a set of APIs and macros for handling common linear algebra and trigonometric types, values, and functions. Diese Typen und Funktionen sind so konzipiert, dass sie gut mit Direct3D und den zugehörigen Shadervorgängen funktionieren.These types and functions are designed to work well with Direct3D and its shader operations.
DirectX HLSLDirectX HLSL Die von Direct3D-Shadern verwendete aktuelle HLSL-Syntax.The current HLSL syntax used by Direct3D shaders. Sie implementiert das Direct3D-Shadermodell 5.0.It implements Direct3D Shader Model 5.0.

 

Überprüfen der Windows-Runtime-APIs und -VorlagenbibliothekReview the Windows Runtime APIs and template library

Die Windows-Runtime-APIs stellen die allgemeine Infrastruktur für UWP-Apps bereit.The Windows Runtime APIs provide the overall infrastructure for UWP apps. Weitere Informationen finden hier.Review them here.

Folgende wichtige Windows-Runtime-APIs werden beim Portieren Ihrer Grafikpipeline verwendet:Key Windows Runtime APIs used in porting your graphics pipeline include:

Die C++-Vorlagenbibliothek für Windows-Runtime (WRL) ist eine Vorlagenbibliothek, die eine einfache Methode zum Erstellen und Verwenden von Komponenten für Windows-Runtime bietet.Additionally, the Windows Runtime C++ Template Library (WRL) is a template library that provides a low-level way to author and use Windows Runtime components. Die Direct3D 11-APIs für UWP-Apps lassen sich am besten in Verbindung mit den Schnittstellen und Typen in dieser Bibliothek wie etwa intelligenten Zeigern (ComPtr) verwenden.The Direct3D 11 APIs for UWP apps are best used in conjunctions with the interfaces and types in this library, such as smart pointers (ComPtr). Weitere Informationen zur WRL finden Sie unter C++-Vorlagenbibliothek für Windows-Runtime (WRL).For more info on the WRL, read Windows Runtime C++ Template Library (WRL).

Ändern des KoordinatensystemsChange your coordinate system

Ein Unterschied, der bei der Portierung anfänglich für Verwirrung sorgen kann, ist die Umstellung vom traditionellen rechtshändigen Koordinatensystem von OpenGL auf das standardmäßige linkshändige Koordinatensystem von Direct3D.One difference that sometimes confuses early port efforts is the change from OpenGL's traditional right-handed coordinate system to Direct3D's default left-handed coordinate system. Diese Änderung der Koordinatenmodellierung wirkt sich auf viele Teile des Spiels aus – angefangen bei der Einrichtung und Konfiguration der Scheitelpunktpuffer bis hin zu vielen der mathematischen Matrixfunktionen.This change in coordinate modeling affects many parts of your game, from the setup and configuration of your vertex buffers to many of your matrix math functions. Die folgenden zwei Änderungen sind am wichtigsten:The two most important changes to make are:

  • Spiegeln Sie die Reihenfolge von Dreieckscheitelpunkten, sodass sie von Direct3D von vorne im Uhrzeigersinn durchlaufen werden.Flip the order of triangle vertices so that Direct3D traverses them clockwise from the front. Wenn die Scheitelpunkte in der OpenGL-Pipeline beispielsweise als 0, 1 und 2 indiziert wurden, übergeben Sie sie stattdessen als 0, 2, 1 an Direct3D.For example, if your vertices are indexed as 0, 1, and 2 in your OpenGL pipeline, pass them to Direct3D as 0, 2, 1 instead.
  • Verwenden Sie die Ansichtsmatrix, um den Raum um -1.0f in der z-Richtung zu skalieren, sodass die z-Achsenkoordinaten umgekehrt werden.Use the view matrix to scale world space by -1.0f in the z direction, effectively reversing the z-axis coordinates. Kehren Sie dazu das Vorzeichen der Werte an den Positionen M31, M32 und M33 in der Ansichtsmatrix um (beim Portieren in den Matrix-Typ).To do this, flip the sign of the values at positions M31, M32, and M33 in your view matrix (when porting it to the Matrix type). Falls M34 nicht 0 ist, kehren Sie das Vorzeichen dieser Position ebenfalls um.If M34 is not 0, flip its sign as well.

Direct3D kann jedoch ein rechtshändiges Koordinatensystem unterstützen.However, Direct3D can support a right-handed coordinate system. DirectXMath bietet eine Reihe von Funktionen, die sowohl für links- als auch für rechtshändige Koordinatensysteme funktionieren.DirectXMath provides a number of functions that operate on and across both left-handed and right-handed coordinate systems. Mithilfe dieser Funktionen können Sie einen Teil Ihrer ursprünglichen Gitterdaten und der Matrixverarbeitung beibehalten.They can be used to preserve some of your original mesh data and matrix processing. Dazu gehören:They include:

DirectXMath-MatrixfunktionDirectXMath matrix function BESCHREIBUNGDescription
XMMatrixLookAtLHXMMatrixLookAtLH Erstellt eine Ansichtsmatrix für ein linkshändiges Koordinatensystem mit einer Kameraposition, einer Aufwärtsrichtung und einem Fokus.Builds a view matrix for a left-handed coordinate system using a camera position, an up direction, and a focal point.
XMMatrixLookAtRHXMMatrixLookAtRH Erstellt eine Ansichtsmatrix für ein rechtshändiges Koordinatensystem mit einer Kameraposition, einer Aufwärtsrichtung und einem Fokus.Builds a view matrix for a right-handed coordinate system using a camera position, an up direction, and a focal point.
XMMatrixLookToLHXMMatrixLookToLH Erstellt eine Ansichtsmatrix für ein linkshändiges Koordinatensystem mit einer Kameraposition, einer Aufwärtsrichtung und einer Kamerarichtung.Builds a view matrix for a left-handed coordinate system using a camera position, an up direction, and a camera direction.
XMMatrixLookToRHXMMatrixLookToRH Erstellt eine Ansichtsmatrix für ein rechtshändiges Koordinatensystem mit einer Kameraposition, einer Aufwärtsrichtung und einer Kamerarichtung.Builds a view matrix for a right-handed coordinate system using a camera position, an up direction, and a camera direction.
XMMatrixOrthographicLHXMMatrixOrthographicLH Erstellt eine orthogonale Projektionsmatrix für ein linkshändiges Koordinatensystem.Builds an orthogonal projection matrix for a left-handed coordinate system.
XMMatrixOrthographicOffCenterLHXMMatrixOrthographicOffCenterLH Erstellt eine benutzerdefinierte orthogonale Projektionsmatrix für ein linkshändiges Koordinatensystem.Builds a custom orthogonal projection matrix for a left-handed coordinate system.
XMMatrixOrthographicOffCenterRHXMMatrixOrthographicOffCenterRH Erstellt eine benutzerdefinierte orthogonale Projektionsmatrix für ein rechtshändiges Koordinatensystem.Builds a custom orthogonal projection matrix for a right-handed coordinate system.
XMMatrixOrthographicRHXMMatrixOrthographicRH Erstellt eine orthogonale Projektionsmatrix für ein rechtshändiges Koordinatensystem.Builds an orthogonal projection matrix for a right-handed coordinate system.
XMMatrixPerspectiveFovLHXMMatrixPerspectiveFovLH Erstellt eine linkshändige perspektivische Projektionsmatrix auf der Grundlage eines Sichtfelds.Builds a left-handed perspective projection matrix based on a field of view.
XMMatrixPerspectiveFovRHXMMatrixPerspectiveFovRH Erstellt eine rechtshändige perspektivische Projektionsmatrix auf der Grundlage eines Sichtfelds.Builds a right-handed perspective projection matrix based on a field of view.
XMMatrixPerspectiveLHXMMatrixPerspectiveLH Erstellt eine linkshändige perspektivische Projektionsmatrix.Builds a left-handed perspective projection matrix.
XMMatrixPerspectiveOffCenterLHXMMatrixPerspectiveOffCenterLH Erstellt eine benutzerdefinierte Version einer linkshändigen perspektivischen Projektionsmatrix.Builds a custom version of a left-handed perspective projection matrix.
XMMatrixPerspectiveOffCenterRHXMMatrixPerspectiveOffCenterRH Erstellt eine benutzerdefinierte Version einer rechtshändigen perspektivischen Projektionsmatrix.Builds a custom version of a right-handed perspective projection matrix.
XMMatrixPerspectiveRHXMMatrixPerspectiveRH Erstellt eine rechtshändige perspektivische Projektionsmatrix.Builds a right-handed perspective projection matrix.

 

Häufig gestellte Fragen zur Portierung von OpenGL ES 2.0 zu Direct3D 11OpenGL ES2.0-to-Direct3D 11 porting Frequently Asked Questions

  • Frage: Kann ich generell nach bestimmten Zeichenfolgen oder Mustern in meinem OpenGL-Code suchen und sie durch die Direct3D-Entsprechungen ersetzen?Question: "In general, can I search for certain strings or patterns in my OpenGL code and replace them with the Direct3D equivalents?"
  • Antwort: Nein.Answer: No. OpenGL ES 2.0 und Direct3D 11 stammen aus verschiedenen Generationen der Grafikpipelinemodellierung.OpenGL ES 2.0 and Direct3D 11 come from different generations of graphics pipeline modeling. Obwohl es Ähnlichkeiten zwischen den Konzepten und APIs gibt (z. B. der Renderkontext und die Instanziierung von Shadern), sollten Sie sowohl diesen Leitfaden als auch die Direct3D 11-Referenz lesen, um beim Neuerstellen Ihrer Pipeline die beste Wahl treffen zu können. Eine 1:1-Zuordnung ist nicht zu empfehlen.While there are some surface similarities between concepts and APIs, such as the rendering context and the instancing of shaders, you should review this guidance as well as the Direct3D 11 reference so you can make the best choices when recreating your pipeline instead of attempting a 1-to-1 mapping. Wenn Sie aber von GLSL zu HLSL portieren, kann das Erstellen eines allgemeinen Satzes von Aliasen für Variablen, systeminterne Elemente und Funktionen von GLSL nicht nur die Portierung vereinfachen, sondern es bietet Ihnen auch die Möglichkeit, mit einem einzigen Satz von Shadercodedateien zu arbeiten.However, if you are porting from GLSL to HLSL, creating a set of common aliases for GLSL variables, intrinsincs, and functions can not only make porting easier, it allows you to maintain only one set of shader code files.