Introduction aux graphismes dans les jeux vidéos

De T.R.A.F - Wiki
Aller à : navigation, rechercher

Ce document a été réalisé afin de faciliter la compréhension des systèmes d'affichage graphique dans un jeu vidéo. Etant donné que l'on n'abordera aucun thème lié à la programmation ou à l'assembleur, nous limiterons notre discours à des choses accessibles par le plus grand nombre. Toutefois, il est nécessaire de connaître les systèmes binaire et hexadécimal.


Quelques définitions

Avant d'entrer dans le vif du sujet, définissons quelques termes standards qui seront fréquemment utilisés :

  • pixel : c'est l'élément de base, un point, qui permet l'affichage d'images numériques sur un écran. Son nom provient de la contraction d'un terme anglais "picture element", qui signifie "élément d'image".
  • tile : il s'agit d'un des éléments permettant de définir une image. Il s'agit d'un terme anglais signifiant "tuile". Il est en effet défini comme un carré de AxA pixels. Dans le domaine des jeux vidéos, les tiles font en général 8x8 voire 16x16 pixels.
  • sprite : c'est un élément de graphisme composé de tiles. Concernant la Super NES, ces sprites font entre 8x8 et 64x64 pixels. Contrairement aux tiles, les sprites définissent en général un élément complet de graphisme (une tête, un vaisseau spatial, une épée, etc.). De plus, ces derniers possèdent des attributs comme, par exemple, des coordonnées. Imaginez le sprite comme un puzzle composé de tiles : lorsque vous voulez situer un puzzle sur un plan, vous lui donner des coordonnées, des angles de rotations, etc. Vous ne donnez pas les coordonnées des pièces de ce puzzle.
  • VRAM : Video Random Access Unit. Il s'agit de la mémoire vidéo du processeur graphique dans laquelle une machine place les données à traiter. s'agissant d'ume mémoire vive, il n'y a pas de stockage des données à long terme : les données arrivent, sont traités puis sortent de la mémoire (ou sont perdues si on coupe le courant).
  • GPU : Graphic Processing Unit. Il s'agit d'un (micro)processeur graphique faisant partie de la carte graphique d'une machine. C'est lui qui manipule les données vidéos.

Les autres termes nécessaires à la compréhension de ce document seront définis par ailleurs.

L'image numérique

Encodage des pixels

Lorsqu'on utilise un éditeur graphique, nous avons fréquemment accès à des modes d'affichage qui ressemblent à ça : 1bpp, 2bpp, 3bpp, 4bpp, 8bpp, etc. Il convient donc de définir ce fameux "bpp".

BPP signifie "bit par pixel". Ce terme permet de définir le nombre de bits nécessaire pour encoder chaque pixel. Prenons quelques exemples connus :

  • 1 BPP : chaque pixel va être encodé sur 1 bit, c'est-à-dire soit 0 (en général le fond), soit 1 (en général, le corps du graphisme). Il est très utilisé pour tout ce qui est définition des caractères. Si l'on considère que chaque caractère possède une taille de 8x8 pixels, alors chacune des 8 lignes va être définie par 8 bits. Etant donné que 8 bits = 1 octet, un caractère de 8x8 pixels va dont être défini par 8 octets.
  • 2 BPP : chaque pixel va être encodé sur 2 bits, c'est-à-dire soit 00 (en général le fond), soit 01, 10 ou 11 (en général, le corps du graphisme). Plutôt que de rester en système binaire, on peut passer en système quaternaire (base 4) : chaque pixel possèdera alors la valeur 0, 1, 2 ou 3. On se rend alors compte que le graphisme peut posséder jusqu'à quatre couleurs différentes. On retrouve ce système d'encodage sur les consoles 8 bits comme la NES ou la Game Boy. Si l'on considère que chaque caractère possède une taille de 8x8 pixels, alors chacune des 8 lignes va être définie par 8x2 = 16 bits soit 2 octets. Ainsi, un caractère de 8x8 pixels va dont être défini par 16 octets.
  • 4 BPP : chaque pixel va être encodé sur 4 bits, c'est-à-dire soit 0000 (en général le fond), soit 0001, 0010, 0011, 0100, 0101, etc. jusqu'à 1111 (en général, le corps du graphisme). Plutôt que de rester en système binaire, on peut passer en système hexadécimal (base 16) : chaque pixel possèdera alors la valeur 0, 1, 2, 3, 4, 5, 6, etc. jusqu'à F (15). On se rend alors compte que le graphisme peut posséder jusqu'à seize couleurs différentes. On retrouve ce système d'encodage sur les consoles 16 bits comme la Super NES, la Game Boy Advance ou la Mega Drive (qui peuvent en posséder d'autres : les couleurs ne sont pas codées uniquement dans ce mode). Si l'on considère que chaque caractère possède une taille de 8x8 pixels, alors chacune des 8 lignes va être définie par 8x4 = 32 bits soit 4 octets. Ainsi, un caractère de 8x8 pixels va dont être défini par 32 octets.

