Wytrem

Le système de couleurs

1 message dans ce sujet

Le système de couleur de Minecraft

 

 

88x31.pngCette œuvre est mise à disposition selon les termes de la Licence Creative Commons Attribution - Pas d’Utilisation Commerciale - Pas de Modification 3.0 non transposé . Tout partage implique que vous citiez l'auteur original.

 

 

Bonjour à toutes et à tous !

Voici un petit tutoriel (qui s'apparente plutôt à un court guide) à propos du système de couleur de Minecraft.

 

Note : afin de bénéficier d'un compréhension maximale de ce texte, il est conseillé de connaître la base 2 et d'avoir quelques connaissances en opérations bit-à-bit.

 

 
 
1] Qu'est ce qu'une couleur ?
 
C'est la première et essentielle question à se poser avant tout. Nous ne nous étendrons pas sur le point de vue biologique des choses, mais sur le point de vue informatique.
 
Une couleur en informatique est un triplet de nombres entiers positifs inférieurs ou égaux à 255 ; qu'on associe aux couleurs élémentaires. C'est le fameux système RGB (Red Green Blue). La plupart du temps, une couleur en programmation est représentée par un objet qui contient dans sa définition les trois composants de la couleur qu'il représente (voir java.awt.Color). Cependant, au fil des années, est arrivée la composante dite Alpha d'un couleur. Elle représente son opacité (toujours entre 0 et 255 inclus), et a donné naissance au système de couleur RGBA.
 

2] Et dans Minecraft ?
 
Minecraft n'est pas une exception, car le système de couleur est toujours basé sur un triplet de nombres entiers positifs inférieurs ou égaux à 255. C'est juste la manière d'exprimer ce triplet qui change. En effet, les développeurs de Minecraft ont choisi de représenter ce triplet de nombres en un seul et unique nombre. Vous pensez sans doute que c'est impossible, mais non, car il faut bien se rappeler qu'il s'agit de trois nombre compris entre 0 et 255 inclus. Ainsi, dans un souci d'optimisation, on évite l'instanciation d'un objet, ou la gestion de plusieurs bytes non signés.
 
Je m'explique. Le nombre 255 s'écrit 11111111 en base 2 (pour une unité, une deuzaine, une quatraine, une huitaine, une seizaine, une 32aine, une 64aine et une 128aine). Il est exprimé en 8 bit.
Mais un nombre plus grand peut être exprimé en plusieurs "paquets" de 8 bit. Il est donc possible de mettre bouts à bouts des paquets de 8 bits pour exprimer un triplet.
 
Un petit exemple. Imaginons que j'aie une couleur qui s'exprime ainsi (R, G, B) = (255, 127, 63). En base 2, ce triplet s'écrit comme cela : (111111111, 01111111, 00111111). Il est possible de mettre bouts à bouts ces trois paquets de 8 bits, pour former un seul nombre. Ce nombre s'écrira alors comme ça : 1111111110111111100111111  
En base 10 (nombres habituels), ce nombre s'écrit 33521471.
 
Un autre exemple. Vous avez peut être remarqué que le nombre 16777215 signifie "blanc" dans Minecraft. Mais ce nombre s'écrit 111111111111111111111111 en base deux. Avec la coloration des paquets, cela nous donne 111111111111111111111111. Ce qui se traduit donc par (R, G, B) = (255, 255, 255), triplet qui correspond à la couleur blanche.

 

Encore un exemple, cette fois ci avec un nombre représentant la transparence (« l'alpha »). Si je voulais exprimer une couleur blanche pas tout à fait opaque, je devrais l'écrire de cette façon (R, G, B, A) = (255, 255, 255, 100). J'ai repris la couleur blanche RGB mais j'y ai ajouté l'alpha. Minecraft traduira donc ce nombre comme ceci 01100100111111111111111111111111. Vous remarquerez que, même si l'on dit RGBA, Minecraft met l'alpha en premier.

 

3] Comment Minecraft traduit-il les triplets en nombres, et vice versa ?

 

Nous avons vu plus haut le résultat de la traduction des triplets en nombres. Mais il nous reste à savoir comment s'effectue cette traduction.

Reprenons mon premier exemple (R, G, B) = (255, 127, 63) = (111111111, 01111111, 00111111). Pour transformer ce triplet en nombre unique, je dois "mettre bouts à bouts" ses trois composantes.

 

Mais nous tombons là sur un problème : Java n'a pas de fonction unique pour mettre bouts à bouts des nombres.

Cependant, nous avons à notre disposition tout un tas d'opérateurs qui permettent ce genre de manipulations.

----

Le premier opérateur dont nous allons nous servir est l'opérateur qu'on appelle communément "rotation à gauche". Il se note <<.

