Wichtige Änderungen beim Wechsel von Direct3D 9 zu Direct3D 11Important changes from Direct3D 9 to Direct3D 11

ZusammenfassungSummary

In diesem Thema werden allgemeine Unterschiede zwischen DirectX 9 und DirectX 11 erläutert.This topic explains the high-level differences between DirectX 9 and DirectX 11.

Bei Direct3D 11 handelt es sich im Wesentlichen um die gleiche Art von API wie bei Direct3D 9: eine virtualisierte Low-Level-Schnittstelle für Grafikhardware.Direct3D 11 is fundamentally the same type of API as Direct3D 9 - a low-level, virtualized interface into graphics hardware. Sie können damit für viele unterschiedliche Hardwareimplementierungen weiterhin Vorgänge zum Zeichnen von Grafiken durchführen.It still allows you to perform graphics drawing operations on a variety of hardware implementations. Das Layout der Grafik-API hat sich seit Direct3D 9 geändert. Das Konzept des Gerätekontexts wurde erweitert, und es wurde eine API speziell für die Grafikinfrastruktur hinzugefügt.The layout of the graphics API has changed since Direct3D 9; the concept of a device context has been expanded, and an API has been added specifically for graphics infrastructure. Für auf dem Direct3D-Gerät gespeicherte Ressourcen ist ein neuer Mechanismus für Datenpolymorphie (die so genannte Ressourcenansicht) verfügbar.Resources stored on the Direct3D device have a novel mechanism for data polymorphism called a resource view.

Wichtige API-FunktionenCore API functions

In Direct3D 9 mussten Sie eine Schnittstelle für die Direct3D-API erstellen, um sie verwenden zu können.In Direct3D 9 you had to create an interface to the Direct3D API before you could start using it. In Direct3D 11-Spielen für die universelle Windows-Plattform (UWP) rufen Sie die statische Funktion D3D11CreateDevice auf, um das Gerät und den Gerätekontext zu erstellen.In your Direct3D 11 Universal Windows Platform (UWP) game, you call a static function called D3D11CreateDevice to create the device and the device context.

Geräte und GerätekontextDevices and device context

Ein Direct3D 11-Gerät stellt einen virtualisierten Grafikadapter dar.A Direct3D 11 device represents a virtualized graphics adapter. Dieser wird zum Erstellen von Ressourcen im Videospeicher verwendet, z. B. zum Hochladen von Texturen in die GPU, Erstellen von Ansichten für Texturressourcen und Swapchains und Erstellen von Textursamplern.It's used to create resources in video memory, for example: uploading textures to the GPU, creating views on texture resources and swap chains, and creating texture samplers. Eine vollständige Liste der Verwendungsmöglichkeiten für eine Direct3D 11-Geräteschnittstelle finden Sie unter ID3D11Device und ID3D11Device1.For a complete list of what a Direct3D 11 device interface is used for see ID3D11Device and ID3D11Device1.

Ein Direct3D 11-A Direct3D 11. Gerätekontext wird verwendet, um den Pipelinestatus festzulegen und Renderbefehle zu erzeugen.device context is used to set pipeline state and generate rendering commands. Von einer Direct3D 11-Renderkette wird beispielsweise ein Gerätekontext verwendet, um die Renderkette einzurichten und die Szene zu zeichnen (siehe unten).For example, a Direct3D 11 rendering chain uses a device context to set up the rendering chain and draw the scene (see below). Über den Gerätekontext wird auf den Videospeicher zugegriffen (Map), der von den Ressourcen des Direct3D-Geräts verwendet wird. Außerdem werden damit Unterressourcendaten aktualisiert, z. B. Konstantenpufferdaten.The device context is used to access (map) video memory used by Direct3D device resources; it's also used to update subresource data, for example constant buffer data. Eine vollständige Liste der Verwendungsmöglichkeiten für einen Direct3D 11-Gerätekontext finden Sie unter ID3D11DeviceContext und ID3D11DeviceContext1.For a complete list of what a Direct3D 11 device context is used for see ID3D11DeviceContext and ID3D11DeviceContext1. Beachten Sie, dass für die meisten Beispiele ein unmittelbarer Kontext für das direkte Rendern auf dem Gerät genutzt wird. Von Direct3D 11 werden jedoch auch zurückgestellte Gerätekontexte unterstützt, die hauptsächlich für das Multithreading eingesetzt werden.Note that most of our samples use an immediate context to render directly to the device, but Direct3D 11 also supports deferred device contexts, which are primarily used for multithreading.