Vous comprenez la démarche ? Ainsi, en 3 BPP, on aura droit à un choix de 8 couleurs pour chaque pixel ; en 8 BPP, on aura droit à 256 couleurs différentes ; en 16 BPP, il est possible d'avoir un choix de 65 536 couleurs par pixel ; en 24 BPP, ce sera 16 777 216 couleurs enfin, en 32 BPP, ce sera... plus de 4 milliards de couleurs disponibles ! Notons qu'en 24 bits, il faut 3 octets par pixel : un octet pour coder le rouge, un octet pour coder les nuances de vert et un octet pour coder les nuances de jaune. En 15 bits, on peut faire la même chose en divisant les 3 couleurs en 5 bits chacun. C'est ce qu'on appelle le système RVB (Rouge, Vert, Bleu). On peut même avoir des images haute définition an codant en 16 bits par pixel par couleur primaire (c'est-à-dire 16 bits pour le rouge, 16 pour le vert et encore 16 pour le bleu), ce qui représente, en définitive, un codage global sur 48 bits.

La palette

En réalité, sans système RVB, on ne peut avoir que des nuances d'une même couleur. Si on prend notre exemple d'un codage 24 bits, on se rend compte que les octets définissants le rouge, le vert et le bleu peuvent avoir la même valeur : cela ne suffit donc pas à déterminer leur couleur : si on n'avait pas associé le premier octet au rouge, le deuxième au vert et le troisième au bleu, on n'aurait pas su à quelle couleur correspondait cette suite de 3 octets. Autre exemple : si on revient à notre codage 8 bits simple, on aura 256 couleurs disponibles... Oui mais quelles couleurs ? On se rend vite compte qu'il s'agit davantage de nuances que de couleurs : 8 bits va donc correspondre à une image monochrome de 256 nuances possibles.

En effet, voici un exemple simple avec un codage sur 3 bits et une image de 4x4 pixels :

  000 000 000 000
  000 000 000 000
  000 000 000 000
  000 000 000 000

Que va faire le système d'affichage dans ce cas précis ? Il ne va afficher que des 0 qui ne correspondent à "rien", c'est-à-dire du blanc. Passons à cette image :

  101 000 110 110
  011 011 111 111
  000 000 010 011
  100 111 111 001

Difficile à lire... Utilisons notre système octal (base 8) :

  5 0 6 6
  3 3 7 7
  0 0 2 3
  4 7 7 1

On peut donc lire la "force" de chaque pixel : plus le chiffre est élevé, plus le pixel est foncé. En version brute, on voit bien qu'on n'a aucune couleur mais juste des intensités. Rappelons-nous de nos vieilles télévision en noir et blanc... Elles ne possédaient pas de système RVB. Seules les nuances d'une seule couleur (le gris, en l'occurence) étaient disponibles.

C'est pour cette raison que, en ce qui concerne l'affichage d'images comme les GIF (256 couleurs) ou celles issues des jeux vidéos, on définit également la palette de couleurs : une sorte de base de données où sont répertoriées toutes les couleurs à utiliser (ces dernières étant codées en général dans le système RVB 24 bits, soit 8 bits par couleur primaire). D'ailleurs, on remarquera que les éditeurs graphiques dédiés aux jeux vidéos utilises des palettes de couleurs par défaut (on ne retrouve jamais ce qui est affiché dans le jeu). A eux aussi, il leur faut une palette si l'on souhaite qu'ils affichent correctement les couleurs des graphismes.

Imaginons notre Super NES et son codage 4 BPP (c'est-à-dire 16 couleurs). A chaque groupe de 4 bits, on associe une couleur dans le système RVB (c'est-à-dire sur 3 octets en 24 bits). Ainsi, quelque part dans la ROM, on pourrait avoir stocké ce genre de table de conversion :

 Couleurs    Valeurs RVB
  du jeu      associées
                        
   0000   =   00 00 00
   0001   =   12 A1 BC
   0010   =   FF 54 23
   0011   =   FF 00 00
   0100   =   2A BB F0
   0101   =   D1 D1 D1
   ...    =   ...
   1110   =   33 44 3B
   1111   =   FF FF FF

En fait, les consoles de jeux ont parfois un nombre total de couleurs plus limité (surtout les vieilles bécanes) : la Super NES, par exemple, ne peut avoir le choix qu'entre 32 768 couleurs soit 15 bits. Du coup, les valeurs RVB sont écrites sur 3 groupements de 5 bits (base 5 - système quinaire), ce qui représente 32 nuances pour chaque couleur primaire du système RVB. Ceci dit, la Super NES pouvait tout de même afficher jusqu'à 4 096 couleurs différentes simultanément à l'écran (la Super NES pouvant, au plus fort de son potentiel, posséder jusqu'à 256 couleurs par palettes, soit un mode d'affichage en 8 BPP). Il faut juste se rappeler que chaque sprite peut posséder sa propre palette. Tout dépend des capacités de la machine et de ce que le programmeur souhaite faire de ces capacités.

Les variantes

Quand on utilise Tile Molester, on n'a pas que des modes d'encodage de type 1BPP, 2BPP, 4BPP, etc. On retrouve des variantes de type "linéaire", "planaire" ou "composite".

...

La synthèse d'images sur console

A réécrire de fond en comble