Un Raytracer ZX Spectrum, en BASIC

Un Raytracer ZX Spectrum, en BASIC

Nœud source: 3085593

[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 un affirmatif, bien qu'avec les nombreuses limites de notre espèce bien-aimée.

<img decoding="async" data-attachment-id="661085" data-permalink="https://hackaday.com/2024/01/26/a-zx-spectrum-raytracer-in-basic/screenshot-from-2024-01-25-21-02-18/" data-orig-file="https://platoaistream.com/wp-content/uploads/2024/01/a-zx-spectrum-raytracer-in-basic-1.png" data-orig-size="940,648" data-comments-opened="1" data-image-meta="{"aperture":"0","credit":"","camera":"","caption":"","created_timestamp":"0","copyright":"","focal_length":"0","iso":"0","shutter_speed":"0","title":"","orientation":"0"}" data-image-title="Screenshot from 2024-01-25 21-02-18" data-image-description="

https://gabrielgambetta.com/zx-raytracer.html

" data-image-caption data-medium-file = " https://platoaistream.com/wp-content/uploads/2024/01/a-zx-spectrum-raytracer-in-basic.png " data-large-file =”https://platoaistream.com/wp-content/uploads/2024/01/a-zx-spectrum-raytracer-in-basic-1.png?w=800″ class=”wp-image-661085 taille- moyen" src = "https://platoaistream.com/wp-content/uploads/2024/01/a-zx-spectrum-raytracer-in-basic.png" alt width = "400" hauteur = "276" srcset = "https://platoaistream.com/wp-content/uploads/2024/01/a-zx-spectrum-raytracer-in-basic-1.png 940w, https://platoaistream.com/wp-content/uploads/ 2024/01/a-zx-spectrum-raytracer-in-basic-1.png?resize=250,172 250w, https://platoaistream.com/wp-content/uploads/2024/01/a-zx-spectrum-raytracer -in-basic-1.png?resize=400,276 400w, https://platoaistream.com/wp-content/uploads/2024/01/a-zx-spectrum-raytracer-in-basic-1.png?resize= 800,551 800 400w" tailles = "(largeur maximale : 100px) 400vw, XNUMXpx">

Ray tracing avec seulement 15 couleurs primaires

L'histoire commence avec celui de [Gabriel] Algorithmes de lancer 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, ne prenant que 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 ×256, 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.

Ensuite, [Gabriel] abandonne courageusement le modèle d'éclairage plat, modélise une seule source de lumière et découvre la seule astuce restante dans le monde du spectre monochrome, celle de tramer les valeurs d'intensité pour chaque bloc, en utilisant un simple Modèle de tramage ordonné 8 × 8, ça n'a pas l'air trop mal, tout bien considéré. Un arrêt rapide sur le chemin de l'achèvement, pour ajouter des ombres et la durée d'exécution est revenue à 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 fonctionnant dans le bon vieux Excel.

Horodatage:

Plus de Pirater un jour