In Direct3D 11 werden das Handle für das Gerät und das Handle für den Gerätekontext jeweils per Aufruf von D3D11CreateDevice abgerufen.In Direct3D 11, the device handle and device context handle are both obtained by calling D3D11CreateDevice. Mit dieser Methode fordern Sie auch einen bestimmten Satz von Hardwarefeatures an und rufen Informationen zu Direct3D-Featureebenen ab, die vom Grafikadapter unterstützt werden.This method is also where you request a specific set of hardware features and retrieve information on Direct3D feature levels supported by the graphics adapter. Weitere Informationen zu Geräten, Gerätekontexten und Threadaspekten finden Sie unter Einführung in ein Gerät in Direct3D 11.See Introduction to a Device in Direct3D 11 for more info on devices, device contexts, and threading considerations.

Geräteinfrastruktur, Framepuffer und RenderzielansichtenDevice infrastructure, frame buffers, and render target views

In Direct3D 11 werden der Geräteadapter und die Hardwarekonfiguration mithilfe der DirectX Graphics Infrastructure-API (DXGI) unter Verwendung der COM-Schnittstellen IDXGIAdapter und IDXGIDevice1 festgelegt.In Direct3D 11, the device adapter and hardware configuration are set with the DirectX Graphics Infrastructure (DXGI) API using the IDXGIAdapter and IDXGIDevice1 COM interfaces. Puffer und andere Fensterressourcen (sichtbar oder außerhalb des Bildschirms) werden unter Verwendung spezieller DXGI-Schnittstellen erstellt und konfiguriert. Von der Implementierung des IDXGIFactory2-Factorymusters werden DXGI-Ressourcen (etwa der Framepuffer) abgerufen.Buffers and other window resources (visible or offscreen) are created and configured by specific DXGI interfaces; the IDXGIFactory2 factory pattern implementation acquires DXGI resources such as the frame buffer. Da DXGI für die Swapchain zuständig ist, wird eine DXGI-Schnittstelle zum Darstellen von Frames auf dem Bildschirm verwendet. Weitere Informationen finden Sie unter IDXGISwapChain1.Since DXGI owns the swap chain, a DXGI interface is used to present frames to the screen - see IDXGISwapChain1.

Verwenden Sie IDXGIFactory2 zum Erstellen einer mit Ihrem Spiel kompatiblen Swapchain.Use IDXGIFactory2 to create a swap chain compatible with your game. Sie müssen eine Swapchain für ein CoreWindow-Objekt oder für die Komposition (XAML-Interoperabilität) erstellen, anstatt eine Swapchain für ein HWND-Element.You need to create a swap chain for a core window, or for composition (XAML interop), instead of creating a swap chain for an HWND.

Geräteressourcen und RessourcenansichtenDevice resources and resource views

Von Direct3D 11 wird eine zusätzliche Ebene der Polymorphie auf Videospeicherressourcen unterstützt, die als Ansichten bezeichnet werden.Direct3D 11 supports an additional level of polymorphism on video memory resources known as views. Wo vorher ein einzelnes Direct3D 9-Objekt für eine Textur vorhanden war, werden nun zwei Objekte genutzt: die Texturressource, in der die Daten enthalten sind, und die Ressourcenansicht, mit der angegeben wird, wie die Ansicht zum Rendern verwendet wird.Essentially, where you had a single Direct3D 9 object for a texture, you now have two objects: the texture resource, which holds the data, and the resource view, which indicates how the view is used for rendering. Mithilfe einer auf einer Ressource basierenden Ansicht kann diese Ressource für einen bestimmten Zweck verwendet werden.A view based on a resource enables that resource to be used for a specific purpose. Eine 2D-Texturressource wird als ID3D11Texture2D-Element erstellt. Anschließend wird dafür eine Shaderressourcenansicht (ID3D11ShaderResourceView) erstellt, sodass die Verwendung als Textur in einem Shader möglich ist.For example, a 2D texture resource is created as an ID3D11Texture2D, then a shader resource view (ID3D11ShaderResourceView) is created on it so it can be used as a texture in a shader. Außerdem kann eine Renderzielansicht (ID3D11RenderTargetView) für die gleiche 2D-Texturressource erstellt werden, sodass diese als Zeichenoberfläche verwendet werden kann.A render target view (ID3D11RenderTargetView) can also be created on the same 2D texture resource so that it can be used as a drawing surface. In einem anderen Beispiel werden dieselben Pixeldaten in zwei unterschiedlichen Pixelformaten dargestellt, indem zwei separate Ansichten für eine Texturressource genutzt werden.In another example, the same pixel data is represented in 2 different pixel formats by using 2 separate views on a single texture resource.

