Graphiques 2D pour les jeux DirectX
Nous abordons l’utilisation de graphiques et d’effets bitmap 2D, ainsi que la façon de les utiliser dans votre jeu.
Les graphiques 2D sont un sous-ensemble de graphiques 3D qui traitent des primitives 2D ou des bitmaps. Plus généralement, ils n’utilisent pas de coordonnée z dans la façon dont un jeu 3D peut, car le jeu de jeu est généralement limité au plan x-y. Ils utilisent parfois des techniques graphiques 3D pour créer leurs composants visuels, et ils sont généralement plus simples à développer. Si vous débutez avec le jeu, un jeu 2D est un excellent endroit pour commencer, et le développement graphique 2D peut être un bon endroit pour vous d’obtenir un handle sur DirectX.
Vous pouvez développer des graphiques de jeux 2D dans DirectX à l’aide de Direct2D ou Direct3D, ou d’une combinaison. La plupart des classes les plus utiles pour le développement de jeux 2D sont dans Direct3D, comme la classe Sprite . Direct2D est un ensemble d’API qui ciblent principalement les interfaces utilisateur et les applications qui nécessitent la prise en charge des primitives de dessin (comme des cercles, des lignes et des formes de polygones plats). À cet égard, il fournit toujours un ensemble puissant et performant de classes et de méthodes pour créer des graphismes de jeu, en particulier lors de la création de superpositions de jeux, d’interfaces et d’affichages tête-haut (HUD) - ou pour la création d’une variété de jeux 2D, de simple à raisonnablement détaillé. L’approche la plus efficace lors de la création de jeux 2D consiste toutefois à utiliser des éléments des deux bibliothèques, et c’est la façon dont nous aborderons le développement graphique 2D dans cette rubrique.
Concepts en un clin d’œil
Avant l’avènement des graphiques 3D modernes et du matériel qui le prend en charge, les jeux étaient principalement 2D, et la plupart de leurs techniques graphiques ont impliqué le déplacement de blocs de mémoire autour - généralement des tableaux de données de couleur qui seraient traduits ou transformés en pixels sur l’écran d’une manière 1:1.
Dans DirectX, les graphiques 2D font partie du pipeline 3D. Il existe une plus grande variété de résolutions d’écran et de matériel graphique disponible, et votre moteur graphique 2D doit être en mesure de les prendre en charge sans modification significative de la fidélité.
Voici quelques-uns des concepts de base que vous devez connaître lors du démarrage du développement graphique 2D.
- Coordonnées pixels et raster. Un pixel est un point unique sur un affichage raster et possède sa propre paire de coordonnées (x, y) indiquant son emplacement sur l’affichage. (Le terme « pixel » est souvent utilisé de manière interchangeable entre les pixels physiques qui composent l’affichage et les éléments de mémoire adressables utilisés pour contenir les valeurs de couleur et alpha des pixels avant qu’ils ne soient envoyés à l’affichage.) Le raster est traité par les API comme une grille rectangulaire d’éléments de pixels, qui a souvent une correspondance de 1:1 avec la grille de pixels physique d’un affichage. Les systèmes de coordonnées raster commencent à partir du coin supérieur gauche, avec le pixel à (0, 0) dans le coin supérieur gauche de la grille.
- Les graphiques bitmap (parfois appelés graphiques raster) sont des éléments graphiques représentés sous la forme d’une grille rectangulaire de valeurs de pixels. Sprites -- Tableaux de pixels calculés gérés indépendamment du raster -- sont un type de graphique bitmap, couramment utilisé pour les caractères actifs ou les objets animés indépendants de l’arrière-plan dans un jeu. Les différentes images d’animation d’un sprite sont représentées sous forme de collections de bitmaps appelées « feuilles » ou « lots ». Les arrière-plans sont des objets bitmap plus volumineux qui sont la même résolution ou supérieur à celui du raster d’écran, et servent souvent de toile de fond pour le terrain de jeu d’un jeu.
- Les graphiques vectoriels sont des graphiques qui utilisent des primitives géométriques, telles que des points, des lignes, des cercles et des polygones pour définir des objets 2D. Elles sont représentées non comme des tableaux de pixels, mais comme les équations mathématiques qui les définissent dans un espace 2D. Ils n’ont pas nécessairement de correspondance de 1:1 avec la grille de pixels de l’affichage et doivent être transformés du système de coordonnées dans lequel vous les avez rendus dans le système de coordonnées raster de l’affichage.
- La traduction est lorsque vous prenez un point ou un sommet et calculez son nouvel emplacement dans le même système de coordonnées.
- La mise à l’échelle est lorsque vous agrandissez ou réduisez un objet par un facteur d’échelle spécifié. Avec une image vectorielle, vous réduisez et agrandissez ses sommets de composant ; avec une bitmap, vous agrandissez les éléments de pixels ou diminuez-les. Avec les images bitmap, vous perdez des données de pixel lorsque l’image diminue et vous agrandissez les pixels individuels lorsque l’image est mise à l’échelle plus près. Pour ce dernier, vous pouvez utiliser des opérations d’interpolation de couleur de pixel, telles que le filtrage biligne, pour faciliter les limites de couleur dures entre les pixels agrandis.
- La rotation est quand vous faites pivoter un objet à propos d’un axe ou d’un axe spécifié. Avec une image vectorielle, les sommets de la géométrie sont multipliés par rapport à une matrice de rotation pour obtenir le sommet pivoté ; avec une image bitmap, différents algorithmes peuvent être utilisés, chacun avec un degré de fidélité inférieur ou supérieur dans les résultats. Comme pour la mise à l’échelle et la traduction, il existe des API spécifiquement pour les opérations de rotation.
- La transformation est lorsque vous prenez un point ou un sommet dans un système de coordonnées et calculez son point ou sommet correspondant dans un autre système de coordonnées. Cela inclut la traduction, la mise à l’échelle et la rotation, ainsi que d’autres opérations de calcul de coordonnées.
- Le découpage est lorsque vous supprimez des parties de bitmaps ou de géométries qui ne se trouvent pas dans la zone visible de l’affichage, ou sont masquées par des objets ayant une priorité d’affichage supérieure.
- La mémoire tampon de trame est une zone en mémoire ( souvent dans la mémoire du matériel graphique lui-même) qui contient la carte raster finale que vous dessinerez à l’écran. La chaîne d’échange est une collection de mémoires tampons, où vous dessinez dans une mémoire tampon d’arrière-plan et, lorsque l’image est prête, vous l’échangez vers l’avant et affichez-la.
Considérations sur la conception
Le développement graphique 2D est un excellent moyen d’être habitué au développement avec Direct3D et vous permettra de passer plus de temps sur d’autres aspects critiques du développement de jeux : audio, contrôles et mécanismes de jeu.
Dessinez toujours sur une mémoire tampon arrière. Le dessin directement dans votre mémoire tampon d’images signifie que votre image sera affichée lorsque le signal d’affichage est reçu (généralement tous les 1/60e de seconde), même si votre opération de dessin n’a pas terminé !
Concevez votre moteur graphique pour prendre en charge une bonne sélection de résolutions, de 1024x600 à 1920x1080 (ou version ultérieure). Votre public vous remercie si vous prenez en charge la résolution native de leur moniteur LCD, en particulier avec des graphiques 2D.
Une grande illustration sera votre plus grand atout, quand il s’agit de visuels. Même si vos graphiques bitmap peuvent ne pas avoir le coup de poing des visuels photoréalistes 3D à l’aide des dernières caractéristiques de modèle nuanceur, une grande illustration haute résolution peut souvent transmettre autant ou plus de style et de personnalité - et avec beaucoup moins de pénalité de performance.