Der Raytracer
Raytracing Engine. Von Grund auf. In C. Demo unten
Das Projekt, das ich vorstellen möchte, ist miniRT (Mini-Raytracer). Wie die Shell war dies Teil des 42-Curriculums und wurde unter denselben Regeln und Einschränkungen wie das vorherige Projekt umgesetzt.
Der Quellcode für dieses Projekt ist hier verfügbar.
Diesmal bestand die Aufgabe darin, einen einfachen Raytracer von Grund auf zu erstellen, mit einem eigenen Wrapper um die Linux-X11-API für einfache Fenstererstellung und I/O.
Ein Raytracer ist ein Programm, das eine Technik namens Raytracing verwendet, die genutzt wird, um realistische Bilder digital zu erzeugen. Raytracing bedeutet im Wesentlichen, dass wir das Betrachten einer Szene aus unserer „Augenposition" simulieren und den Computerbildschirm wie ein Fenster benutzen, durch das wir auf diese Szene schauen.
Wir stellen uns vor, einen perfekt geraden „Strahl" von unserem „Auge" durch jeden Pixel des Bildschirms zu schießen und den Pfad dieses Strahls zu verfolgen, um zu sehen, ob er ein Objekt schneidet. Wenn ja, wissen wir, dass dieser bestimmte Pixel die Farbe des getroffenen Objekts anzeigen soll. Mit etwas Mathematik für Beleuchtung, Schatten anderer Objekte, Entfernung und mehr können wir eine endgültige Farbe für jeden Pixel bestimmen und damit ein bemerkenswert realistisches Bild unserer Szene erzeugen.
Ueber die grundlegende Bilderzeugung hinaus haben wir zusätzliche Funktionen hinzugefügt, die nicht von der Aufgabe verlangt wurden, aber interessant genug schienen, um sie selbst zu erlernen und umzusetzen. Einige der zusätzlichen Funktionen sind:
- Multithreaded
- Texturen und Bumpmaps
- Dynamisches Laden von Szenen/Texturen/Bumpmaps
- Eigene Schriftart mit Textrenderingfunktion
- Eigenes SDK zur Erstellung von Menüs mit Schaltflächen und Schiebereglern
- Einfacher Datei-Explorer zum Laden von Ressourcen zur Laufzeit
- Verschiedene Reflexionsmodelle
- Objekte als perfekte Spiegel
- Skybox
Dieses Projekt war eine Teamarbeit, und mein Teampartner Benjámin Szilas hat viele Funktionen implementiert, die für das Projekt essentiell waren. Er ist für viele der Tracing-Funktionen verantwortlich und hat Funktionen wie Schatten, Spiegel, Phong-Reflektion, mehrere Lichtquellen, Anti-Aliasing und vieles mehr implementiert.
Ich bin in unserem Projekt verantwortlich fuer viele I/O (input/output) bezogene Features z.B. Maus und Tastatur input, Datei Parsing, der eigene Datei Explorer, das gesammte Bedieneroberflaechen Konzept wie Menus, Knoepfe, Ordner-Navigation, Text-Rendering und das Live-Laden von Scenen und Texturen. Ausserdem habe ich auch einige Features wie Texturen und Bumpmaps sowie das Schachbrett Muster und mehr implementiert.
Ich hatte viel Spaß mit diesem Projekt und habe viel über grafische Programmierung, Teamarbeit und (etwas) Mathematik gelernt!
Als abschließende Anmerkung: Seit wir das Projekt abgeschlossen haben, wollte ich es hier vorstellen, und so habe ich die Rendering-Schicht neu implementiert, um Raylib zu verwenden, da dies passender erschien.
Ich habe unten eine Live-Version bereitgestellt. Probier sie gerne aus!
Es gibt zwei Möglichkeiten, die App auszuführen: entweder direkt im Browser als WASM (WebAssembly) Programm oder über eine live noVNC-Verbindung zu einer Instanz, die auf dem Server läuft.
Der Raytracer selbst ist multithreaded, aber da JS/WASM auf einem einzigen Thread läuft, ist die WASM-Version sehr langsam. Ich habe die Auflösung für diese Version verringert, damit sie nicht mit -5 FPS läuft.
Vielen Dank an noVNC und Raylib für die Web-Integration. Ihre Arbeit ist wirklich toll!