Modifiche importanti da Direct3D 9 a Direct3D 11Important changes from Direct3D 9 to Direct3D 11

SummarySummary

Questo argomento illustra le principali differenze tra DirectX 9 e DirectX 11.This topic explains the high-level differences between DirectX 9 and DirectX 11.

Direct3D 11 è fondamentalmente lo stesso tipo di API di Direct3D 9, ossia un'interfaccia virtualizzata di basso livello per l'hardware grafico.Direct3D 11 is fundamentally the same type of API as Direct3D 9 - a low-level, virtualized interface into graphics hardware. Consente ancora di eseguire operazioni di disegno di grafica su un'ampia gamma di implementazioni hardware.It still allows you to perform graphics drawing operations on a variety of hardware implementations. Il layout dell'API grafica è cambiato da Direct3D 9, il concetto di contesto di dispositivo è stato esteso ed è stata aggiunta un'API specifica per l'infrastruttura grafica.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. Per le risorse archiviate nel dispositivo Direct3D è disponibile un nuovo meccanismo di polimorfismo dei dati chiamato visualizzazione delle risorse.Resources stored on the Direct3D device have a novel mechanism for data polymorphism called a resource view.

Principali funzioni dell'APICore API functions

In Direct3D 9 devi creare un'interfaccia per l'API Direct3D prima di poter iniziare a usarla.In Direct3D 9 you had to create an interface to the Direct3D API before you could start using it. Nel gioco Direct3D 11 piattaforma UWP (Universal Windows Platform) (UWP) si chiama una funzione statica denominata D3D11CreateDevice per creare il dispositivo e il contesto di dispositivo.In your Direct3D 11 Universal Windows Platform (UWP) game, you call a static function called D3D11CreateDevice to create the device and the device context.

Dispositivi e contesto di dispositivoDevices and device context

Un dispositivo Direct3D 11 rappresenta una scheda grafica virtualizzata.A Direct3D 11 device represents a virtualized graphics adapter. Viene usato per creare risorse nella memoria video, ad esempio caricare trame nella GPU, creare visualizzazioni delle risorse trama e delle catene di scambio o creare campionatori di trame.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. Per un elenco completo degli usi dell'interfaccia per i dispositivi Direct3D 11, vedi ID3D11Device e ID3D11Device1.For a complete list of what a Direct3D 11 device interface is used for see ID3D11Device and ID3D11Device1.

Un contesto di dispositivo Direct3D 11A Direct3D 11. viene usato per impostare lo stato della pipeline e generare i comandi di rendering.device context is used to set pipeline state and generate rendering commands. Una catena di rendering Direct3D 11, ad esempio, usa un contesto di dispositivo per configurare la catena di rendering e disegnare la scena (vedi di seguito).For example, a Direct3D 11 rendering chain uses a device context to set up the rendering chain and draw the scene (see below). Il contesto di dispositivo viene usato per accedere alla memoria video (mapparla) usata dalle risorse dispositivo di Direct3D. Viene inoltre usato per aggiornare i dati delle sottorisorse, ad esempio i dati dei buffer costanti.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. Per un elenco completo di come viene usato un contesto di dispositivo Direct3D 11 per, vedere sul ID3D11DeviceContext e ID3D11DeviceContext1.For a complete list of what a Direct3D 11 device context is used for see ID3D11DeviceContext and ID3D11DeviceContext1. Tieni presente che la maggior parte dei nostri esempi usa un contesto immediato per il rendering diretto nel dispositivo, ma Direct3D 11 supporta anche i contesti di dispositivo posticipati, usati principalmente per il multithreading.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 l'handle del dispositivo e l'handle del contesto di dispositivo vengono ottenuti chiamando D3D11CreateDevice.In Direct3D 11, the device handle and device context handle are both obtained by calling D3D11CreateDevice. Questo metodo corrisponde anche al punto in cui richiedi un set specifico di funzionalità hardware e recuperi informazioni sui livelli di funzionalità Direct3D supportati dalla scheda grafica.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. Per altre info sui dispositivi, i contesti di dispositivi e considerazioni sul threading, vedi l'introduzione ai dispositivi in Direct3D 11.See Introduction to a Device in Direct3D 11 for more info on devices, device contexts, and threading considerations.