Die zugrunde liegende Ressource muss mit Eigenschaften erstellt werden, die mit dem Typ der Ansichten kompatibel ist, die auf deren Grundlage erstellt werden.The underlying resource must be created with properties that are compatible with the type of views that will be created from it. Wenn z. b. ein ID3D11RenderTargetView auf eine Oberfläche angewendet wird, wird diese Oberfläche mit dem D3D11 Bind- _ _ _ renderzielflag erstellt.For example, if an ID3D11RenderTargetView is applied to a surface, that surface is created with the D3D11_BIND_RENDER_TARGET flag. Die Oberfläche muss auch ein mit Rendering kompatibles DXGI-Oberflächen Format aufweisen (siehe DXGI- _ Format).The surface also has to have a DXGI surface format compatible with rendering (see DXGI_FORMAT).

Die meisten Ressourcen, die Sie zum Rendern verwenden, erben von der ID3D11Resource-Schnittstelle, die wiederum von ID3D11DeviceChild erbt.Most of the resources you use for rendering inherit from the ID3D11Resource interface, which inherits from ID3D11DeviceChild. Vertexpuffer, Indexpuffer, Konstantenpuffer und Shader sind Direct3D 11-Ressourcen.Vertex buffers, index buffers, constant buffers, and shaders are all Direct3D 11 resources. Eingabelayouts und Samplerzustände erben direkt von ID3D11DeviceChild.Input layouts and sampler states inherit directly from ID3D11DeviceChild.

In Ressourcen Sichten wird ein Enumerationswert für DXGI- _ Format verwendet, um das Pixel Format anzugeben.Resources views use a DXGI_FORMAT enum value to indicate the pixel format. Nicht jede D3DFMT wird als DXGI-Format unterstützt _ .Not every D3DFMT is supported as a DXGI_FORMAT. Beispielsweise gibt es in DXGI kein 24bpp-RGB-Format, das D3DFMT _ R8G8B8 entspricht.For example, there is no 24bpp RGB format in DXGI that is equivalent to D3DFMT_R8G8B8. Es gibt auch keine BGR-Entsprechungen für jedes RGB-Format (DXGI _ _ -Format R10G10B10A2 _ unorm entspricht D3DFMT _ A2B10G10R10, aber es gibt keine direkte Entsprechung zu D3DFMT _ A2R10G10B10).There are also not BGR equivalents to every RGB format (DXGI_FORMAT_R10G10B10A2_UNORM is equivalent to D3DFMT_A2B10G10R10, but there’s no direct equivalent to D3DFMT_A2R10G10B10). Planen Sie ein, alle Inhalte in diesen Legacyformaten zur Buildzeit in unterstützte Formate zu konvertieren.You should plan to convert any content in these legacy formats to supported formats at build-time. Eine umfassende Liste der DXGI-Formate finden Sie in der DXGI- _ formatenumeration .For a complete list of DXGI formats see the DXGI_FORMAT enumeration.

Direct3D-Geräteressourcen (und Ressourcenansichten) werden erstellt, bevor die Szene gerendert wird.Direct3D device resources (and resource views) are created before the scene is rendered. Gerätekontexte werden, wie unten beschrieben, zum Einrichten der Renderkette verwendet.Device contexts are used to set up the rendering chain, as explained below.

Gerätekontext und die RenderketteDevice context and the rendering chain

