Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
API importanti
Se si sta eseguendo la conversione di un gioco dalle piattaforme iOS o Android, probabilmente si è anche fatto un significativo investimento in OpenGL ES 2.0. Quando si prepara lo spostamento del codebase della pipeline grafica in Direct3D 11 e Windows Runtime, è necessario prendere in considerazione alcuni aspetti prima di iniziare.
La maggior parte delle attività di conversione comporta in genere il passaggio iniziale del codebase e il mapping di API e modelli comuni. Questo processo risulterà più semplice se si prende il tempo di studiare questo argomento.
Ecco alcuni aspetti da tenere presenti durante la conversione della grafica da OpenGL ES 2.0 a Direct3D 11.
Note su specifici provider OpenGL ES 2.0
Gli argomenti relativi alla conversione in questa sezione fanno riferimento all'implementazione di Windows della specifica OpenGL ES 2.0 creata dal gruppo Khronos. Tutti gli esempi di codice OpenGL ES 2.0 sono stati sviluppati usando Visual Studio 2012 e la sintassi di base di Windows C. Se si proviene da un codebase Objective-C (iOS) o Java (Android), tenere presente che gli esempi di codice OpenGL ES 2.0 forniti potrebbero non usare identici parametri o sintassi di chiamata API. Queste linee guida tentano di rimanere il più possibile indipendenti dalla piattaforma.
Questa documentazione usa solo le API di specifica 2.0 per il codice e i riferimenti openGL ES. Se si esegue la conversione da OpenGL ES 1.1 o 3.0, questo contenuto può comunque rivelarsi utile, anche se alcuni degli esempi di codice OpenGL ES 2.0 e il contesto potrebbero risultare poco familiari.
Gli esempi di Direct3D 11 in questi argomenti usano Microsoft Windows C++ con le estensioni dei componenti (CX). Per maggiori informazioni su questa versione della sintassi C++, vedere Visual C++, Component Extensions for Runtime Platforms (C++\CX) e Quick Reference (C++\CX).
Comprendere i requisiti hardware e le risorse
Il set di funzionalità di elaborazione grafica supportate da OpenGL ES 2.0 esegue approssimativamente il mapping alle funzionalità fornite in Direct3D 9.1. Se si desidera sfruttare le funzionalità più avanzate fornite in Direct3D 11 dopo lo sforzo iniziale, consultare la documentazione di Direct3D 11 durante la pianificazione della porta o esaminare gli argomenti Convertire da DirectX 9 alla piattaforma UWP (Universal Windows Platform).
Per semplificare la conversione iniziale, iniziare con un modello Direct3D di Visual Studio. Fornisce un renderer di base già configurato e supporta funzionalità dell'app UWP come la ricreazione delle risorse nelle modifiche delle finestre e i livelli di funzionalità Direct3D.
Informazioni sui livelli di funzionalità Direct3D
Direct3D 11 fornisce supporto per i "livelli di funzionalità" hardware da 9_1 (Direct3D 9.1) per 11_1. Questi livelli di funzionalità indicano la disponibilità di determinate funzionalità grafiche e risorse. In genere, la maggior parte delle piattaforme OpenGL ES 2.0 supporta un set di funzionalità Direct3D 9.1 (livello di funzionalità 9_1).
Esaminare le funzionalità e le API della grafica DirectX
Famiglia API | Descrizione |
---|---|
DXGI | DirectX Graphics Infrastructure (DXGI) fornisce un'interfaccia tra l'hardware grafico e Direct3D. Imposta la configurazione hardware e la scheda dispositivo usando le interfacce COM IDXGIAdapter e IDXGIDevice1. Usarlo per creare e configurare i buffer e altre risorse della finestra. In particolare, il modello factory IDXGIFactory2 viene usato per acquisire le risorse grafiche, inclusa la swapchain (un set di buffer frame). Poiché DXGI possiede la swapchain, l'interfaccia IDXGISwapChain1 viene usata per presentare fotogrammi allo schermo. |
Direct3D | Direct3D è il set di API che forniscono una rappresentazione virtuale dell'interfaccia grafica e consentono di disegnare grafica. La versione 11 è approssimativamente paragonabile, a livello di funzionalità, a OpenGL 4.3. OpenGL ES 2.0, d'altra parte, è simile a DirectX9, almeno per quanto riguarda le funzionalità, e a OpenGL 2.0, ma con la pipeline di shader unificata di OpenGL 3.0. La maggior parte del carico di lavoro viene eseguita con le interfacce ID3D11Device1 e ID3D11DeviceContext1 che forniscono l'accesso, rispettivamente, alle singole risorse/sottorisorse e al contesto di rendering. |
Direct2D | Direct2D offre un set di API per il rendering 2D con accelerazione GPU. Può essere considerato simile a OpenVG. |
DirectWrite | DirectWrite offre un set di API per il rendering dei tipi di carattere con accelerazione GPU e di alta qualità. |
DirectXMath | DirectXMath offre un set di API e di macro per la gestione di tipi, valori e funzioni algebriche lineari e trigonometriche. Questi tipi e funzioni sono progettati per funzionare con Direct3D e le relative operazioni shader. |
HLSL DirectX | È la sintassi HLSL corrente usata dagli shader Direct3D. Implementa il modello Direct3D Shader 5.0. |
Esaminare le API e la libreria di modelli di Windows Runtime
Le API di Windows Runtime forniscono l'infrastruttura complessiva per le app UWP. Sono disponibili qui.
Le API principali di Windows Runtime usate per la conversione della pipeline grafica includono:
- Windows::UI::Core::CoreWindow
- Windows::UI::Core::CoreDispatcher
- Windows::ApplicationModel::Core::IFrameworkView
- Windows::ApplicationModel::Core::CoreApplicationView
Inoltre, la libreria di modelli C++ per Windows Runtime (WRL) è una libreria di modelli che offre un approccio di base per creare e usare componenti Windows Runtime. Le API Direct3D 11 per le app UWP danno il meglio se usate in combinazione con le interfacce e i tipi in questa libreria, ad esempio con i puntatori intelligenti (ComPtr). Per maggiori informazioni su WRL, vedere Libreria di modelli C++ di Windows Runtime (WRL).
Modificare il sistema di coordinate
Una differenza che a volte confonde gli iniziali sforzi di conversione è il cambiamento dal tradizionale sistema di coordinate destrorso di OpenGL al sistema di coordinate sinistrorso predefinito di Direct3D. Questa modifica nella modellazione delle coordinate influisce su molte parti del gioco, dalla configurazione generale e dalla configurazione dei buffer dei vertici fino a molte delle funzioni matematiche della matrice. Le due modifiche più importanti da apportare sono:
- Capovolgere l'ordine dei vertici del triangolo in modo che Direct3D li attraversi in senso orario dalla parte anteriore. Ad esempio, se i vertici vengono indicizzati come 0, 1 e 2 nella pipeline OpenGL, passarli a Direct3D come 0, 2, 1.
- Usare la matrice di visualizzazione per scalare lo spazio globale in base a -1.0f nella direzione z, in modo da invertire in modo efficace le coordinate dell'asse z. A tale scopo, capovolgere il segno dei valori in corrispondenza delle posizioni M31, M32 e M33 nella matrice di visualizzazione (quando viene convertito nel tipo Matrix). Se M34 non è 0, capovolgere anche il segno.
Tuttavia, Direct3D può supportare un sistema di coordinate destrorso. DirectXMath fornisce una serie di funzioni che operano su entrambi i sistemi di coordinate, destrorse e sinistrorse. Possono essere usate per conservare alcuni dati di mesh originali e l'elaborazione della matrice, che includono:
Funzione matrice DirectXMath | Descrizione |
---|---|
XMMatrixLookAtLH | Crea una matrice di visualizzazione per un sistema di coordinate sinistrorso usando una posizione della fotocamera, una direzione "su" e un punto focale. |
XMMatrixLookAtRH | Crea una matrice di visualizzazione per un sistema di coordinate destrorso usando una posizione della fotocamera, una direzione "su" e un punto focale. |
XMMatrixLookToLH | Crea una matrice di visualizzazione per un sistema di coordinate sinistrorso usando una posizione della fotocamera, una direzione "su" e una direzione della fotocamera. |
XMMatrixLookToRH | Crea una matrice di visualizzazione per un sistema di coordinate destrorso usando una posizione della fotocamera, una direzione "su" e una direzione della fotocamera. |
XMMatrixOrthographicLH | Crea una matrice di proiezione ortogonale per un sistema di coordinate sinistrorso. |
XMMatrixOrthographicOffCenterLH | Crea una matrice di proiezione ortogonale personalizzata per un sistema di coordinate sinistrorso. |
XMMatrixOrthographicOffCenterRH | Crea una matrice di proiezione ortogonale personalizzata per un sistema di coordinate destrorso. |
XMMatrixOrthographicRH | Crea una matrice di proiezione ortogonale per un sistema di coordinate destrorso. |
XMMatrixPerspectiveFovLH | Compila una matrice di proiezione prospettica sinistrorsa basata su un campo di visualizzazione. |
XMMatrixPerspectiveFovRH | Compila una matrice di proiezione prospettica destrorsa basata su un campo di visualizzazione. |
XMMatrixPerspectiveLH | Compila una matrice di proiezione prospettica sinistrorsa. |
XMMatrixPerspectiveOffCenterLH | Compila una matrice di proiezione prospettica sinistrorsa personalizzata. |
XMMatrixPerspectiveOffCenterRH | Compila una matrice di proiezione prospettica destrorsa personalizzata. |
XMMatrixPerspectiveRH | Compila una matrice di proiezione prospettica destrorsa. |
Domande frequenti sulla conversione da OpenGL ES2.0 a Direct3D 11
- Domanda: "In generale, è possibile cercare determinate stringhe o modelli nel codice OpenGL e sostituirli con gli equivalenti Direct3D?"
- Risposta: No. OpenGL ES 2.0 e Direct3D 11 provengono da generazioni diverse di modellazione della pipeline grafica. Anche se esistono alcune analogie di superficie tra concetti e API, ad esempio il contesto di rendering e la creazione di istanze degli shader, è consigliabile esaminare queste linee guida e il riferimento Direct3D 11 in modo da effettuare le scelte migliori durante la ricreazione della pipeline anziché tentare un mapping da 1 a 1. Tuttavia, se si esegue la conversione da GLSL a HLSL, la creazione di un set di alias comuni per variabili GLSL, intrinsincs e funzioni non solo può semplificare la conversione, ma consente anche di mantenere un solo set di file di codice shader.