Condividi tramite


Pianificare la conversione da OpenGL ES 2.0 a Direct3D

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:

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.