On l'utilise de cette manière : unNombre << unAutre. Que fait-il ? Il décale les bits de unAutre (nombre) case(s) vers la gauche, et ajoute des zéros dans les cases vides.

 

Un exemple ! 12 << 3. Cela signifie pour l'ordinateur "décale de 3 cases vers la gauche les bits de 12". 12 s'écrit 1100 en base deux. Voici la procédure qui sera employée par l'opérateur :

  1. On lui donne en entrée 12 et 3 ;
  2. Il ajoute 3 cases vides à droite de 12 (en base deux) : 1100_ _ _
  3. Puis il complète ces cases par des zéros : 1100000

12 << 3 renvoie donc 1100000 soit 96 en base dix.

 

  Masquer le contenu

Pour les matheux :

282244pnglatex.png

 

Nous savons maintenant comment transformer 01111111  en 01111111000000000, par exemple, et ceci va être très utile.

 

Il se trouve que le JDK met à notre disposition un autre opérateur (après celui là, promis, c'est fini !). C'est le "OU inclusif"; noté |.

Que fait il ?

Il regarde les nombres bit-à-bit et si au moins un des deux bits qu'il est en train de regarder vaut 1, alors le bit envoyé correspondant sera 1.

Exemple, en base 2 :

1010 | 0101 // renverra 111111 | 101 // reverra 1111001 | 1011 // renverra 1011

Traduction de l'exemple en base 10 :

10 | 5 // renverra 153 | 5 // reverra 79 | 11 // renverra 11

Examinons le fonctionnement de l'ordinateur lorsqu'il a évalué la dernière ligne de l'exemple :

  • Il regarde le premier bit en partant de la droite de chaque nombre : 1 pour le premier nombre et 1 pour le deuxième nombre. Il écrit le premier bit de son nombre résultat : 1
  • Il regarde le deuxième bit en partant de la droite de chaque nombre : 0 pour le premier nombre et 1 pour le deuxième nombre. Il écrit le deuxième bit de son nombre résultat : 1
  • Il regarde le troisième bit en partant de la droite de chaque nombre : 0 pour le premier nombre et 0 pour le deuxième nombre. Il écrit le troisième bit de son nombre résultat : 0
  • Il regarde le quatrième bit en partant de la droite de chaque nombre : 1 pour le premier nombre et 1 pour le deuxième nombre. Il écrit le quatrième bit de son nombre résultat : 1

Le résultat à été donné de droite à gauche, on obtient donc 1011.

----

 

Après cette (courte) parenthèse à propos des opérateurs, vous savez comment composer avec les nombres.

Mais, revenons à notre exemple de couleur : (R, G, B) = (255, 127, 63) = (111111111, 01111111, 00111111).

Je voudrais donc mettre bouts à bouts ces trois nombres de cette manière : 1111111110111111100111111. La méthode va être la suivante :

  • On transforme le 111111111 en lui ajoutant des zéros à droite avec l'opérateur de rotation à gauche. On fait donc : 111111111 << 16, et on obtient 1111111110000000000000000.
  • On répète l'opération avec le vert, mais cette fois ci on n'ajoute que huit zéros et pas seize. On fait donc : 01111111 << 8, et on obtient 0111111100000000.
  • On laisse le bleu tel quel.

Nous nous trouvons maintenant avec 3 nombres : 1111111110000000000000000, 0111111100000000, et 00111111, dont les parties colorées ne se chevauchent pas. Et nous utilisons le OU inclusif !

 

1111111110000000000000000 | 0111111100000000 = 1111111110111111100000000

 

Puis nous y ajoutons le bleu : 1111111110111111100000000 | 00111111 = 1111111110111111100111111

 

Et nous obtenons notre fameux nombre triplet ! ;)

 

Note : il est possible d'écrire tout ceci en une seule ligne de code (rotation + OU), je vous laisse la trouver si le coeur vous en dit.

 

Note 2 : vous le savez peut être déjà, mais il existe également une autre base de nombres, la base hexadécimale, ou base 16. La notation de ces nombres apparaît en Java précédé du préfixe "0x". Cette base est pratique, car si l'on fait suivre ce préfixe de 6 chiffres (de 0 à F, attention), on exprime par des duos les composantes de notre couleur. Ainsi, la couleur blanche s'écrira 0xFFFFFF (FF correspondant à 15 * 16 + 15 = 255).

3

Partager ce message


Lien à poster
Partager sur d’autres sites

Créer un compte ou se connecter pour commenter

Vous devez être membre afin de pouvoir déposer un commentaire

Créer un compte

Créez un compte sur notre communauté. C’est facile !


Créer un nouveau compte

Se connecter

Vous avez déjà un compte ? Connectez-vous ici.


Connectez-vous maintenant