Een ZX-spectrumraytracer, in BASIC

Een ZX-spectrumraytracer, in BASIC

Bronknooppunt: 3085593

[Gabriel Gambetta] weet het een en ander over raytracers, omdat hij de auteur is van Tiny Raytracer, een raytracer geschreven in slechts 912 bytes JavaScript. Als een lange tijd kameraad lijder van de door Groot-Brittannië ontworpen ZX Spectrum, kunnen deze twee liefdesaffaires worden samengevoegd? Zou de Tiny Raytracer op de ZX Spectrum passen? In BASIS? Het antwoord is een bevestiging, zij het met de vele beperkingen van onze geliefde speccy.

<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. breedte: 400px) 100vw, 400px”>

Raytracing met slechts 15 primaire kleuren

Het verhaal begint met dat van [Gabriel]. Computer Graphics From Scratch (CGFS) raytracer-algoritmen en een bestaande codebasis die is geport naar het zeer beperkte BASIC-dialect van de ZX Spectrum, met behulp van VSCode voor bewerking, BAS2TAP om een ​​tape-imagebestand (in wezen een audiotrack) te genereren en uit te voeren met FUSE. Nu de toolchain is gesorteerd, voegt [Gabriel] net genoeg code toe om de straalsnijdingsvergelijkingen van een bol af te handelen, en rendert hij een scène met drie bollen naar een kleurenbeeld van 32×22 pixels, wat slechts 15 minuten looptijd in beslag neemt. Collega-patiënten zullen zich herinneren dat het spectrum een ​​32×22 blokattribuutarray (of kleurenarray) had met twee kleurwaarden voor voorgrond- en achtergrondpixels. Elk attribuutblok bevat 8×8 pixels, waarvan elk de voorgrond (aan) of achtergrond (uit) kan zijn. De volgende fase was vervolgens het uitbreiden van de code, zodat deze zowel pixels als blokken kon verwerken, door simpelweg de raytracing uit te breiden tot de volledige 256 pixels. ×176 resolutie, en bepaal voor elk blok eenvoudigweg de twee meest voorkomende kleuren, en voer deze uit voor het hele blok. Het werkt min of meer, op een zeer spectrumachtige 'attribuutclash'-achtige manier.

Maar nu is de looptijd 17 uur! Vervolgens een stukje prestatieverbetering, met behulp van een flink aantal spectrum BASIC-hacks en enkele grafische benaderingen, zoals het werpen van stralen voor elke hoekpixel van het blok, en als ze identiek zijn, alle resterende 60 pixels hetzelfde kleuren en verder gaan . Deze inspanning verminderde de looptijd tot twee uur.

Vervolgens laat [Gabriel] dapper het platte verlichtingsmodel achterwege, modelleert een enkele lichtbron en haalt de enige overgebleven truc in de monochrome spectrumwereld tevoorschijn, namelijk het ditheren van de intensiteitswaarden voor elk blok, met behulp van een eenvoudige 8×8 besteld ditherpatroon, dat ziet er alles bij elkaar genomen niet zo slecht uit. Een korte stop op weg naar voltooiing, naar schaduwen toevoegen en de looptijd is terug naar 17 uur, maar het is het waard. Dit is duidelijk geoptimaliseerd voor een enkel scènetype, een waarin bollen overwegend voorkomen, maar de principes zijn aanwezig en kubussen zijn slechts een paar regels code verwijderd. Zijn er afnemers?

Raytracing is een van die leuke, maar complexe taken die mensen graag in ongepaste hardware stoppen. zoals deze TI-84Plus CE grafische rekenmachine, en als dat een beetje moeilijk toegankelijk is, is hier iets dat net zo gek is draaien in gewoon oud Excel.

Tijdstempel:

Meer van Hack een dag