Mapping delle funzionalità di DirectX 9 alle API DirectX 11
Comprendere come le funzionalità usate dai giochi Direct3D 9 verranno convertite in Direct3D 11 e nella piattaforma UWP (Universal Windows Platform).
Vedere anche Pianificare la porta DirectX e Modifiche importanti da Direct3D 9 a Direct3D 11.
Mapping delle API Direct3D 9 alle API DirectX 11
Direct3D rimane la base della grafica DirectX, ma l'API è cambiata da DirectX 9:
- Microsoft DirectX Graphics Infrastructure (DXGI) viene usato per configurare schede grafiche. Usare DXGI per selezionare i formati di buffer, creare swapchain, presentare frame e creare risorse condivise. Vedere Panoramica di DXGI.
- Un contesto di dispositivo Direct3D viene usato per impostare lo stato della pipeline e generare comandi di rendering. La maggior parte dei nostri esempi usa un contesto immediato per eseguire il rendering direttamente nel dispositivo; Direct3D 11 supporta anche il rendering multithreading, nel qual caso vengono usati contesti posticipati. Vedere Introduzione a un dispositivo in Direct3D 11.
- Alcune funzionalità sono state deprecate, in particolare la pipeline di funzioni fisse. Vedere Funzionalità deprecate
Per un elenco completo delle funzionalità di Direct3D 11, vedere Funzionalità di Direct3D 11 e Funzionalità di Direct3D 11.
Passaggio da Direct2D 9 a Direct2D 11
Direct2D (Windows) è ancora una parte importante della grafica DirectX e di Windows. È possibile comunque usare Direct2D per disegnare giochi 2D e disegnare sovrimpressioni (HUD) sopra Direct3D.
Direct2D viene eseguito su Direct3D; I giochi 2D possono essere implementati usando entrambe le API. Ad esempio, un gioco 2D implementato con Direct3D può usare la proiezione ortografica, impostare Z-values per controllare l'ordine di disegno delle primitive e usare pixel shader per aggiungere effetti speciali.
Poiché Direct2D è basato su Direct3D, usa anche DXGI e contesti di dispositivo. Vedere Panoramica dell'API Direct2D.
L'API DirectWrite aggiunge il supporto per il testo formattato tramite Direct2D. Vedere Introduzione a DirectWrite.
Sostituire le librerie helper deprecate
D3DX e DXUT sono deprecati e non possono essere usati dai giochi UWP. Queste librerie helper fornivano risorse per attività quali il caricamento delle texture e mesh.
- La procedura dettagliata conversione semplice da Direct3D 9 a UWP illustra come configurare una finestra, inizializzare Direct3D ed eseguire il rendering 3D di base.
- La procedura dettagliata Gioco UWP semplice con DirectX illustra le attività comuni di programmazione dei giochi, tra cui grafica, caricamento di file, interfaccia utente, controlli e suoni.
- Il progetto community di DirectX Tool Kit offre classi helper da usare con app Direct3D 11 e UWP.
Spostare programmi shader da FX a HLSL
La libreria di utilità D3DX (D3DX 9, D3DX 10 e D3DX 11), incluso Effects, è deprecata per UWP. Tutti i giochi DirectX per UWP guidano la pipeline grafica usando HLSL senza Effects.
Visual Studio usa ancora FXC per compilare oggetti shader. Gli shader di gioco UWP vengono compilati in anticipo. Il bytecode viene caricato in fase di esecuzione, quindi ogni risorsa shader viene associata alla pipeline grafica durante l'appropriato passaggio di rendering. Gli shader devono essere spostati nel proprio oggetto separato. I file HLSL e le tecniche di rendering devono essere implementati nel codice C++.
Per un rapido sguardo al caricamento delle risorse dello shader, vedere Conversione semplice da Direct3D 9 a UWP.
Direct3D 11 ha introdotto il modello di shader 5, che richiede il livello di funzionalità Direct3D 11_0 (o superiore). Vedere Funzionalità del modello HLSL shader 5 per Direct3D 11.
Sostituire XNAMath e D3DXMath
È necessario eseguire la migrazione del codice con XNAMath (o D3DXMath) a DirectXMath. DirectXMath include tipi portabili tra x86, x64 e Arm. Vedere Migrazione del codice dalla libreria matematica XNA.
Si noti che i tipi float DirectXMath sono utili per l'uso con gli shader. Ad esempio, XMFLOAT4 e XMFLOAT4X4 allineano facilmente i dati per i buffer costanti.
Sostituire DirectSound con XAudio2 (e audio in background)
DirectSound non è supportato per la piattaforma UWP:
- Usare XAudio2 per aggiungere effetti sonori al gioco.
Sostituire DirectInput con le API XInput e Windows Runtime
DirectInput non è supportato per la piattaforma UWP:
- Usare i callback degli eventi di input CoreWindow per l'input tramite mouse, tastiera e tocco.
- Usare XInput 1.4 per il supporto del controller di gioco (e il supporto per le cuffie del controller di gioco). Se usi un codebase condiviso per desktop e UWP, vedere Versioni di XInput per informazioni sulla compatibilità con le versioni precedenti.
- Registrarsi per gli eventi EdgeGesture se il gioco deve usare la barra dell'app.
Usare Microsoft Media Foundation anziché DirectShow
DirectShow non fa più parte dell'API DirectX (o dell'API Windows). Microsoft Media Foundation fornisce contenuti video a Direct3D usando superfici condivise. Vedere API video Direct3D 11.
Sostituire DirectPlay con il codice di rete
Microsoft DirectPlay è stato deprecato. Se il gioco usa servizi di rete, fornire codice di rete conforme ai requisiti UWP. Usare le API seguenti:
- Win32 e COM per app UWP (rete) (Windows)
- Spazio dei nomi Windows.Networking (Windows)
- Spazio dei nomi Windows::Networking::Sockets
- Spazio dei nomi Windows.Networking.Connectivity (Windows)
- Windows.ApplicationModel.Background namespace (Windows)
Gli articoli seguenti consentono di aggiungere funzionalità di rete e dichiarare il supporto per la rete nel manifesto del pacchetto dell'app.
- Connessione con socket (app UWP che usano C#/VB/C++ e XAML) (Windows)
- Connessione con WebSockets (app UWP che usano C#/VB/C++ e XAML) (Windows)
- Connessione a servizi Web (app UWP con C#/VB/C++ e XAML) (Windows)
- Nozioni di base sulle reti
Si noti che tutte le app UWP (inclusi i giochi) usano tipi specifici di attività in background per mantenere la connettività mentre l'app è sospesa. Se il gioco deve mantenere lo stato di connessione mentre è sospeso, vedere Nozioni di base sulla rete.
Mapping delle funzioni
Usare la tabella seguente per convertire il codice da Direct3D 9 a Direct3D 11. Questo può essere utile anche per distinguere tra il dispositivo e il contesto di dispositivo.
Direct3D9 | Equivalente a Direct3D 11 |
---|---|
Le fasi della pipeline grafica sono descritte in Pipeline grafica. |
|
Chiamare IDXGISwapChain1::Present1 con il flag set DXGI_PRESENT_TEST. |
|
ID3D11DeviceContext::DrawIndexed ID3D11DeviceContext::DrawIndexedInstanced ID3D11DeviceContext::DrawInstanced |
|
Nessun diretto equivalente |
|
Usare le API di cursore standard. |
|
Dispositivo LOST e POOL_MANAGED non esistono più. IDXGISwapChain1::Present1 può avere esito negativo con un valore restituito DXGI_ERROR_DEVICE_REMOVED. |
|
IDirect3DDevice9:DrawRectPatch IDirect3DDevice9:MultiplyTransform |
La pipeline a funzione fissa è stata deprecata. |
IDirect3DDevice9:CheckDepthStencilMatch IDirect3DDevice9:CheckDeviceFormat |
I bit di funzionalità sono sostituiti dai livelli di funzionalità. Solo alcuni casi di utilizzo di formato e funzionalità sono facoltativi per qualsiasi livello di funzionalità specificato. Possono essere controllati con ID3D11Device::CheckFeatureSupport e ID3D11Device::CheckFormatSupport. |
Mapping dei formati di superficie
Usare la tabella seguente per convertire i formati Direct3D 9 in formati DXGI.
Formato Direct3D 9 | Formato Direct3D 11 |
---|---|
D3DFMT_UNKNOWN |
DXGI_FORMAT_UNKNOWN |
D3DFMT_R8G8B8 |
Non disponibile |
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 |
Non disponibile |
D3DFMT_A1R5G5B5 |
DXGI_FORMAT_B5G5R5A1_UNORM |
D3DFMT_A4R4G4B4 |
DXGI_FORMAT_B4G4R4A4_UNORM |
D3DFMT_R3G3B2 |
Non disponibile |
D3DFMT_A8 |
DXGI_FORMAT_A8_UNORM |
D3DFMT_A8R3G3B2 |
Non disponibile |
D3DFMT_X4R4G4B4 |
Non disponibile |
D3DFMT_A2B10G10R10 |
DXGI_FORMAT_R10G10B10A2 |
D3DFMT_A8B8G8R8 |
DXGI_FORMAT_R8G8B8A8_UNORM DXGI_FORMAT_R8G8B8A8_UNORM_SRGB |
D3DFMT_X8B8G8R8 |
Non disponibile |
D3DFMT_G16R16 |
DXGI_FORMAT_R16G16_UNORM |
D3DFMT_A2R10G10B10 |
Non disponibile |
D3DFMT_A16B16G16R16 |
DXGI_FORMAT_R16G16B16A16_UNORM |
D3DFMT_A8P8 |
Non disponibile |
D3DFMT_P8 |
Non disponibile |
D3DFMT_L8 |
DXGI_FORMAT_R8_UNORM
Nota Usare swizzle.r nello shader per duplicare il rosso in altri componenti per ottenere il comportamento di Direct3D 9.
|
D3DFMT_A8L8 |
DXGI_FORMAT_R8G8_UNORM
Nota Usare swizzle.rrrg nello shader per duplicare il rosso e spostare il verde nei componenti alfa per ottenere il comportamento di Direct3D 9.
|
D3DFMT_A4L4 |
Non disponibile |
D3DFMT_V8U8 |
DXGI_FORMAT_R8G8_SNORM |
D3DFMT_L6V5U5 |
Non disponibile |
D3DFMT_X8L8V8U8 |
Non disponibile |
D3DFMT_Q8W8V8U8 |
DXGI_FORMAT_R8G8B8A8_SNORM |
D3DFMT_V16U16 |
DXGI_FORMAT_R16G16_SNORM |
D3DFMT_W11V11U10 |
Non disponibile |
D3DFMT_A2W10V10U10 |
Non disponibile |
D3DFMT_UYVY |
Non disponibile |
D3DFMT_R8G8_B8G8 |
DXGI_FORMAT_G8R8_G8B8_UNORM
Nota In Direct3D 9 i dati sono stati ridimensionati di 255.0f, ma il valore può essere gestito nello shader.
|
D3DFMT_YUY2 |
Non disponibile |
D3DFMT_G8R8_G8B8 |
DXGI_FORMAT_R8G8_B8G8_UNORM
Nota In Direct3D 9 i dati sono stati ridimensionati di 255.0f, ma il valore può essere gestito nello shader.
|
D3DFMT_DXT1 |
DXGI_FORMAT_BC1_UNORM & DXGI_FORMAT_BC1_UNORM_SRGB |
D3DFMT_DXT2 |
DXGI_FORMAT_BC1_UNORM & DXGI_FORMAT_BC1_UNORM_SRGB
Nota: DXT1 e DXT2 sono gli stessi dal punto di vista dell'API/hardware. L'unica differenza è se viene usato alfa premoltiplicato, che può essere rilevato da un'applicazione e non richiede un formato separato.
|
D3DFMT_DXT3 |
DXGI_FORMAT_BC2_UNORM & DXGI_FORMAT_BC2_UNORM_SRGB |
D3DFMT_DXT4 |
DXGI_FORMAT_BC2_UNORM & DXGI_FORMAT_BC2_UNORM_SRGB
Nota: DXT3 e DXT4 sono gli stessi dal punto di vista dell'API/hardware. L'unica differenza è se viene usato alfa premoltiplicato, che può essere rilevato da un'applicazione e non richiede un formato separato.
|
D3DFMT_DXT5 |
DXGI_FORMAT_BC3_UNORM & DXGI_FORMAT_BC3_UNORM_SRGB |
D3DFMT_D16 & D3DFMT_D16_LOCKABLE |
DXGI_FORMAT_D16_UNORM |
D3DFMT_D32 |
Non disponibile |
D3DFMT_D15S1 |
Non disponibile |
D3DFMT_D24S8 |
Non disponibile |
D3DFMT_D24X8 |
Non disponibile |
D3DFMT_D24X4S4 |
Non disponibile |
D3DFMT_D16 |
DXGI_FORMAT_D16_UNORM |
D3DFMT_D32F_LOCKABLE |
DXGI_FORMAT_D32_FLOAT |
D3DFMT_D24FS8 |
Non disponibile |
D3DFMT_S1D15 |
Non disponibile |
D3DFMT_S8D24 |
DXGI_FORMAT_D24_UNORM_S8_UINT |
D3DFMT_X8D24 |
Non disponibile |
D3DFMT_X4S4D24 |
Non disponibile |
D3DFMT_L16 |
DXGI_FORMAT_R16_UNORM
Nota Usare swizzle.r nello shader per duplicare il rosso in altri componenti per ottenere il comportamento di Direct3D 9.
|
D3DFMT_INDEX16 |
DXGI_FORMAT_R16_UINT |
D3DFMT_INDEX32 |
DXGI_FORMAT_R32_UINT |
D3DFMT_Q16W16V16U16 |
DXGI_FORMAT_R16G16B16A16_SNORM |
D3DFMT_MULTI2_ARGB8 |
Non disponibile |
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 |
Non disponibile |
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 |
Non disponibile |
D3DDECLTYPE_UBYTE4 |
DXGI_FORMAT_R8G8B8A8_UINT
Nota Lo shader ottiene valori UINT, ma se sono necessari float integrali di stile Direct3D 9 (0,0f, 1,0f... 255.f), UINT può essere semplicemente convertito in float32 nello shader.
|
D3DDECLTYPE_SHORT2 |
DXGI_FORMAT_R16G16_SINT
Nota Lo shader ottiene valori SINT, ma se sono necessari float integrali di stile Direct3D 9, SINT può essere semplicemente convertito in float32 nello shader.
|
D3DDECLTYPE_SHORT4 |
DXGI_FORMAT_R16G16B16A16_SINT
Nota Lo shader ottiene valori SINT, ma se sono necessari float integrali di stile Direct3D 9, SINT può essere semplicemente convertito in float32 nello shader.
|
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 |
Non disponibile |
D3DDECLTYPE_DEC3N |
Non disponibile |
D3DDECLTYPE_FLOAT16_2 |
DXGI_FORMAT_R16G16_FLOAT |
D3DDECLTYPE_FLOAT16_4 |
DXGI_FORMAT_R16G16B16A16_FLOAT |
FourCC 'ATI1' |
DXGI_FORMAT_BC4_UNORM
Nota Richiede il livello di funzionalità 10.0 o versione successiva
|
FourCC 'ATI2' |
DXGI_FORMAT_BC5_UNORM
Nota Richiede il livello di funzionalità 10.0 o versione successiva
|
Informazioni su mapping aggiuntivi
- IDirect3DDevice9::SetCursorPosition è sostituito da SetCursorPos.
- IDirect3DDevice9::SetCursorProperties è sostituito da SetCursor.
- IDirect3DDevice9::SetIndices è sostituito da ID3D11DeviceContext::IASetIndexBuffer.
- IDirect3DDevice9::SetRenderTarget è sostituito da ID3D11DeviceContext::OMSetRenderTargets.
- IDirect3DDevice9::SetScissorRect è sostituito da ID3D11DeviceContext::RSSetScissorRects.
- IDirect3DDevice9::SetStreamSource è sostituito da ID3D11DeviceContext::IASetVertexBuffers.
- IDirect3DDevice9::SetVertexDeclaration è sostituito da ID3D11DeviceContext::IASetInputLayout.
- IDirect3DDevice9::SetViewport è sostituito da ID3D11DeviceContext::RSSetViewports.
- IDirect3DDevice9::ShowCursor è sostituito da ShowCursor.
Il controllo della gamma hardware della scheda video tramite IDirect3DDevice9::SetGammaRamp è sostituito da IDXGIOutput::SetGammaControl. Vedere Uso della correzione gamma.
IDirect3DDevice9::P rocessVertices è sostituito dalla funzionalità Stream-Output degli shader Geometry. Vedere Introduzione alla fase stream-output.
Il metodo IDirect3DDevice9::SetClipPlane per impostare i piani di clip utente è stato sostituito dalla semantica di output del vertex shader HLSL SV_ClipDistance (vedere Semantica), disponibile in VS_4_0 e successivi; oppure dal nuovo attributo di funzione piani di clip utente HLSL (vedere Piani clip utente su hardware di livello 9).
IDirect3DDevice9::SetPaletteEntries e IDirect3DDevice9::SetCurrentTexturePalette sono deprecati. Sostituirlo con un pixel shader che cerca i colori in una texture di 256x1 R8G8B8A8.
Le funzioni a mosaico a funzione fissa come DrawRectPatch, DrawTriPatch, SetNPatchMode e DeletePatch sono deprecate. Sostituirle con gli shader SM5.0 a mosaico programmable-pipeline (se l'hardware supporta gli shader a mosaico).
IDirect3DDevice9::SetFVF e i codici FVF non sono più supportati. È consigliabile eseguire la conversione da codici FVF D3D8/D3D9 a dichiarazioni di vertici D3D9 prima della conversione in layout di input D3D11.
Tutti i tipi di D3DDECLTYPE non supportati direttamente possono essere emulati in modo abbastanza efficiente con un numero ridotto di operazioni bit per bit all'inizio di un vertex shader in VS_4_0 e successivi.