Planifier votre projet de portage d’OpenGL ES 2.0 vers Direct3D

API importantes

Si vous portez un jeu depuis les plateformes iOS ou Android, vous avez probablement fait un investissement important dans OpenGL ES 2.0. Lorsque vous vous préparez à déplacer la base de code de votre pipeline graphique vers Direct3D 11 et le Windows Runtime, il y a quelques éléments que vous devez prendre en compte avant de commencer.

La plupart des efforts de portage impliquent initialement de parcourir la base de code et de cartographier les API et les modèles communs entre les deux modèles. Vous trouverez ce processus un peu plus facile si vous prenez le temps de lire et d’étudier cette rubrique.

Voici quelques éléments à prendre en compte lors du portage de graphiques d’OpenGL ES 2.0 vers Direct3D 11.

Notes sur les fournisseurs spécifiques d’OpenGL ES 2.0

Les rubriques de portage de cette section font référence à l’implémentation Windows de la spécification OpenGL ES 2.0 créée par le Khronos Group. Tous les exemples de code OpenGL ES 2.0 ont été développés en utilisant Visual Studio 2012 et la syntaxe C de base de Windows. Si vous venez d’une base de code Objective-C (iOS) ou Java (Android), sachez que les exemples de code OpenGL ES 2.0 fournis peuvent ne pas utiliser une syntaxe d’appel d’API ou des paramètres similaires. Ce guide s’efforce de rester aussi indépendant que possible de la plateforme.

Cette documentation n’utilise que les API de la spécification 2.0 pour le code et la référence OpenGL ES. Si vous effectuez un portage depuis OpenGL ES 1.1 ou 3.0, ce contenu peut s’avérer utile, bien que certains des exemples de code et du contexte d’OpenGL ES 2.0 puissent ne pas vous être familiers.

Les exemples Direct3D 11 de ces rubriques utilisent Microsoft Windows C++ avec Component Extensions (CX). Pour plus d’informations sur cette version de la syntaxe C++, lisez Visual C++, Extensions de composants pour les plates-formes d’exécution, et référence rapide (C++\CX).

Comprendre les exigences et les ressources de votre matériel

L’ensemble des fonctionnalités de traitement graphique supportées par OpenGL ES 2.0 correspond à peu près aux fonctionnalités fournies par Direct3D 9.1. Si vous souhaitez profiter des fonctionnalités plus avancées fournies par Direct3D 11, consultez la documentation Direct3D 11 lors de la planification de votre portage, ou consultez les rubriques Portage de DirectX 9 vers Universal Windows Platform (UWP) lorsque vous aurez terminé l’effort initial.

Pour simplifier votre effort de portage initial, commencez par un modèle Visual Studio Direct3D. Il fournit un moteur de rendu de base déjà configuré pour vous et prend en charge les fonctionnalités des applications UWP, telles que la recréation des ressources lors des changements de fenêtre et les niveaux de fonctionnalités Direct3D.

Comprendre les niveaux de fonctionnalité de Direct3D

Direct3D 11 prend en charge les "niveaux de fonctionnalité" du matériel depuis 9_1 (Direct3D 9.1) jusqu’à 11_1. Ces niveaux de fonctionnalités indiquent la disponibilité de certaines fonctionnalités et ressources graphiques. En règle générale, la plupart des plates-formes OpenGL ES 2.0 prennent en charge un ensemble de fonctionnalités Direct3D 9.1 (niveau de fonctionnalités 9_1).

Passez en revue les fonctionnalités graphiques et les API de DirectX

Famille d’API Description
DXGI L’infrastructure graphique DirectX (DXGI) fournit une interface entre le matériel graphique et Direct3D. Elle définit l’adaptateur d’appareil et la configuration du matériel à l’aide des interfaces COM IDXGIAdapter et IDXGIDevice1. Utilisez-le pour créer et configurer vos tampons et autres ressources de fenêtre. En particulier, le modèle d’usine IDXGIFactory2 est utilisé pour acquérir les ressources graphiques, y compris la chaîne d’échange (un ensemble de tampons de trame). Comme DXGI possède la chaîne d’échange, l’interface IDXGISwapChain1 est utilisée pour présenter les trames à l’écran.
Direct3D Direct3D est l’ensemble des API qui fournissent une représentation virtuelle de l’interface graphique et vous permettent de dessiner des graphiques à l’aide de celle-ci. La version 11 est à peu près comparable, en termes de fonctionnalités, à OpenGL 4.3. (OpenGL ES 2.0, quant à lui, est similaire à DirectX9, en termes de fonctionnalités, et à OpenGL 2.0, mais avec le pipeline de shaders unifié d’OpenGL 3.0). La plupart des opérations lourdes sont effectuées avec les interfaces ID3D11Device1 et ID3D11DeviceContext1, qui permettent d’accéder respectivement aux ressources et sous-ressources individuelles et au contexte de rendu.
Direct2D Direct2D fournit un ensemble d’API pour le rendu 2D accéléré par le GPU. Son objectif peut être considéré comme similaire à celui d’OpenVG.
DirectWrite aDirectWrite fournit un ensemble d’API pour le rendu de polices de haute qualité accéléré par le GPU.
DirectXMath DirectXMath fournit un ensemble d’API et de macros pour gérer les types, valeurs et fonctions d’algèbre linéaire et de trigonométrie les plus courants. Ces types et fonctions sont conçus pour fonctionner correctement avec Direct3D et ses opérations de shaders.
DirectX HLSL La syntaxe HLSL actuelle utilisée par les shaders Direct3D. Elle met en œuvre le modèle de shaders Direct3D 5.0.

 