Infrastruttura dei dispositivi, buffer del frame e visualizzazioni della destinazione di renderingDevice infrastructure, frame buffers, and render target views

In Direct3D 11 la scheda di dispositivo e la configurazione hardware vengono impostate con l'API DXGI (DirectX Graphics Infrastructure) usando le interfacce COM IDXGIAdapter e IDXGIDevice1 .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. I buffer e altre risorse della finestra (Visible o Offscreen) vengono creati e configurati da interfacce DXGI specifiche. l'implementazione del modello factory IDXGIFactory2 acquisisce risorse DXGI, ad esempio il buffer del frame.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. Poiché DXGI è proprietario della catena di scambio, viene usata un'interfaccia DXGI per presentare i frame sullo schermo. vedere IDXGISwapChain1.Since DXGI owns the swap chain, a DXGI interface is used to present frames to the screen - see IDXGISwapChain1.

Usa IDXGIFactory2 per creare una catena di scambio compatibile con il gioco.Use IDXGIFactory2 to create a swap chain compatible with your game. Devi creare una catena di scambio per una finestra principale o per la composizione (interoperabilità XAML), invece di creare una catena di scambio per un HWND.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.

Risorse dispositivo e visualizzazioni delle risorseDevice resources and resource views

Direct3D 11 supporta un ulteriore livello di polimorfismo per le risorse della memoria video, noto come visualizzazioni.Direct3D 11 supports an additional level of polymorphism on video memory resources known as views. Fondamentalmente, mentre per una trama esisteva un singolo oggetto Direct3D 9 ora hai due oggetti: la risorsa trama, che contiene i dati, e la visualizzazione della risorsa che indica come usare la visualizzazione per il rendering.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. Una visualizzazione basata su una risorsa consente di usare la risorsa per scopi specifici.A view based on a resource enables that resource to be used for a specific purpose. Una risorsa trama 2D, ad esempio, viene creata come ID3D11Texture2D, quindi viene creata una visualizzazione della risorsa shader (ID3D11ShaderResourceView) su tale interfaccia in modo da poterla usare come trama in uno shader.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. È anche possibile creare una visualizzazione di destinazione del rendering (ID3D11RenderTargetView) nella stessa risorsa trama 2D, in modo da poterla usare come superficie di disegno.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 un altro esempio, gli stessi dati pixel sono rappresentati con 2 formati diversi usando 2 visualizzazioni separate per una singola risorsa trama.In another example, the same pixel data is represented in 2 different pixel formats by using 2 separate views on a single texture resource.

La risorsa sottostante deve essere creata con proprietà compatibili con i tipi di visualizzazioni che verranno create dalla risorsa stessa.The underlying resource must be created with properties that are compatible with the type of views that will be created from it. Ad esempio, se un ID3D11RenderTargetView viene applicato a una superficie, quest'area viene creata con il flag di ** _ _ _ destinazione di rendering bind d3d11** .For example, if an ID3D11RenderTargetView is applied to a surface, that surface is created with the D3D11_BIND_RENDER_TARGET flag. Anche la superficie deve avere un formato di superficie DXGI compatibile con il rendering (vedere il ** _ formato DXGI**).The surface also has to have a DXGI surface format compatible with rendering (see DXGI_FORMAT).

La maggior parte delle risorse usate per il rendering eredita dall'interfaccia ID3D11Resource , che eredita da ID3D11DeviceChild.Most of the resources you use for rendering inherit from the ID3D11Resource interface, which inherits from ID3D11DeviceChild. I buffer dei vertici, gli index buffer, i buffer costanti e gli shader sono tutte risorse Direct3D 11.Vertex buffers, index buffers, constant buffers, and shaders are all Direct3D 11 resources. I layout di input e gli stati del campionatore ereditano direttamente da ID3D11DeviceChild.Input layouts and sampler states inherit directly from ID3D11DeviceChild.