In Direct3D 9 und Direct3D 10.x war ein einzelnes Direct3D-Geräteobjekt vorhanden, mit dem die Erstellung, der Status und das Zeichnen verwaltet wurde.In Direct3D 9 and Direct3D 10.x, there was a single Direct3D device object which managed resource creation, state, and drawing. In Direct3D 11 wird die Direct3D-Geräteschnittstelle weiterhin zum Verwalten der Ressourcenerstellung verwendet, aber alle Status- und Zeichenvorgänge werden über einen Direct3D-Gerätekontext abgewickelt.In Direct3D 11, the Direct3D device interface still manages resource creation, but all state and drawing operations are handled by using a Direct3D device context. Im Anschluss finden Sie ein Beispiel für die Verwendung des Gerätekontexts (ID3D11DeviceContext1-Schnittstelle) zum Einrichten der Renderkette:Here's an example of how the device context (ID3D11DeviceContext1 interface) is used to set up the rendering chain:

  • Festlegen und Löschen von Renderzielansichten (und der Tiefenschablonen-Ansicht)Set and clear render target views (and depth stencil view)
  • Festlegen des Vertexpuffers, Indexpuffers und Eingabelayouts für die Eingabeassemblerphase (IA-Phase)Set the vertex buffer, index buffer, and input layout for the input assembler stage (IA stage)
  • Binden von Vertex- und Pixelshadern an die PipelineBind vertex and pixel shaders to the pipeline
  • Binden von Konstantenpuffern an ShaderBind constant buffers to shaders
  • Binden von Texturansichten und Samplern an den PixelshaderBind texture views and samplers to the pixel shader
  • Zeichnen der SzeneDraw the scene

Wenn eine der ID3D11DeviceContext::Draw-Methoden aufgerufen wird, wird die Szene in der Renderzielansicht gezeichnet.When one of the ID3D11DeviceContext::Draw methods is called, the scene is drawn on the render target view. Nach Abschluss des Zeichenvorgangs wird der DXGI-Adapter zum Darstellen des abgeschlossenen Frames verwendet, indem IDXGISwapChain1::Present1 aufgerufen wird.When you're done will all your drawing the DXGI adapter is used to present the completed frame by calling IDXGISwapChain1::Present1.

ZustandsverwaltungState management

In Direct3D 9 wurden Zustandseinstellungen mithilfe einer großen Gruppe individueller Umschaltfunktionen verwaltet, die über die Methoden „SetRenderState“, „SetSamplerState“ und „SetTextureStageState“ festgelegt wurden.Direct3D 9 managed state settings with a large set of individual toggles set with the SetRenderState, SetSamplerState, and SetTextureStageState methods. Da Direct3D 11 nicht über Unterstützung für die ältere Pipeline mit festen Funktionen verfügt, wird SetTextureStageState durch das Schreiben von Pixelshadern (PS) ersetzt.Since Direct3D 11 does not support the legacy fixed-function pipeline, the SetTextureStageState is replaced by writing pixel shaders (PS). Es ist kein Äquivalent zu einem Direct3D 9-Statusblock vorhanden.There is no equivalent to a Direct3D 9 state block. Bei Direct3D 11 wird der Zustand stattdessen mit vier Arten von Zustandsobjekten verwaltet, die ein optimiertes Verfahren zum Gruppieren des Renderzustands ermöglichen.Direct3D 11 instead manages state through the use of 4 kinds of state objects which provide a more streamlined way to group the rendering state.

Anstatt setrenderstate mit D3DRS _ zenable zu verwenden, erstellen Sie z. b. ein depthstencilstate-Objekt mit diesem und anderen verwandten Zustands Einstellungen und verwenden es, um den Zustand beim Rendern zu ändern.For example, instead of using SetRenderState with D3DRS_ZENABLE, you create a DepthStencilState object with this and other related state settings and use it to change state while rendering.

Beachten Sie beim Portieren von Direct3D 9-Anwendungen zu Statusobjekten, dass die verschiedenen Statuskombinationen als Objekte mit unveränderlichem Status dargestellt werden.When porting Direct3D 9 applications to state objects, be aware that your various state combinations are represented as immutable state objects. Sie sollten einmal erstellt und dann so lange wiederverwendet werden, wie sie gültig sind.They should be created once and re-used as long as they are valid.

Direct3D-FeatureebenenDirect3D feature levels