Examinez les API d’exécution Windows et la bibliothèque de modèles

Les API d’exécution Windows fournissent l’infrastructure globale des applications UWP. Passez-les en revue ici.

Les principales API d’exécution Windows utilisées pour le portage de votre pipeline graphique sont les suivantes :

En outre, la bibliothèque de modèles Windows Runtime C++ (WRL) est une bibliothèque de modèles qui permet de créer et d’utiliser des composants Windows Runtime à bas niveau. Les API Direct3D 11 pour les applications UWP sont mieux utilisées en conjonction avec les interfaces et les types de cette bibliothèque, tels que les pointeurs intelligents (ComPtr). Pour plus d’informations sur la WRL, lisez Windows Runtime C++ Template Library (WRL).

Changez votre système de coordonnées

Une différence qui rend parfois confus les premiers efforts de portage est le passage du système de coordonnées traditionnel à droite d’OpenGL au système de coordonnées à gauche par défaut de Direct3D. Ce changement dans la modélisation des coordonnées affecte de nombreuses parties de votre jeu, de l’installation et de la configuration de vos tampons de vertex à la plupart de vos fonctions mathématiques matricielles. Les deux changements les plus importants à effectuer sont les suivants

  • Inversez l’ordre des vertex des triangles afin que Direct3D les traverse dans le sens des aiguilles d’une montre en partant de l’avant. Par exemple, si vos vertex sont indexés comme 0, 1 et 2 dans votre pipeline OpenGL, transmettez-les à Direct3D comme 0, 2, 1 à la place.
  • Utilisez la matrice de vue pour mettre à l’échelle l’espace mondial de -1,0f dans la direction z, en inversant les coordonnées de l’axe z. Pour ce faire, inversez le signe de la matrice de vue. Pour ce faire, inversez le signe des valeurs aux positions M31, M32 et M33 de votre matrice de vue (lors du portage vers le type Matrix). Si M34 n’est pas 0, inversez également son signe.

Cependant, Direct3D peut prendre en charge un système de coordonnées droitier. DirectXMath fournit un certain nombre de fonctions qui opèrent sur et à travers les systèmes de coordonnées gauchers et droitiers. Elles peuvent être utilisées pour préserver une partie de vos données de maillage et de votre traitement matriciel d’origine. Notamment :

Fonction matricielle de DirectXMath Description
XMMatrixLookAtLH Construit une matrice de vue pour un système de coordonnées gauches en utilisant la position de la caméra, une direction ascendante et un point focal.
XMMatrixLookAtRH Construit une matrice de vue pour un système de coordonnées droites à l’aide d’une position de caméra, d’une direction ascendante et d’un point focal.
XMMatrixLookToLH Construit une matrice de vue pour un système de coordonnées gauches en utilisant une position de caméra, une direction vers le haut et une direction de caméra.
XMMatrixLookToRH Construit une matrice de vue pour un système de coordonnées droitier en utilisant la position de la caméra, une direction vers le haut et une direction de la caméra.
XMMatrixOrthographicLH Crée une matrice de projection orthogonale pour un système de coordonnées gauches.
XMMatrixOrthographicOffCenterLH Construit une matrice de projection orthogonale personnalisée pour un système de coordonnées gauches.
XMMatrixOrthographicOffCenterRH Construit une matrice de projection orthogonale personnalisée pour un système de coordonnées droitier.
XMMatrixOrthographicRH Construit une matrice de projection orthogonale pour un système de coordonnées droitier.
XMMatrixPerspectiveFovLH Construit une matrice de projection en perspective gauche basée sur un champ de vision.
XMMatrixPerspectiveFovRH Construit une matrice de projection en perspective à droite basée sur un champ de vision.
XMMatrixPerspectiveLH Construit une matrice de projection en perspective gauche.
XMMatrixPerspectiveOffCenterLH Construit une version personnalisée d’une matrice de projection en perspective gauche.
XMMatrixPerspectiveOffCenterRH Construit une version personnalisée d’une matrice de projection en perspective à droite.
XMMatrixPerspectiveRH Construit une matrice de projection en perspective à droite.

 

Portage OpenGL ES2.0 vers Direct3D 11 Questions fréquemment posées

  • Question : "D’une manière générale, puis-je rechercher une matrice de projection en perspective à droite ? "De manière générale, puis-je rechercher certaines chaînes de caractères ou certains motifs dans mon code OpenGL et les remplacer par les équivalents Direct3D ?"
  • Réponse : Non. OpenGL ES 2.0 et Direct3D 11 proviennent de générations différentes de modélisation du pipeline graphique. Bien qu’il y ait quelques similitudes de surface entre les concepts et les API, comme le contexte de rendu et l’instanciation des shaders, vous devriez examiner ce guide ainsi que la référence Direct3D 11 afin de faire les meilleurs choix lorsque vous recréez votre pipeline au lieu de tenter une correspondance 1 pour 1. Toutefois, si vous passez de GLSL à HLSL, la création d’un ensemble d’alias communs pour les variables, intrinsèques et fonctions GLSL peut non seulement faciliter le portage, mais aussi vous permettre de ne maintenir qu’un seul ensemble de fichiers de code de shaders.