Un Raytracer ZX Spectrum, en BASIC

[Gabriel Gambetta] connaît quelques choses sur les traceurs de rayons, étant l’auteur de Tiny Raytracer, un traceur de rayons écrit en seulement 912 octets de JavaScript. Comme il y a longtemps compagnon victime du ZX Spectrum de conception britannique, ces deux histoires d’amour pourraient-elles fusionner ? Le Tiny Raytracer pourrait-il s’adapter au ZX Spectrum ? En BASE ? La réponse est affirmative, malgré les nombreuses limites de notre espèce bien-aimée.

Ray tracing avec seulement 15 couleurs primaires

L’histoire commence par [Gabriel]Les algorithmes de traçage de rayons Computer Graphics From Scratch (CGFS) et une base de code existante qui a été portée sur le dialecte BASIC très limité du ZX Spectrum, en utilisant VSCode pour l’édition, BAS2TAP pour générer un fichier image de bande (essentiellement une piste audio) et exécuté avec FUSE. . Une fois la chaîne d’outils triée, [Gabriel] ajoute juste assez de code pour gérer les équations d’intersection des rayons d’une sphère et restitue une scène à trois sphères en une image couleur de 32 × 22 pixels, en seulement 15 minutes d’exécution. Les autres malades se souviendront que le spectre avait un tableau d’attributs de bloc (ou tableau de couleurs) de 32 × 22 avec deux valeurs de couleur pour les pixels de premier plan et d’arrière-plan. Chaque bloc d’attribut contient 8 × 8 pixels, chacun pouvant être au premier plan (activé) ou à l’arrière-plan (désactivé). L’étape suivante consistait ensuite à étendre le code pour gérer les pixels ainsi que les blocs, en étendant simplement le lancer de rayons au maximum. Résolution ×176, et pour chaque bloc, déterminez simplement les deux couleurs les plus courantes et utilisez celles de l’ensemble du bloc. Cela fonctionne en quelque sorte, dans une sorte de « choc d’attributs » très spectral.

Mais maintenant, l’autonomie est de 17 heures ! Ensuite, un peu d’ajustement des performances, en utilisant un certain nombre de hacks BASIC de spectre et quelques approximations graphiques telles que la projection de rayons pour chaque pixel de coin du bloc, et s’ils sont identiques, colorer tous les 60 pixels restants de la même manière et passer à autre chose. . Cet effort a réduit la durée d’exécution à deux heures.

Suivant [Gabriel] abandonne courageusement le modèle d’éclairage plat, modélise une seule source de lumière et retire la seule astuce restante dans le monde du spectre monochrome, celle de tramer les valeurs d’intensité pour chaque bloc, en utilisant un simple motif de tramage ordonné 8 × 8, qui n’a pas l’air trop mauvais, tout bien considéré. Un arrêt rapide en route vers la fin, pour ajouter des ombres et le temps d’exécution revient à 17 heures, mais ça vaut le coup. De toute évidence, ceci est optimisé pour un seul type de scène, dans lequel les sphères figurent principalement, mais les principes sont là et les cubes ne sont qu’à quelques lignes de code supplémentaires. N’importe quels preneurs?

Le lancer de rayons est l’une de ces tâches amusantes mais complexes que les gens adorent insérer dans du matériel inapproprié, comme cette calculatrice graphique TI-84Plus CE, et si c’est un peu difficile d’accès, voici quelque chose d’aussi fou exécuté dans le bon vieux Excel.

François Zipponi
Je suis François Zipponi, éditorialiste pour le site 10-raisons.fr. J'ai commencé ma carrière de journaliste en 2004, et j'ai travaillé pour plusieurs médias français, dont le Monde et Libération. En 2016, j'ai rejoint 10-raisons.fr, un site innovant proposant des articles sous la forme « 10 raisons de... ». En tant qu'éditorialiste, je me suis engagé à fournir un contenu original et pertinent, abordant des sujets variés tels que la politique, l'économie, les sciences, l'histoire, etc. Je m'efforce de toujours traiter les sujets de façon objective et impartiale. Mes articles sont régulièrement partagés sur les réseaux sociaux et j'interviens dans des conférences et des tables rondes autour des thèmes abordés sur 10-raisons.fr.