Direct3D verfügt über einen neuen Mechanismus zum Bestimmen der Hardwareunterstützung, der die Bezeichnung "Featureebenen" trägt.Direct3D has a new mechanism for determining hardware support called feature levels. Featureebenen erleichtern die Ermittlung der Funktionen des Grafikadapters, da Sie einen sorgfältig definierten Satz von GPU-Funktionen anfordern können.Feature levels simplify the task of figuring out what the graphics adapter can do by allowing you to request a well-defined set of GPU functionality. Die Funktions _ Ebene 9 1 implementiert beispielsweise die Funktionen, die von Direct3D 9-Grafikadaptern bereitgestellt werden, einschließlich Shader Model 2. x.For example, the 9_1 feature level implements the functionality provided by Direct3D 9 graphics adapters, including shader model 2.x. Da 9 _ 1 die geringste Funktionsebene ist, können Sie davon ausgehen, dass alle Geräte einen Vertex-Shader und einen PixelShader unterstützen, die dieselben Stufen wie das programmierbare Shader-Modell Direct3D 9 unterstützen.Since 9_1 is the lowest feature level, you can expect all devices to support a vertex shader and a pixel shader, which were the same stages supported by the Direct3D 9 programmable shader model.

Im Spiel wird D3D11CreateDevice zum Erstellen des Direct3D-Geräts und -Gerätekontexts verwendet.Your game will use D3D11CreateDevice to create the Direct3D device and device context. Wenn Sie diese Funktion aufrufen, geben Sie eine Liste mit Featureebenen an, die vom Spiel unterstützt werden können.When you call this function you provide a list of feature levels that your game can support. Die höchste unterstützte Featureebene der Liste wird zurückgegeben.It will return the highest supported feature level from that list. Wenn Ihr Spiel z. b. BC4/BC5-Texturen (ein Feature von DirectX 10-Hardware) verwenden kann, würden Sie mindestens 9 _ 1 und 10 _ 0 in die Liste der unterstützten Funktionsebenen einschließen.For example if your game can use BC4/BC5 textures (a feature of DirectX 10 hardware), you would include at least 9_1 and 10_0 in the list of supported feature levels. Wenn das Spiel auf DirectX 9-Hardware ausgeführt wird und BC4/BC5-Texturen nicht verwendet werden können, gibt D3D11CreateDevice 9 _ 1 zurück.If the game is running on DirectX 9 hardware and BC4/BC5 textures can't be used, then D3D11CreateDevice will return 9_1. Im Spiel kann dann auf ein anderes Texturformat (und kleinere Texturen) zurückgegriffen werden.Then your game can fall back to a different texture format (and smaller textures).

Wenn Sie sich dafür entscheiden, für das Direct3D 9-Spiel eine Erweiterung auf die Unterstützung höherer Direct3D-Featureebenen durchzuführen, ist es besser, zuerst das Portieren des vorhandenen Direct3D 9-Grafikcodes abzuschließen.If you decide to extend your Direct3D 9 game to support higher Direct3D feature levels then it's better to finish porting your existing Direct3D 9 graphics code first. Nachdem das Spiel unter Direct3D 11 funktioniert, können zusätzliche Renderpfade mit erweiterten Grafiken einfacher hinzugefügt werden.After you have your game working in Direct3D 11, it's easier to add additional rendering paths with enhanced graphics.

Eine ausführliche Erklärung der Unterstützung von Featureebenen finden Sie unter Direct3D-Featureebenen.See Direct3D feature levels for a detailed explanation of feature level support. Eine vollständige Liste mit Direct3D 11-Features finden Sie unter Features von Direct3D 11 und Features von Direct3D 11.1.See Direct3D 11 Features and Direct3D 11.1 Features for a full list of Direct3D 11 features.

Featureebenen und die programmierbare PipelineFeature levels and the programmable pipeline

