- La texture XOR est une texture procédurale simple créée en appliquant un XOR aux coordonnées x et y d’un pixel, utile pour tester rapidement un texture mapper sans fichier image
- En C++, on produit la valeur
x ^ yavec l’opérateur^et, en la plaçant dans le RGB, on obtient un motif en niveaux de gris ; le XOR ne renvoie 1 que lorsque deux bits sont différents - La taille de texture donne un meilleur rendu lorsqu’elle est une puissance de deux ; sous 256, la plage de valeurs est réduite et l’image s’assombrit, mais on peut corriger cela en multipliant les valeurs de couleur
- Une texture XOR de taille supérieure à 256 n’améliore pas la qualité, car elle reste limitée à la plage de couleurs 0~255 des canaux 8 bits ; pour des tailles plus grandes, il faut diviser les valeurs ou utiliser des canaux avec plus de bits
- En appliquant de la même façon
&et|aux coordonnées, on peut aussi créer des textures AND et OR ; AND est plus sombre, OR plus clair, et la somme de XOR et AND donne OR
Où une texture XOR peut être utile
- La texture XOR est très facile à générer et constitue une texture procédurale visuellement crédible
- Dans les démos ou les intros, elle a été beaucoup trop utilisée pour être un bon choix, et dans les jeux, elle a peu d’intérêt pratique en dehors d’usages comme des dalles de sol voyantes
- Elle permet de vérifier rapidement si un nouveau texture mapper fonctionne, sans charger de fichier image ni écrire de code de génération complexe
Créer un motif avec le XOR des coordonnées
- L’idée de base consiste à appliquer un XOR entre la coordonnée
xet la coordonnéeydu pixel courant - En C++, l’opérateur XOR est
^ - Le code d’exemple calcule une valeur pour chaque pixel d’un écran 256×256
Uint8 c = x ^ yColorRGB(c, c, c)définit une couleur en niveaux de gris
- Le résultat affiché est un motif XOR issu de la combinaison des motifs binaires des coordonnées
Contraintes de taille et de plage de couleurs
- La texture est plus esthétique lorsque sa taille est une puissance de deux
- Les valeurs des composantes de couleur vont de 0 à 255
- La valeur de couleur maximale produite par l’opération XOR est égale à la dimension de la texture lorsque celle-ci est une puissance de deux
- Un motif plus petit que 256, comme 64, paraît trop sombre
- Multiplier les valeurs de couleur par 4 permet de retrouver de la luminosité
- Avec une taille supérieure à 256, comme 512, il faut limiter les couleurs pour qu’elles ne dépassent pas 256
- On peut utiliser un modulo 256, mais ce ne sera alors plus un véritable motif XOR
- Il vaut mieux diviser par 2
- Avec des canaux 8 bits, il n’y a pas assez de valeurs de couleur distinctes pour améliorer la qualité des textures XOR au-delà de 256×256
- Dans un mode couleur prenant en charge davantage de bits, la limite des grandes textures peut être différente
Fonctionnement binaire de l’opération XOR
- Le XOR agit bit par bit sur les représentations binaires de deux entiers
- Exclusive OR renvoie 1 lorsque les deux bits sont différents, et 0 lorsqu’ils sont identiques
- La table de vérité est la suivante
0 XOR 0 = 00 XOR 1 = 11 XOR 0 = 11 XOR 1 = 0
- Par exemple,
5 XOR 13 = 8- En binaire :
0101 XOR 1101 = 1000
- En binaire :
Variations de couleur
- La valeur XOR peut être utilisée non seulement en niveaux de gris, mais aussi différemment sur chaque canal RGB
- Dans l’exemple,
c = x ^ ysert à construire la couleurr = 255 - cg = cb = c % 128
- On peut aussi utiliser la valeur XOR comme teinte dans l’espace HSV et l’envoyer à la fonction
HSVtoRGB- Dans l’exemple,
ColorHSV(c, 255, 255)est converti viaHSVtoRGBpour obtenir la couleur du pixel
- Dans l’exemple,
Textures AND et OR
- En utilisant les opérateurs AND et OR à la place de XOR, on peut créer des textures similaires basées sur les coordonnées
- En C++, l’opérateur AND est
&et l’opérateur OR est| - AND ne renvoie 1 que lorsque les deux bits valent 1
0 AND 0 = 00 AND 1 = 01 AND 0 = 01 AND 1 = 1
- OR renvoie 1 lorsqu’au moins l’un des deux bits vaut 1
0 OR 0 = 00 OR 1 = 11 OR 0 = 11 OR 1 = 1
- Une texture AND est plus sombre, car elle ne renvoie 1 que dans un seul cas, tandis qu’une texture OR est plus claire, car elle renvoie 1 dans de nombreux cas
- La somme d’une texture XOR et d’une texture AND donne une texture OR
Conclusion et usages d’exemple
- La texture XOR est facile à créer et utile pour tester si un moteur de rendu de textures fonctionne correctement
- Elle n’est pas adaptée aux travaux artistiques ni aux applications comme les jeux
- Elle peut aussi servir de texture 3D sous la forme
x ^ y ^ z; dans l’exemple, elle est utilisée pour vérifier que le moteur de rendu de textures planétaires fonctionne correctement
1 commentaires
Avis sur Hacker News
Grâce à ça, j’ai pu recréer des jeux rétro comme Pacman, Snake ou Space Invaders, et faire des choses impossibles avec le seul terminal.
Je pense que ce site a été l’élément déclencheur qui m’a fait commencer une carrière dans le développement logiciel assez jeune. À l’époque, j’avais presque mémorisé les pages et les exemples de https://lodev.org/cgtutor/, même si je ne comprenais absolument pas une partie des maths
Au lieu de
x ^ y, j’utilisaisparity(x ^ y): une couleur si le nombre de bits à 1 était pair, l’autre s’il était impair. Le résultat ressemblait à un pavage presque répétitif, mais jamais complètement, ce qui le rendait visuellement intéressant.En fouillant dans mes vieux fichiers, j’ai retrouvé un programme écrit en 2019 avec fasm, qui générait un fichier XPM2 ; pour l’afficher, il fallait le convertir manuellement en XPM3. L’image obtenue est ici : https://i.postimg.cc/FsFhXSHG/xortiles.png
Je peux poster le code si ça intéresse quelqu’un, même si je ne sais pas si ça intéressera vraiment
Xor(x,y), alors la distance de Hamming serait sans doutePopCount(Xor(x,y)).Probablement ?
Je glisse discrètement mon blog avant de m’éclipser : https://nicknash.me/2012/10/26/happy-halloween/
5 4 7 6 1 0 3 2color = (y == (x ^ t))en faisant variert, on obtient un effet similaire ; on appelle ça munching squares.À l’origine, cela a été écrit pour le PDP-1 au début des années 1960, et j’en ai déjà vu une démonstration sur le PDP-1 du Computer History Museum.
L’affichage du PDP-1 ne peut tracer que des points et n’utilise pas de framebuffer bitmap, donc je me suis toujours demandé comment cette texture XOR caractéristique pouvait apparaître.
Il s’avère que cela exploite la longue persistance du phosphore de l’écran, et que la luminosité de chaque point décroît avec le temps.
Le CHM a une vidéo du programme en cours d’exécution, mais l’effet de rémanence du phosphore y ressort mal : https://www.computerhistory.org/collections/catalog/10266415...
Une vidéo tournée dans MAME montre mieux, dans une certaine mesure, comment la rémanence du phosphore produit la texture XOR : https://youtu.be/AxJzUiaQ7xM?si=X9K47c4WyD6AisUp
Dwitter est une sorte de Twitter pour des exemples JavaScript en une ligne utilisant canvas, où les utilisateurs doivent faire tenir leur création en 140 octets
Il existe aussi plusieurs variantes utilisant d’autres opérateurs binaires pour produire le triangle de Sierpiński : https://www.dwitter.net/h/sierpinski
Il ressemble beaucoup à l’une des images vers la fin du site, avec la même échelle de couleurs arc-en-ciel, et il est accroché au mur comme décoration sur une surface de 6 pieds sur 6
Le contenu a 20 ans, mais il reste encore plein de choses utiles, surtout si vous faites du shader
~:"1/~&.#:i.2^8C’est visible ici : https://jsoftware.github.io/j-playground/bin/html2/#base64=b...