Zuordnen von DirectX 9-Features zu DirectX 11-APIs
Verstehen, wie die von Ihrem Direct3D 9-Spiel verwendeten Features in Direct3D 11 und die Universelle Windows-Plattform (UWP) übersetzt werden.
Siehe auch "Planen Des DirectX-Ports" und "Wichtige Änderungen von Direct3D 9" zu "Direct3D 11".
Zuordnen von Direct3D 9 zu DirectX 11-APIs
Direct3D ist weiterhin die Grundlage für DirectX-Grafiken, aber die API hat sich seit DirectX 9 geändert:
- Microsoft DirectX Graphics Infrastructure (DXGI) wird zum Einrichten von Grafikkarten verwendet. Verwenden Sie DXGI , um Pufferformate auszuwählen, Swapchains zu erstellen, Frames darzustellen und freigegebene Ressourcen zu erstellen. Siehe DXGI Overview.
- Ein Direct3D-Gerätekontext wird verwendet, um den Pipelinestatus festzulegen und Renderingbefehle zu generieren. Die meisten unserer Beispiele verwenden einen unmittelbaren Kontext, um direkt auf dem Gerät zu rendern; Direct3D 11 unterstützt auch Multithread-Rendering, in diesem Fall werden verzögerte Kontexte verwendet. Siehe Einführung in ein Gerät in Direct3D 11.
- Einige Features sind veraltet, insbesondere die Pipeline für feste Funktionen. Siehe veraltete Features.
Eine vollständige Liste der Direct3D 11-Features finden Sie unter Direct3D 11-Features und Direct3D 11-Features.
Wechseln von Direct2D 9 zu Direct2D 11
Direct2D (Windows) ist weiterhin ein wichtiger Bestandteil von DirectX-Grafiken und Windows. Sie können Direct2D weiterhin verwenden, um 2D-Spiele zu zeichnen und Überlagerungen (HUDs) über Direct3D zu zeichnen.
Direct2D wird über Direct3D ausgeführt; 2D-Spiele können mithilfe einer der beiden APIs implementiert werden. Ein mit Direct3D implementiertes 2D-Spiel kann z. B. die orthografische Projektion verwenden, Z-Werte festlegen, um die Zeichnungsreihenfolge von Grundtypen zu steuern und Pixelshader zum Hinzufügen von Spezialeffekten zu verwenden.
Da Direct2D auf Direct3D basiert, verwendet es auch DXGI- und Gerätekontexte. Siehe Übersicht über die Direct2D-API.
Die DirectWrite-API bietet Unterstützung für formatierten Text mit Direct2D. Siehe Einführung in DirectWrite.
Ersetzen veralteter Hilfsbibliotheken
D3DX und DXUT sind veraltet und können nicht von UWP-Spielen verwendet werden. Diese Hilfsbibliotheken haben Ressourcen für Aufgaben wie das Laden von Texturen und das Laden von Gittern bereitgestellt.
- Im einfachen Port von Direct3D 9 zu UWP wird veranschaulicht, wie Sie ein Fenster einrichten, Direct3D initialisieren und einfaches 3D-Rendering ausführen.
- Das einfache UWP-Spiel mit DirectX-exemplarische Vorgehensweise veranschaulicht allgemeine Aufgaben der Spieleprogrammierung, einschließlich Grafiken, Laden von Dateien, UI, Steuerelementen und Sound.
- Das DirectX Tool Kit-Communityprojekt bietet Hilfsklassen für die Verwendung mit Direct3D 11- und UWP-Apps.
Verschieben von Shaderprogrammen von FX auf HLSL
Die Hilfsprogrammbibliothek D3DX (D3DX 9, D3DX 10 und D3DX 11), einschließlich Effects, ist für UWP veraltet. Alle DirectX-Spiele für UWP steuern die Grafikpipeline mit HLSL ohne Effekte.
Visual Studio verwendet FXC weiterhin unter der Haube, um Shaderobjekte zu kompilieren. UWP-Game-Shader werden vorab kompiliert. Der Bytecode wird zur Laufzeit geladen, dann wird jede Shaderressource während des entsprechenden Renderingdurchlaufs an die Grafikpipeline gebunden. Shader sollten in eigene separate Shader verschoben werden. HLSL-Dateien und Renderingtechniken sollten in Ihrem C++-Code implementiert werden.
Einen schnellen Blick auf das Laden von Shaderressourcen finden Sie unter "Einfacher Port von Direct3D 9 zu UWP".
Direct3D 11 hat Shadermodell 5 eingeführt, das die Direct3D-Featureebene 11_0 (oder höher) erfordert. Siehe HLSL-Shadermodell 5-Features für Direct3D 11.
Ersetzen von XNAMath und D3DXMath
Code mit XNAMath (oder D3DXMath) sollte zu DirectXMath migriert werden. DirectXMath enthält Typen, die über x86, x64 und Arm portierbar sind. Siehe Codemigration aus der XNA Math Library.
Beachten Sie, dass DirectXMath-Float-Typen für die Verwendung mit Shadern geeignet sind. Beispielsweise XMFLOAT4 und XMFLOAT4X4 Daten für Konstantenpuffer bequem ausrichten.
Ersetzen von DirectSound durch XAudio2 (und Hintergrundaudio)
DirectSound wird für UWP nicht unterstützt:
- Verwenden Sie XAudio2 , um Ihrem Spiel Soundeffekte hinzuzufügen.
Ersetzen von DirectInput durch XInput- und Windows-Runtime-APIs
DirectInput wird für UWP nicht unterstützt:
- Verwenden Sie CoreWindow-Eingabeereignisrückrufe für Maus-, Tastatur- und Toucheingaben.
- Verwenden Sie XInput 1.4 für die Unterstützung von Gamecontrollern (und gamecontroller Kopfhörer Unterstützung). Wenn Sie eine freigegebene Codebasis für Desktop und UWP verwenden, finden Sie informationen zur Abwärtskompatibilität unter XInput-Versionen .
- Registrieren Sie sich für EdgeGesture-Ereignisse , wenn Ihr Spiel die App-Leiste verwenden muss.
Verwenden von Microsoft Media Foundation anstelle von DirectShow
DirectShow ist nicht mehr Teil der DirectX-API (oder der Windows-API). Microsoft Media Foundation stellt Videoinhalte mithilfe von freigegebenen Oberflächen für Direct3D bereit. Siehe Direct3D 11-Video-APIs.
Ersetzen von DirectPlay durch Netzwerkcode
Microsoft DirectPlay ist veraltet. Wenn Ihr Spiel Netzwerkdienste verwendet, müssen Sie Netzwerkcode bereitstellen, der den UWP-Anforderungen entspricht. Verwenden Sie die folgenden APIs:
- Win32 und COM für UWP-Apps (Netzwerk) (Windows)
- Windows.Networking-Namespace (Windows)
- Windows.Networking.Sockets-Namespace (Windows)
- Windows.Networking.Connectivity-Namespace (Windows)
- Windows.ApplicationModel.Background-Namespace (Windows)
In den folgenden Artikeln können Sie Netzwerkfeatures hinzufügen und Unterstützung für Netzwerke im App-Paketmanifest deklarieren.
- Herstellen einer Verbindung mit Sockets (UWP-Apps mit C#/VB/C++ und XAML) (Windows)
- Herstellen einer Verbindung mit WebSockets (UWP-Apps mit C#/VB/C++ und XAML) (Windows)
- Herstellen einer Verbindung mit Webdiensten (UWP-Apps mit C#/VB/C++ und XAML) (Windows)
- Netzwerkgrundlagen
Beachten Sie, dass alle UWP-Apps (einschließlich Spielen) bestimmte Arten von Hintergrundaufgaben verwenden, um die Konnektivität aufrechtzuerhalten, während die App angehalten wird. Wenn Ihr Spiel den Verbindungsstatus beibehalten muss, während die Netzwerkgrundlagen angehalten werden.
Funktionszuordnung
Verwenden Sie die folgende Tabelle, um Code aus Direct3D 9 in Direct3D 11 zu konvertieren. Dies kann auch dabei helfen, zwischen dem Gerät und dem Gerätekontext zu unterscheiden.
Direct3D9 | Direct3D 11-Entsprechung |
---|---|
Die Grafikpipelinephasen werden in der Grafikpipeline beschrieben. |
|
Call IDXGISwapChain1::P resent1 with the DXGI_PRESENT_TEST flag set. |
|
ID3D11DeviceContext::DrawIndexed ID3D11DeviceContext::DrawIndexedInstanced ID3D11DeviceContext::DrawInstanced |
|
Keine direkte Entsprechung |
|
Verwenden Sie Standardcursor-APIs. |
|
VERLORENes Gerät und POOL_MANAGED nicht mehr vorhanden. IDXGISwapChain1::P resent1 kann mit einem DXGI_ERROR_DEVICE_REMOVED Rückgabewert fehlschlagen. |
|
IDirect3DDevice9:DrawRectPatch IDirect3DDevice9:MultiplizierenTransform |
Die Pipeline mit fester Funktion ist veraltet. |
IDirect3DDevice9:CheckDepthStencilMatch IDirect3DDevice9:CheckDeviceFormat |
Funktionsbits werden durch Featureebenen ersetzt. Nur wenige Format- und Featureverwendungsfälle sind für eine bestimmte Featureebene optional. Diese können mit ID3D11Device::CheckFeatureSupport und ID3D11Device::CheckFormatSupport überprüft werden. |
Surface-Formatzuordnung
Verwenden Sie die folgende Tabelle, um Direct3D 9-Formate in DXGI-Formate zu konvertieren.
Direct3D 9-Format | Direct3D 11-Format |
---|---|
D3DFMT_UNKNOWN |
DXGI_FORMAT_UNKNOWN |
D3DFMT_R8G8B8 |
Nicht verfügbar |
D3DFMT_A8R8G8B8 |
DXGI_FORMAT_B8G8R8A8_UNORM DXGI_FORMAT_B8G8R8A8_UNORM_SRGB |
D3DFMT_X8R8G8B8 |
DXGI_FORMAT_B8G8R8X8_UNORM DXGI_FORMAT_B8G8R8X8_UNORM_SRGB |
D3DFMT_R5G6B5 |
DXGI_FORMAT_B5G6R5_UNORM |
D3DFMT_X1R5G5B5 |
Nicht verfügbar |
D3DFMT_A1R5G5B5 |
DXGI_FORMAT_B5G5R5A1_UNORM |
D3DFMT_A4R4G4B4 |
DXGI_FORMAT_B4G4R4A4_UNORM |
D3DFMT_R3G3B2 |
Nicht verfügbar |
D3DFMT_A8 |
DXGI_FORMAT_A8_UNORM |
D3DFMT_A8R3G3B2 |
Nicht verfügbar |
D3DFMT_X4R4G4B4 |
Nicht verfügbar |
D3DFMT_A2B10G10R10 |
DXGI_FORMAT_R10G10B10A2 |
D3DFMT_A8B8G8R8 |
DXGI_FORMAT_R8G8B8A8_UNORM DXGI_FORMAT_R8G8B8A8_UNORM_SRGB |
D3DFMT_X8B8G8R8 |
Nicht verfügbar |
D3DFMT_G16R16 |
DXGI_FORMAT_R16G16_UNORM |
D3DFMT_A2R10G10B10 |
Nicht verfügbar |
D3DFMT_A16B16G16R16 |
DXGI_FORMAT_R16G16B16A16_UNORM |
D3DFMT_A8P8 |
Nicht verfügbar |
D3DFMT_P8 |
Nicht verfügbar |
D3DFMT_L8 |
DXGI_FORMAT_R8_UNORM
Hinweis: Verwenden Sie ".r swizzle" im Shader, um Rot in andere Komponenten zu duplizieren, um das Direct3D 9-Verhalten zu erhalten.
|
D3DFMT_A8L8 |
DXGI_FORMAT_R8G8_UNORM
Hinweis : Verwenden Sie swizzle .rrrg im Shader, um Rot zu duplizieren und Grün zu den Alphakomponenten zu verschieben, um Direct3D 9-Verhalten zu erhalten.
|
D3DFMT_A4L4 |
Nicht verfügbar |
D3DFMT_V8U8 |
DXGI_FORMAT_R8G8_SNORM |
D3DFMT_L6V5U5 |
Nicht verfügbar |
D3DFMT_X8L8V8U8 |
Nicht verfügbar |
D3DFMT_Q8W8V8U8 |
DXGI_FORMAT_R8G8B8A8_SNORM |
D3DFMT_V16U16 |
DXGI_FORMAT_R16G16_SNORM |
D3DFMT_W11V11U10 |
Nicht verfügbar |
D3DFMT_A2W10V10U10 |
Nicht verfügbar |
D3DFMT_UYVY |
Nicht verfügbar |
D3DFMT_R8G8_B8G8 |
DXGI_FORMAT_G8R8_G8B8_UNORM
Hinweis In Direct3D 9 wurden die Daten um 255,0f skaliert, dies kann jedoch im Shader behandelt werden.
|
D3DFMT_YUY2 |
Nicht verfügbar |
D3DFMT_G8R8_G8B8 |
DXGI_FORMAT_R8G8_B8G8_UNORM
Hinweis In Direct3D 9 wurden die Daten um 255,0f skaliert, dies kann jedoch im Shader behandelt werden.
|
D3DFMT_DXT1 |
DXGI_FORMAT_BC1_UNORM & DXGI_FORMAT_BC1_UNORM_SRGB |
D3DFMT_DXT2 |
DXGI_FORMAT_BC1_UNORM & DXGI_FORMAT_BC1_UNORM_SRGB
Note DXT1 and DXT2 are the same from an API/hardware perspective. Der einzige Unterschied besteht darin, ob prämultipliziertes Alpha verwendet wird, das von einer Anwendung nachverfolgt werden kann und kein separates Format benötigt.
|
D3DFMT_DXT3 |
DXGI_FORMAT_BC2_UNORM & DXGI_FORMAT_BC2_UNORM_SRGB |
D3DFMT_DXT4 |
DXGI_FORMAT_BC2_UNORM & DXGI_FORMAT_BC2_UNORM_SRGB
Note DXT3 and DXT4 are the same from an API/hardware perspective. Der einzige Unterschied besteht darin, ob prämultipliziertes Alpha verwendet wird, das von einer Anwendung nachverfolgt werden kann und kein separates Format benötigt.
|
D3DFMT_DXT5 |
DXGI_FORMAT_BC3_UNORM & DXGI_FORMAT_BC3_UNORM_SRGB |
D3DFMT_D16 & D3DFMT_D16_LOCKABLE |
DXGI_FORMAT_D16_UNORM |
D3DFMT_D32 |
Nicht verfügbar |
D3DFMT_D15S1 |
Nicht verfügbar |
D3DFMT_D24S8 |
Nicht verfügbar |
D3DFMT_D24X8 |
Nicht verfügbar |
D3DFMT_D24X4S4 |
Nicht verfügbar |
D3DFMT_D16 |
DXGI_FORMAT_D16_UNORM |
D3DFMT_D32F_LOCKABLE |
DXGI_FORMAT_D32_FLOAT |
D3DFMT_D24FS8 |
Nicht verfügbar |
D3DFMT_S1D15 |
Nicht verfügbar |
D3DFMT_S8D24 |
DXGI_FORMAT_D24_UNORM_S8_UINT |
D3DFMT_X8D24 |
Nicht verfügbar |
D3DFMT_X4S4D24 |
Nicht verfügbar |
D3DFMT_L16 |
DXGI_FORMAT_R16_UNORM
Hinweis: Verwenden Sie den SWizzle-Code im Shader, um Rot in andere Komponenten zu duplizieren, um das D3D9-Verhalten zu erhalten.
|
D3DFMT_INDEX16 |
DXGI_FORMAT_R16_UINT |
D3DFMT_INDEX32 |
DXGI_FORMAT_R32_UINT |
D3DFMT_Q16W16V16U16 |
DXGI_FORMAT_R16G16B16A16_SNORM |
D3DFMT_MULTI2_ARGB8 |
Nicht verfügbar |
D3DFMT_R16F |
DXGI_FORMAT_R16_FLOAT |
D3DFMT_G16R16F |
DXGI_FORMAT_R16G16_FLOAT |
D3DFMT_A16B16G16R16F |
DXGI_FORMAT_R16G16B16A16_FLOAT |
D3DFMT_R32F |
DXGI_FORMAT_R32_FLOAT |
D3DFMT_G32R32F |
DXGI_FORMAT_R32G32_FLOAT |
D3DFMT_A32B32G32R32F |
DXGI_FORMAT_R32G32B32A32_FLOAT |
D3DFMT_CxV8U8 |
Nicht verfügbar |
D3DDECLTYPE_FLOAT1 |
DXGI_FORMAT_R32_FLOAT |
D3DDECLTYPE_FLOAT2 |
DXGI_FORMAT_R32G32_FLOAT |
D3DDECLTYPE_FLOAT3 |
DXGI_FORMAT_R32G32B32_FLOAT |
D3DDECLTYPE_FLOAT4 |
DXGI_FORMAT_R32G32B32A32_FLOAT |
D3DDECLTYPED3DCOLOR |
Nicht verfügbar |
D3DDECLTYPE_UBYTE4 |
DXGI_FORMAT_R8G8B8A8_UINT
Hinweis : Der Shader ruft UINT-Werte ab, aber wenn integrale Floats im Direct3D 9-Stil erforderlich sind (0,0f, 1,0f... 255.f), UINT kann einfach in float32 im Shader konvertiert werden.
|
D3DDECLTYPE_SHORT2 |
DXGI_FORMAT_R16G16_SINT
Beachten Sie, dass der Shader SINT-Werte abruft, aber wenn integrale Floats im Direct3D 9-Stil erforderlich sind, kann SINT einfach in float32 im Shader konvertiert werden.
|
D3DDECLTYPE_SHORT4 |
DXGI_FORMAT_R16G16B16A16_SINT
Beachten Sie, dass der Shader SINT-Werte abruft, aber wenn integrale Floats im Direct3D 9-Stil erforderlich sind, kann SINT einfach in float32 im Shader konvertiert werden.
|
D3DDECLTYPE_UBYTE4N |
DXGI_FORMAT_R8G8B8A8_UNORM |
D3DDECLTYPE_SHORT2N |
DXGI_FORMAT_R16G16_SNORM |
D3DDECLTYPE_SHORT4N |
DXGI_FORMAT_R16G16B16A16_SNORM |
D3DDECLTYPE_USHORT2N |
DXGI_FORMAT_R16G16_UNORM |
D3DDECLTYPE_USHORT4N |
DXGI_FORMAT_R16G16B16A16_UNORM |
D3DDECLTYPE_UDEC3 |
Nicht verfügbar |
D3DDECLTYPE_DEC3N |
Nicht verfügbar |
D3DDECLTYPE_FLOAT16_2 |
DXGI_FORMAT_R16G16_FLOAT |
D3DDECLTYPE_FLOAT16_4 |
DXGI_FORMAT_R16G16B16A16_FLOAT |
FourCC 'ATI1' |
DXGI_FORMAT_BC4_UNORM
Hinweis Erfordert Featureebene 10.0 oder höher
|
FourCC 'ATI2' |
DXGI_FORMAT_BC5_UNORM
Hinweis Erfordert Featureebene 10.0 oder höher
|
Zusätzliche Zuordnungsinformationen
- IDirect3DDevice9::SetCursorPosition wird durch SetCursorPos ersetzt.
- IDirect3DDevice9::SetCursorProperties wird durch SetCursor ersetzt.
- IDirect3DDevice9::SetIndices wird durch ID3D11DeviceContext::IASetIndexBuffer ersetzt.
- IDirect3DDevice9::SetRenderTarget wird durch ID3D11DeviceContext::OMSetRenderTargets ersetzt.
- IDirect3DDevice9::SetScissorRect wird durch ID3D11DeviceContext::RSSetScissorRects ersetzt.
- IDirect3DDevice9::SetStreamSource wird durch ID3D11DeviceContext::IASetVertexBuffers ersetzt.
- IDirect3DDevice9::SetVertexDeclaration wird durch ID3D11DeviceContext::IASetInputLayout ersetzt.
- IDirect3DDevice9::SetViewport wird durch ID3D11DeviceContext::RSSetViewports ersetzt.
- IDirect3DDevice9::ShowCursor wird durch ShowCursor ersetzt.
Die Steuerung der Hardware-Gammahierarchie der Grafikkarte über IDirect3DDevice9::SetGammaRamp wird durch IDXGIOutput::SetGammaControl ersetzt. Siehe Verwenden der Gammakorrektur.
IDirect3DDevice9::P rocessVertices wird durch die Stream-Output-Funktionalität von Geometry-Shadern ersetzt. Weitere Informationen finden Sie unter "Erste Schritte mit der Streamausgabestufe".
Die Methode IDirect3DDevice9::SetClipPlane zum Festlegen von Benutzerclipebenen wurde entweder durch die HLSL-SV_ClipDistance Vertexshaderausgabesemantik (siehe Semantik), die in VS_4_0 und nach oben verfügbar ist, oder durch das neue HLSL-Clipplanes-Funktionsattribute ersetzt (siehe Benutzerclipebenen auf Featureebene 9 Hardware).
IDirect3DDevice9::SetPaletteEntries und IDirect3DDevice9::SetCurrentTexturePalette sind veraltet. Ersetzen Sie diese durch einen Pixelshader, der stattdessen Farben in einer 256 x 1-R8G8B8A8 Textur nachsieht.
Tessellationsfunktionen mit fester Funktion wie DrawRectPatch, DrawTriPatch, SetNPatchMode und DeletePatch sind veraltet. Ersetzen Sie diese durch programmierbare SM5.0-Tessellationsshader (wenn Hardware Tessellation-Shader unterstützt).
IDirect3DDevice9::SetFVF- und FVF-Codes werden nicht mehr unterstützt. Sie sollten vor dem Portieren zu D3D11-Eingabelayouts von D3D8/D3D9 FVF-Codes zu D3D9-Vertexdeklarationen portieren.
Alle D3DDECLTYPE Typen, die nicht direkt unterstützt werden, können relativ effizient mit einer kleinen Anzahl bitweiser Vorgänge am Anfang eines Vertex-Shaders in VS_4_0 und nach oben emuliert werden.