Seit Direct3D 9 hat sich die Hardware weiterentwickelt, und der programmierbaren Grafikpipeline wurden mehrere neue optionale Phasen hinzugefügt.Hardware has continue to evolve since Direct3D 9, and several new optional stages have been added to the programmable graphics pipeline. Die für die Grafikpipeline verfügbaren Optionen variieren je nach Direct3D-Featureebene.The set of options you have for the graphics pipeline varies with the Direct3D feature level. Die Featureebene 10.0 enthält die Geometrie-Shaderphase mit optionalem Streamout für das Rendern mit mehreren Durchläufen über die GPU.Feature level 10.0 includes the geometry shader stage with optional stream out for multipass rendering on the GPU. Funktionsebene 11 _ 0 umfasst den Hull-Shader und den Domänen-Shader für die Verwendung mit dem Hardware-Mosaik.Feature level 11_0 include the hull shader and domain shader for use with hardware tessellation. Die Featureebene 11 _ 0 umfasst auch die vollständige Unterstützung für DirectCompute-Shader, während die featurestufen 10. x nur die Unterstützung für eine begrenzte Form von DirectCompute einschließen.Feature level 11_0 also includes full support for DirectCompute shaders, while feature levels 10.x only include support for a limited form of DirectCompute.

Alle Shader sind unter Verwendung von HLSL-Code mit einem Shaderprofil geschrieben, das einer Direct3D-Featureebene entspricht.All shaders are written in HLSL using a shader profile that corresponds to a Direct3D feature level. Shaderprofile sind aufwärts kompatibel, sodass ein HLSL-Shader, der mit vs _ 4 _ 0 _ Level _ 9 _ 1 oder PS _ 4 _ 0 _ Level _ 9 _ 1 kompiliert wird, auf allen Geräten funktioniert.Shader profiles are upwards compatible, so an HLSL shader that compiles using vs_4_0_level_9_1 or ps_4_0_level_9_1 will work across all devices. Shaderprofile sind nicht abwärts kompatibel, daher funktioniert ein mit vs 4 1 kompilierter Shader _ _ nur auf Featureebene von 10 _ 1, 11 _ 0 oder 11 _ 1 Geräte.Shader profiles are not downlevel compatible, so a shader compiled using vs_4_1 will only work on feature level 10_1, 11_0, or 11_1 devices.

Unter Direct3D 9 wurden Konstanten für Shader mithilfe eines freigegebenen Arrays mit „SetVertexShaderConstant“ und „SetPixelShaderConstant“ verwaltet.Direct3D 9 managed constants for shaders using a shared array with SetVertexShaderConstant and SetPixelShaderConstant. Unter Direct3D 11 werden Konstantenpuffer verwendet, bei denen es sich um Ressourcen handelt, z. B. ein Vertexpuffer oder ein Indexpuffer.Direct3D 11 uses constant buffers, which are resources like a vertex buffer or index buffer. Konstantenpuffer sind für eine effiziente Aktualisierung ausgelegt.Constant buffers are designed to be updated efficiently. Anstelle der Anordnung aller Shaderkonstanten in einem einzelnen globalen Array, ordnen Sie die Konstanten in logischen Gruppierungen an und verwalten sie mithilfe eines oder mehrerer Konstantenpuffer.Instead of having all the shader contants organized into a single global array you organize your constants into logical groupings and manage them through one or more constant buffers. Wenn Sie Ihr Direct3D 9-Spiel zu Direct3D 11 portieren, sollten Sie die Organisation der Konstantenpuffer so planen, dass diese entsprechend aktualisiert werden können.When you port your Direct3D 9 game to Direct3D 11, plan to organize your constant buffers so that you can update them appropriately. Gruppieren Sie Shaderkonstanten, die nicht für jeden Frame aktualisiert werden, in einem separaten Konstantenpuffer, damit diese Daten nicht ständig zusammen mit den dynamischeren Shaderkonstanten an den Grafikadapter hochgeladen werden müssen.For example, group shader constants that aren't updated every frame into a separate constant buffer, so that you don't have to constantly upload that data to the graphics adapter along with your more dynamic shader constants.

Hinweis    Die meisten Direct3D 9-Anwendungen haben eine umfangreiche Verwendung von Shadern vorgenommen, aber gelegentlich mit dem Verhalten der Legacy Funktion mit fester Funktionsweise gemischt.Note   Most Direct3D 9 applications made extensive use of shaders, but occasionally mixed in use of the legacy fixed-function behavior. Beachten Sie, dass von Direct3D 11 nur ein programmierbares Shadermodell verwendet wird.Note that Direct3D 11 only uses a programmable shading model. Die Legacyfeatures von Direct3D 9 mit festen Funktionen werden als veraltet angesehen.The legacy fixed-function features of Direct3D 9 are deprecated.