Un ZX Spectrum Raytracer, în BASIC

Un ZX Spectrum Raytracer, în BASIC

Nodul sursă: 3085593

[Gabriel Gambetta] știe câteva lucruri despre ray tracers, fiind autorul Tiny Raytracer, un raytracer scris în doar 912 de octeți de JavaScript. Ca o lungă perioadă de timp membru suferind de ZX Spectrum proiectat în Marea Britanie, s-ar putea îmbina aceste două aventuri amoroase? Ar putea Tiny Raytracer să se potrivească pe ZX Spectrum? În BASIC? Raspunsul este un afirmativ, deși cu multele limitări ale iubitei noastre specii.

<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- mediu” 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 dimensiuni 800w” =”(lățimea maximă: 400px) 100vw, 400px”>

Ray tracing cu doar 15 culori primare

Povestea începe cu a lui [Gabriel]. Algoritmi de trazator de raze Computer Graphics From Scratch (CGFS). și o bază de cod existentă care a fost portată în dialectul BASIC foarte limitat al ZX Spectrum, folosind VSCode pentru editare, BAS2TAP pentru a genera un fișier imagine pe bandă (în esență o pistă audio) și executat cu FUSE. Cu lanțul de instrumente sortat, [Gabriel] adaugă suficient cod pentru a face față ecuațiilor de intersecție a razelor unei sfere și redă o scenă cu trei sfere la o imagine color de 32×22 pixeli, luând doar 15 minute de rulare. Cei care suferă își vor aminti că spectrul avea o matrice de atribute de bloc de 32×22 (sau matrice de culori) cu două valori de culoare pentru pixelii din prim-plan și de fundal. Fiecare bloc de atribute conține 8×8 pixeli, fiecare dintre acestea putând fi în prim-plan (activat) sau în fundal (dezactivat). Următoarea etapă a fost apoi extinderea codului pentru a gestiona pixeli, precum și blocuri, prin simpla extindere a urmăririi razelor la 256 complet. Rezoluție ×176, iar pentru fiecare bloc determină pur și simplu cele două culori cele mai comune și rulează cu cele pentru întregul bloc. Funcționează într-un fel de „conflict de atribute” foarte spectru-esq.

Dar acum timpul de rulare este de 17 ore! Apoi, un punct de ajustare a performanței, folosind destul de multe hack-uri de spectru BASIC și câteva aproximări grafice, cum ar fi proiectarea de raze pentru fiecare pixel de colț al blocului și, dacă sunt identice, colorați toți cei 60 de pixeli rămași la fel și mergeți mai departe. . Acest efort a redus timpul de rulare la două ore.

În continuare, [Gabriel] renunță la modelul de iluminat plat, modelează o singură sursă de lumină și scoate la iveală singurul truc rămas în lumea spectrului monocrom, acela de a dithera valorile intensității pentru fiecare bloc, folosind un simplu Model de dither comandat 8×8, asta nu arată prea rău, luând în considerare toate lucrurile. O oprire rapidă pe drumul spre finalizare, spre adăugați umbre iar timpul de rulare a revenit la 17 ore, dar merită. În mod clar, acesta este optimizat pentru un singur tip de scenă, unul în care sferele sunt predominant, dar principiile sunt acolo, iar cuburile sunt la doar câteva linii de cod mai departe. Vreun primitor?

Raytracing-ul este una dintre acele sarcini distractive, dar complexe, pe care oamenilor le place să le pună într-un hardware neadecvat, ca acest calculator grafic TI-84Plus CE, iar dacă este puțin greu de accesat, iată ceva la fel de nebun rulează în vechiul Excel simplu.

Timestamp-ul:

Mai mult de la Hack A Day