En ZX Spectrum Raytracer, i BASIC

En ZX Spectrum Raytracer, i BASIC

Källnod: 3085593

[Gabriel Gambetta] kan några saker om strålspårare, eftersom han är författare till Tiny Raytracer, en strålspårare skriven på bara 912 byte JavaScript. Som en lång tid Kompis lider av den brittiska designade ZX Spectrum, kan dessa två kärleksaffärer slås samman? Kan Tiny Raytracer passa på ZX Spectrum? I BASIC? Svaret är en jakande, om än med vår älskade arts många begränsningar.

<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 size-medium” src=”https://platoaistream.com/wp-content/uploads/2024/01/a-zx-spectrum-raytracer-in-basic.png” alt width=”400″ height=”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 800w” sizes=”(max-width: 400px) 100vw, 400px”>

Strålspårning med endast 15 primärfärger

Berättelsen börjar med [Gabriel]s Computer Graphics From Scratch (CGFS) raytracer-algoritmer och en befintlig kodbas som portades till ZX Spectrums mycket begränsade BASIC-dialekt, med hjälp av VSCode för redigering, BAS2TAP för att generera en bandbildfil (i huvudsak ett ljudspår) och exekveras med SÄKRING. Med verktygskedjan sorterad lägger [Gabriel] till precis tillräckligt med kod för att hantera strålkorsningsekvationerna för en sfär, och återger en scen med tre sfärer till en färgbild på 32×22 pixlar, vilket tar bara 15 minuters körtid. Andra drabbade kommer ihåg att spektrumet hade en 32×22 block attribut array (eller färg array) med två färgvärden för förgrunds- och bakgrundspixlar. Varje attributblock innehåller 8×8 pixlar, som var och en kan vara förgrund (på) eller bakgrund (av). Nästa steg var sedan att utöka koden för att hantera pixlar såväl som block, genom att helt enkelt utöka raytracing till hela 256 ×176 upplösning, och för varje block bestäm helt enkelt de två vanligaste färgerna och kör med dem för hela blocket. Det fungerar liksom, på ett mycket spektrumliknande sätt som "attributkrock".

Men nu är körtiden 17 timmar! Därefter en plats för prestandajusteringar, med en hel del BASIC-hack för spektrum och några grafiska uppskattningar som att kasta strålar för varje hörnpixel i blocket, och om de är identiska, färgar alla de återstående 60 pixlarna lika och går vidare . Denna ansträngning minskade körtiden till två timmar.

Nästa [Gabriel] tar modigt bort den platta belysningsmodellen, modellerar en enda ljuskälla och tar fram det enda återstående tricket i den monokroma spektrumvärlden, det att vibrera intensitetsvärden för varje block, med hjälp av en enkel 8×8 beställt dithermönster, det ser inte så illa ut, allt med tanke på det. Ett snabbt stopp på vägen till avslutning, till lägga till skuggor och körtiden är tillbaka till 17 timmar, men det är det värt. Uppenbarligen är detta optimerat för en enskild scentyp, en där sfärer övervägande förekommer, men principerna finns där, och kuber är bara några fler rader kod bort. Några mottagare?

Raytracing är en av de där roliga, men komplexa uppgifterna som folk bara älskar att kila in i olämplig hårdvara, som denna TI-84Plus CE grafräknare, och om det är lite svårt att komma åt, här är något lika galet körs i vanlig gammal Excel.

Tidsstämpel:

Mer från Hacka en dag