Le visualizzazioni delle risorse usano un _ valore enum Format DXGI per indicare il formato pixel.Resources views use a DXGI_FORMAT enum value to indicate the pixel format. Non tutti D3DFMT sono supportati come formato DXGI _ .Not every D3DFMT is supported as a DXGI_FORMAT. Ad esempio, non esiste alcun formato RGB 24bpp in DXGI equivalente a D3DFMT _ R8G8B8.For example, there is no 24bpp RGB format in DXGI that is equivalent to D3DFMT_R8G8B8. Non sono inoltre presenti equivalenti BGR a ogni formato RGB (il _ formato DXGI _ R10G10B10A2 _ UNORM è equivalente a D3DFMT A2B10G10R10 _ , ma non esiste un equivalente diretto a 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). Dovresti prevedere la conversione di qualsiasi contenuto con questi formati legacy nei formati supportati in fase di compilazione.You should plan to convert any content in these legacy formats to supported formats at build-time. Per un elenco completo dei formati DXGI, vedere l'enumerazione del ** _ formato DXGI** .For a complete list of DXGI formats see the DXGI_FORMAT enumeration.

Le risorse dispositivo Direct3D (e le visualizzazioni delle risorse) vengono create prima del rendering della scena.Direct3D device resources (and resource views) are created before the scene is rendered. I contesti di dispositivo sono usati per configurare la catena di rendering, come spiegato di seguito.Device contexts are used to set up the rendering chain, as explained below.

Contesto di dispositivo e catena di renderingDevice context and the rendering chain

In Direct3D 9 e Direct3D 10.x esiste un singolo oggetto dispositivo Direct3D che gestisce la creazione, lo stato e il disegno delle risorse.In Direct3D 9 and Direct3D 10.x, there was a single Direct3D device object which managed resource creation, state, and drawing. In Direct3D 11, l'interfaccia per i dispositivi Direct3D gestisce ancora la creazione delle risorse, ma tutte le operazioni relative a stato e disegno vengono gestite tramite un contesto di dispositivo Direct3D.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. Di seguito è riportato un esempio di come viene usato il contesto di dispositivo (interfacciaID3D11DeviceContext1 ) per impostare la catena di rendering:Here's an example of how the device context (ID3D11DeviceContext1 interface) is used to set up the rendering chain:

  • Impostare e cancellare le visualizzazioni di destinazione del rendering (e la visualizzazione depth stencil)Set and clear render target views (and depth stencil view)
  • Impostare il vertex buffer, l'index buffer e il layout di input per la fase input-assembler (IA)Set the vertex buffer, index buffer, and input layout for the input assembler stage (IA stage)
  • Associare vertex shader e pixel shader alla pipelineBind vertex and pixel shaders to the pipeline
  • Associare i buffer costanti agli shaderBind constant buffers to shaders
  • Associare le visualizzazioni delle trame e i campionatori al pixel shaderBind texture views and samplers to the pixel shader
  • Disegnare la scenaDraw the scene

Quando viene chiamato uno dei metodi ID3D11DeviceContext::Draw, la scena viene disegnata nella visualizzazione di destinazione del rendering.When one of the ID3D11DeviceContext::Draw methods is called, the scene is drawn on the render target view. Al termine, tutto il disegno verrà usato dall'adattatore DXGI per presentare il frame completato chiamando IDXGISwapChain1::P resent1.When you're done will all your drawing the DXGI adapter is used to present the completed frame by calling IDXGISwapChain1::Present1.

Gestione dello statoState management

