Décalage de palette
# Décalage de palette

Le palette shifting ou color cycling (aussi appelé décalage de palette, mais très rarement) est une technique de graphisme informatique à mi-chemin entre le dessin et la programmation, permettant d'animer des dégradés ou d’effectuer des changements de couleurs progressifs sur un écran disposant d'un nombre limité de couleurs et faisant usage de couleurs indexées.

Dans certains cas, cette technique permet aussi de créer des effets spéciaux d'animation. En particulier, elle a beaucoup été utilisée pour représenter de l'eau qui s'écoule.

Le meilleur moyen de se représenter le fonctionnement de cette technique est de la voir en action. On peut pour cela se diriger vers les liens externes de l'article.

Cette technique est devenue obsolète après l'avènement des systèmes d'affichage proposant des milliers, puis des millions de couleurs, en particulier les systèmes proposant des palettes de couleurs 32 bits. Elle connait son heure de gloire dans les années 1990, principalement dans les jeux vidéo à affichage 8 bits.

## Principe

Le problème qui se pose est le suivant : dans un système d'affichage informatique, surtout sur des matériels antérieurs à l'avènement de l'accélération matérielle, il est relativement « coûteux » en termes de temps de calcul et d'utilisation de mémoire de modifier un nombre important de pixels affichés à l'écran, dans le but d'obtenir une animation de grande taille, rapide et fluide.

Prenons l'exemple d'un écran affichant une scène qui représente un lac ou une cascade. Si on souhaite créer un effet visuel de miroitement ou d'écoulement de l'eau, alors avec une technique d'animation traditionnelle (images successives), il est nécessaire de faire varier la couleur de tous les pixels du lac ou de la cascade à chaque image. Ceci est quasiment impossible, en raison du double coût engendré : d'une part le coût nécessaire à calculer la nouvelle valeur RGB de chaque pixel, et d'autre part le coût nécessaire à modifier les pixels à l'écran (c'est-à-dire le coût d'écrire les valeurs RGB des pixels dans la mémoire graphique).

Le décalage de palette est une astuce visant à contourner ce problème, en épargnant de changer les valeurs RGB de chaque pixel. Il n'est pas non plus question de changer l'index de la couleur de chacun de ces pixels (on parle ici de l'index au sein de la palette indexée). Seules les valeurs RGB des couleurs directement dans la palette sont changées. Ainsi, quelles que soient les dimensions occupées à l'écran par l'objet qu'on souhaite animer, le nombre de cellules mémoires à modifier reste fixe puisqu'il s'agit de ne modifier que quelques couleurs directement dans la palette. Si l'objet est grand, alors il est moins coûteux de modifier la palette que les pixels de l'objet. Concrètement, si le dessin de la cascade occupe une zone de 100x20 pixels à l'écran (soit 2000 pixels), alors, au lieu de modifier 2000 cellules mémoire, on en modifiera moins: sur un système qui possède une palette de 256 couleurs (comme c'est le cas des systèmes VGA) il n'y aura plus qu'à modifier 768 cellules mémoire (256 couleurs x 3 RGB), ou même moins si on ne manipule que quelques couleurs: ainsi, si la cascade est représentée en utilisant seulement 10 nuances de bleu, alors on n'aura qu'à changer 10 x 3 = 30 cellules mémoires, au lieu des 2000 initiales. Le gain est énorme. Une palette de 64 couleurs (comme c'est le cas sur certains systèmes Amiga) nécessitera de modifier seulement 192 cellules mémoire (64 couleurs x 3 RGB) si on décide de faire varier toute la palette.

L'inconvénient de cette technique est que l'image affichée n'est pas modifiée, uniquement le sont les couleurs des pixels qui la composent. Ainsi, si plusieurs pixels utilisent la même couleur issue de la palette, alors une modification de la palette changera la couleur de tous ces pixels simultanément. Dans le cas d'une scène représentant une cascade d'eau, c'est précisément l'effet recherché, car tous les pixels ont une teinte bleutée, et de plus chaque pixel a une couleur proche de celle de son voisin. Ainsi le décalage de palette modifie graduellement la couleur de chaque pixel en la faisant se rapprocher de celle de son voisin, qui lui-même se rapproche de la couleur de son voisin, etc. Ceci donne une illusion de mouvement alors qu'en réalité l'image est parfaitement fixe, ce sont les couleurs qui varient.

Outre l'économie en temps de calcul, l'avantage de la technique est qu'on peut faire varier les couleurs très graduellement. En effet, si la valeur des pixels avait été modifié directement dans l'image, il aurait alors fallu choisir les couleurs parmi celles proposées par la palette. Or, le nombre de couleurs est limité, donc on n'aurait pu obtenir que des variations de couleurs relativement brusques. Avec le décalage de palette, on se contente de réserver un petit nombre de couleurs pour l'effet mais on peut quand même faire varier les couleurs très subtilement. Reprenons notre exemple et imaginons qu'on se contente de 10 teintes de bleu pour représenter la cascade. Si ces couleurs étaient censées couvrir toutes la gamme des bleus sur un système RGB 8 bits, alors entre chanque couleur il y aurait un incrément de 256/10 = 25 (arrondi) dans la valeur bleue. En revanche avec le décalage de palette on conserve ces mêmes 10 couleurs mais on les fait varier aussi graduellement qu'on veut en modifiant leurs valeurs RGB directement dans la palette, par exemple en n'incrémentant la composante "bleu" que de 1 à chaque cycle d'affichage.

## Exemples

* Les écoulements d'eau dans les jeux LucasArts (par exemple : la cascade d'eau qui est visible dans le labyrinthe de Knossos)
* Les scènes réalisées par Mark Ferrari. L'énorme avantage de ce site est que la palette utilisée est affichée à côté de l'image, et on voit en direct quelles sont les couleurs qu'on fait varier directement dans la palette. On doit bien garder à l'esprit que l'image, quant à elle, n'est pas modifiée. Note: Étonnamment, ces scènes ne datent pas de l'époque des graphismes 8-bits, mais ont été réalisées uniquement pour illustrer les capacités dynamiques du langage web HTML5. Mark Ferrari pousse la technique jusque dans ses derniers retranchements en obtenant des effets auxquels elle ne semble a priori pas adaptée, notamment lorsqu'il arrive à représenter des flocons de neige qui tombent.
