En ZX Spectrum Raytracer, i BASIC

En ZX Spectrum Raytracer, i BASIC

Kilde node: 3085593

[Gabriel Gambetta] vet et par ting om ray tracers, som forfatter av Tiny Raytracer, en raytracer skrevet i bare 912 byte JavaScript. Som en lang tid kar lider av det britiske designet ZX Spectrum, kan disse to kjærlighetsforholdene slås sammen? Kan Tiny Raytracer passe på ZX Spectrum? I BASIC? Svaret er en bekreftende, om enn med vår elskede arts mange begrensninger.

<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 400 2024w, https://platoaistream.com/wp-content/uploads/01/1/a-zx-spectrum-raytracer-in-basic-800,551.png?resize= 800 400 100w" størrelser ="(maks-bredde: 400px) XNUMXvw, XNUMXpx">

Strålesporing med kun 15 primærfarger

Historien starter med [Gabriel] sin Computer Graphics From Scratch (CGFS) raytracer-algoritmer og en eksisterende kodebase som ble portert til ZX Spectrums svært begrensede BASIC-dialekt, ved å bruke VSCode for redigering, BAS2TAP å generere en båndbildefil (i hovedsak et lydspor) og utføres med FUSE. Når verktøykjeden er sortert, legger [Gabriel] til akkurat nok kode til å håndtere stråleskjæringslikningene til en kule, og gjengir en tre-sfære scene til et 32×22 piksler fargebilde, som tar bare 15 minutter med kjøretid. Andre lider vil huske at spekteret hadde en 32×22 blokkattributtmatrise (eller fargematrise) med to fargeverdier for forgrunns- og bakgrunnspiksler. Hver attributtblokk inneholder 8×8 piksler, som hver kan være forgrunn (på) eller bakgrunn (av). Neste trinn var deretter å utvide koden til å håndtere piksler så vel som blokker, ved ganske enkelt å utvide raytracing til hele 256 ×176 oppløsning, og for hver blokk bestemmer du ganske enkelt de to vanligste fargene, og kjør med de for hele blokken. Det fungerer liksom, på en veldig spekterlignende måte som "attributtsammenstøt".

Men nå er kjøretiden 17 timer! Deretter en flekk med ytelsesjusteringer, ved å bruke ganske mange BASIC-hack i spekteret, og noen grafiske tilnærminger som å kaste stråler for hver hjørnepiksel i blokken, og hvis de er identiske, farge alle de resterende 60 piksler like og gå videre . Denne innsatsen reduserte kjøretiden til to timer.

Deretter dropper [Gabriel] tappert den flate belysningsmodellen, modellerer en enkelt lyskilde og trekker frem det eneste gjenværende trikset i den monokrome spektrumverdenen, det med å skjære intensitetsverdier for hver blokk, ved hjelp av en enkel 8×8 bestilt dither mønster, det ser ikke så verst ut, alt tatt i betraktning. En rask stopp på vei til ferdigstillelse, til legge til skygger og kjøretiden er tilbake til 17 timer, men det er verdt det. Det er klart at dette er optimalisert for en enkelt scenetype, en der sfærer hovedsakelig er med, men prinsippene er der, og kuber er bare noen få linjer med kode unna. Noen mottakere?

Raytracing er en av de morsomme, men komplekse oppgavene som folk bare elsker å kile inn i upassende maskinvare, som denne TI-84Plus CE grafkalkulatoren, og hvis det er litt vanskelig å få tilgang til, her er noe like galt kjører i vanlig gammel Excel.

Tidstempel:

Mer fra Hack en dag