Als der ZX Spectrum im Jahre 1982 veröffentlicht wurde, gehörte er mit seinen 256×192 Pixeln hochauflösender Grafik in 8 Farben (in je zwei Helligkeitsstufen) zu den besseren grafikfähigen Heimcomputer seiner Zeit. Es gab sogar einfache 3D-Grafikprogrammen, die es ermöglichten einfache Objekte darzustellen, wie z.B. VU-3D von Psion Software Ltd. Diese Programme waren aber sehr langsam und aus heutiger Sicht mehr eine Machbarkeitsstudie als ernsthaftes Werkzeug. An echtes Raytracing auf dieser Plattform dachte damals niemand. Jetzt hat der Schweizer Gabriel Gambetta, Senior Software Engineer bei Google Zürich, einen Raytracer auf dem ZX Spectrum implementiert.
Auf seiner Website veröffentlichte er bereits 2013 einen Raytracer in Javascript, der nur 912 Byte benötigte, um ein Bild mit drei Kugeln darzustellen. Ein aktueller Rechner benötigt dazu weniger als eine Sekunde, vor zehn Jahren waren es noch einige Sekunden bis hin zu Minuten.
Gambetta portierte den grundlegenden Raytracing-Code nach BASIC, so dass er auf dem ZX Spectrum ausgeführt werden konnte. Dabei war die Konvertierung sogar relativ leicht und erforderte nur wenige Anpassungen. Nur knapp 50 Zeilen in BASIC waren notwendig, um ein erstes Bild zu erzeugen.
In seinem Beitrag beschreibt er Schritt für Schritt, wie er relativ schnell ein einfaches Bild bestehend aus 32×22 Pixeln in vier Farben berechnen konnte. Ganze 15 Minuten brauchte der ZX Spectrum dafür.
Sein Ziel war aber die vollständige Auflösung von 256×192 Pixeln zu nutzen. Aufgrund des limitierten Speichers von knapp 6.144 Byte für Pixeldaten und 768 Byte für Farbinformation, konnte der ZX Spectrum aber keine Grafiken darstellen bei denen jeder Pixel eine eigene Farbe besaß, sondern es wurden immer 8×8 Pixel zu einem gemeinsamen Block mit Vorder- und Hintergrundfarbe zusammengefasst, was bei fast allen Spielen auf dem ZX Spectrum zum berüchtigten „Attribute clash“ (dt: Attributkollision) führte.
Gambetta musste den Code also zunächst so anpassen, dass er den Darstellungsfehler möglichst vermied und schließlich sollten auch Lichteffekte per Dithering dargestellt wurden. Das Dithering musste verwenden werden, um weiteren Farben für die Beleuchtungseffekte durch Schattierungen zu simulieren.
Im Gegensatz zu der einfach zu erhöhenden Auflösung, sind diese Berechnungen aber wesentlich komplexer und benötigen einiges an Rechenzeit. Final benötigt der ZX Spectrum für das Rendern eines einzelnen Bildes fast 17 Stunden.
Wer das einmal selbst ausprobieren möchte: Gambetta hat den vollständigen Quellcode gut dokumentiert veröffentlicht. Wer selbst keinen ZX Spectrum besitzt, kann einen der zahlreichen Emulatoren, wie z.B. ZEsarUX oder Fuse, verwenden.
Links: Beitrag von Gabriel Gambetta
Bilder: alle Raytracing Bilder, Gabriel Gambetta; VU-3D, Psion Software Ltd.
…und in Z80-Assembler? Ein Assembler-Programm sollte um den Faktor 1.000 schneller laufen.
Hallo,
versuche dich doch einmal in einer Anpassung. Gabriel wird sich sicher über eine entsprechende Implementierung freuen.
Stephan