Direct3D 9 gestisce le impostazioni di stato con un nutrito set di singoli interruttori, impostati con i metodi SetRenderState, SetSamplerState e SetTextureStageState.Direct3D 9 managed state settings with a large set of individual toggles set with the SetRenderState, SetSamplerState, and SetTextureStageState methods. Dato che Direct3D 11 non supporta la pipeline a funzione fissa legacy, il metodo SetTextureStageState è stato sostituito con la scrittura di pixel shader (PS).Since Direct3D 11 does not support the legacy fixed-function pipeline, the SetTextureStageState is replaced by writing pixel shaders (PS). Non esiste un equivalente al blocco dello stato Direct3D 9.There is no equivalent to a Direct3D 9 state block. Direct3D 11 gestisce invece lo stato tramite 4 tipi di oggetti stato che rendono disponibile una soluzione molto più semplice per raggruppare lo stato di rendering.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.

Ad esempio, invece di usare SetRenderState con D3DRS _ ZENABLE, si crea un oggetto DepthStencilState con questa e altre impostazioni di stato correlate e lo si usa per cambiare lo stato durante il rendering.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.

Durante la conversione di applicazioni Direct3D 9 in oggetti stato, tieni presente che le varie combinazioni di stato sono rappresentate come oggetti stato immutabili.When porting Direct3D 9 applications to state objects, be aware that your various state combinations are represented as immutable state objects. Tali oggetti devono essere creati una sola volta e riutilizzati finché validi.They should be created once and re-used as long as they are valid.

Livelli di funzionalità Direct3DDirect3D feature levels

Direct3D include un nuovo meccanismo per determinare l'hardware supportato: i livelli di funzionalità.Direct3D has a new mechanism for determining hardware support called feature levels. Con i livelli di funzionalità è più facile determinare le capacità della scheda grafica, grazie alla possibilità di richiedere un set specifico di funzionalità della GPU.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. Ad esempio, il _ livello di funzionalità 9 1 implementa la funzionalità fornita dalle schede grafiche Direct3D 9, incluso 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. Poiché 9 _ 1 è il livello di funzionalità più basso, è possibile prevedere che tutti i dispositivi supportino un vertex shader e un pixel shader, che erano le stesse fasi supportate dal modello di shader programmabile Direct3D 9.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.

Il tuo gioco userà D3D11CreateDevice per creare il dispositivo e il contesto di dispositivo Direct3D.Your game will use D3D11CreateDevice to create the Direct3D device and device context. Quando chiami questa funzione fornisci un elenco dei livelli di funzionalità che il tuo gioco può supportare.When you call this function you provide a list of feature levels that your game can support. Verrà restituito il massimo livello di funzionalità supportato di tale elenco.It will return the highest supported feature level from that list. Ad esempio, se il gioco può usare trame BC4/BC5 (una funzionalità di hardware DirectX 10), è necessario includere almeno 9 _ 1 e 10 _ 0 nell'elenco dei livelli di funzionalità supportati.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. Se il gioco è in esecuzione su hardware DirectX 9 e non è possibile usare le trame BC4/BC5, D3D11CreateDevice restituirà 9 _ 1.If the game is running on DirectX 9 hardware and BC4/BC5 textures can't be used, then D3D11CreateDevice will return 9_1. In questo modo il gioco può eseguire il fallback a un formato di trama diverso e a trame più ridotte.Then your game can fall back to a different texture format (and smaller textures).

Se decidi di estendere il gioco Direct3D 9 per il supporto dei livelli di funzionalità Direct3D superiori, è prima di tutto consigliabile che tu completi la conversione del codice grafico Direct3D 9 esistente.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. Con il gioco funzionante in Direct3D 11 è molto più semplice aggiungere ulteriori percorsi di rendering con grafica avanzata.After you have your game working in Direct3D 11, it's easier to add additional rendering paths with enhanced graphics.

Per una spiegazione dettagliata del supporto dei livelli di funzionalità, vedi l'articolo dedicato ai livelli di funzionalità Direct3D.See Direct3D feature levels for a detailed explanation of feature level support. Per un elenco completo delle funzionalità di Direct3D 11, vedi gli articoli dedicati alle funzionalità di Direct3D 11 e alle funzionalità di Direct3D 11.1.See Direct3D 11 Features and Direct3D 11.1 Features for a full list of Direct3D 11 features.

Livelli di funzionalità e pipeline programmabileFeature levels and the programmable pipeline

L'evoluzione dell'hardware è continua e dall'introduzione di Direct3D 9 sono state aggiunte varie nuove fasi facoltative alla pipeline grafica programmabile.Hardware has continue to evolve since Direct3D 9, and several new optional stages have been added to the programmable graphics pipeline. Il set di opzioni disponibili per la pipeline grafica varia in base al livello di funzionalità Direct3D.The set of options you have for the graphics pipeline varies with the Direct3D feature level. Il livello di funzionalità 10.0 include la fase del geometry shader con flusso in uscita facoltativo per il rendering in più passaggi sulla GPU.Feature level 10.0 includes the geometry shader stage with optional stream out for multipass rendering on the GPU. Il livello di funzionalità 11 _ 0 include Hull shader e Domain shader per l'uso con lo schema a mosaico hardware.Feature level 11_0 include the hull shader and domain shader for use with hardware tessellation. Il livello di funzionalità 11 _ 0 include anche il supporto completo per gli Shader DirectCompute, mentre i livelli di funzionalità 10. x includono solo il supporto per una forma limitata di DirectCompute.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.

Tutti gli shader sono scritti in HLSL con un profilo di shader corrispondente a un livello di funzionalità Direct3D.All shaders are written in HLSL using a shader profile that corresponds to a Direct3D feature level. I profili shader sono compatibili con le versioni successive, quindi uno shader HLSL che compila con vs _ 4 _ 0 _ level _ 9 _ 1 o PS _ 4 _ 0 _ Level 9 1 funzionerà _ _ su tutti i dispositivi.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. I profili shader non sono compatibili con le versioni precedenti, pertanto uno shader compilato con vs _ 4 _ 1 funziona solo con i dispositivi di livello funzionalità 10 _ 1, 11 _ 0 o 11 _ 1.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.

In Direct3D 9 le costanti per gli shader sono gestite tramite una matrice condivisa con SetVertexShaderConstant e SetPixelShaderConstant.Direct3D 9 managed constants for shaders using a shared array with SetVertexShaderConstant and SetPixelShaderConstant. Direct3D 11 usa i buffer costanti, ovvero risorse come un buffer dei vertici o un index buffer.Direct3D 11 uses constant buffers, which are resources like a vertex buffer or index buffer. I buffer costanti sono progettati per rendere efficiente l'aggiornamento.Constant buffers are designed to be updated efficiently. Invece di organizzare tutte le costanti degli shader in una singola matrice globale, puoi organizzare le costanti in raggruppamenti logici e gestirle tramite uno o più buffer costanti.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. Quando procedi alla conversione del tuo gioco da Direct3D 9 a Direct3D 11, pianifica l'organizzazione dei buffer costanti in modo da poterli aggiornare con efficienza.When you port your Direct3D 9 game to Direct3D 11, plan to organize your constant buffers so that you can update them appropriately. Ad esempio, raggruppa le costanti degli shader che non vengono aggiornate per ogni frame in un buffer costante separato, in modo da evitare di dover caricare costantemente questi dati nella scheda grafica insieme alle costanti degli shader più dinamiche.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.

Nota    La maggior parte delle applicazioni Direct3D 9 ha utilizzato in modo estensivo gli shader, ma occasionalmente è mista all'utilizzo del comportamento legacy della funzione fissa.Note   Most Direct3D 9 applications made extensive use of shaders, but occasionally mixed in use of the legacy fixed-function behavior. Tieni presente che Direct3D 11 usa solo un modello di shader programmabile.Note that Direct3D 11 only uses a programmable shading model. Le funzionalità a funzione fissa legacy di Direct3D 9 sono deprecate.The legacy fixed-function features of Direct3D 9 are deprecated.