Moin allerseits!
Nach langer Funkstille möchte ich wieder ein paar Updates zu meinem Projekt vorstellen. Seit dem letzten Post hat sich in der Engine einiges getan :)
Bezüglich der Licht Engine:
Leider musste ich das Voxel Cone Tracing vollständig aufgeben, da leaks im Licht durch z.B. Wände hindurch leider sehr schwer zu vermeiden waren, und allgemein das Licht leider nicht die Qualität hatte, die ich mir vorgestellt hatte. Ich denke, dass Cone Tracing weiterhin eine sehr interessante und vor allem extrem schnell zu berechnende Licht Technik ist. Es hat am Ende aber leider nicht ganz gepasst bzgl. der Qualität.
Der wohl größte Krampf im Projekt war bisher, dass als Grafikschnittstelle im Browser lediglich WebGL zu Verfügung stand, was vieles sehr sehr eingeschränkt hat. Ich habe nun endlich die Portierung nach WebGPU begonnen (und auch fast vollständig abgeschlossen) und es ist einfach nur wunderbar..Ich habe mich von OpenGL bis Vulkan und DirectX durchgekämpft und muss sagen, dass WebGPU die wohl beste Grafik API ist, wenn es um schnelles Prototyping bzw. Projekte mit keinen ultra komplexen Render Pipelines geht. WebGPU führt imo die besten Konzepte von Vulkan & co zusammen, abstrahiert da wo es sinnvoll ist, und hat aus den ganzen unsäglichen Fehlern von OpenGL gelernt.
Ungefähr einen Monat lang habe ich dann mit Light Propagation Volumes (kurz "LPV") gearbeitet. Kleiner Side Fact: Ist schon ne Weile her, aber die Technik wurde tatsächlich von Crytek in Stuttgart! entwickelt :). Mit Voxeln sind LPV auch deutlich einfach als mit Triangeln, da man keine RSM braucht, sondern das Licht bzw. die Farben der Voxel direkt in das LPV Volumen injizieren kann.
Leider hat auch hier mich das Ganze nicht ganz überzeugen können, da vor allem die Qualität von Licht Bounces ziemlich Mehh ist. Ich habe auch versucht, anstatt Voxel Farben zu injizieren, das ganze stattdessen mit Path tracing zu kombinieren und das LPV Verfahren quasi als Spatial Filter zu benutzen. Hat aber auch nicht so ganz geklappt..
Jedenfalls sind LPV eine interessante Technik und fanden zu meiner Überraschung sogar Verwendung im Playstation Titel "Dreams".
Und
hier eine ältere Browser Demo von der LPV + Path Tracing Technik :)
Seit ein paar Monaten wird nun das Licht vollständig mit Echtzeit Path tracing berechnet. Hierbei verwende ich einen Mix aus Pro-Pixel Path tracing und World-Space Path tracing, inspiriert von der
Radiance Caching Technik von UE Lumen.
Der spannende Part ist hier wohl das World-Space Path tracing: Verwendet werden 3 Kaskaden, welche um die Kamera zentriert und leicht in die Blickrichtung versetzt sind. Die Skalierung jeder Kaskade verdoppelt den umfassten Bereich was es ermöglicht, riesige Distanzen mit minimalem Performance Verlust zu überdecken. Außerdem wird nur eine Kaskade pro Frame aktualisiert (die Idee hab ich von
hier geklaut).
Die Kaskaden sind double buffered zum temporalen Filtern und verwenden 2nd Order Spherical Harmonics um die Irradianz zu speichern. Hinzu kommt ein schwacher Spatial und Firefly Filter.
Der World-Space Cache wird hauptsächlich verwendet, um das Screen-Space Path tracing zu unterstützen. Für komplexe Lichtverhältnisse wie z.B. dunkle Räume mit nur ein paar emissiven Lichtquellen, hat der World-Space Radiance Cache einen riesigen Unterschied gemacht - pro Pixel Path Tracing würde hier vor allem für neu aufgedeckte Bereiche kläglich scheitern.
Außerdem erlaubt der World-Space Cache quasi kostenlos unendliche Licht Bounces. Pro Voxel im Cache with ja ein Ray geschossen, und wenn der Ray etwas trifft, dann kann man neben der Voxel Farbe auch den aktuellen Wert vom Licht im Cache an der Stelle reinmixen. Ich würde die Technik mal vorsichtig als "Resampling" oder "Reinjection" bezeichnen, da der Cache sich hier ja quasi selbst re-injiziert. Hat eine Weile gebraucht bis ich auf diesen eigentlich offensichtlichen Trick gekommen bin *facepalm*.
Außerdem experimentiere ich im Moment mit einem Blocky Lighting bzw. Pixel Art Look aber auf Voxel übertragen. Die Idee ist, das Licht pro Voxel Fläche konstant zu machen, was wie ich finde einen netten Retro Effekt gibt, ohne das Bild zu körnig wirken zu lassen. Zum kombinieren des Lichts über Voxel Flächen verwende ich einen einfachen Box Filter mit Voxel+Normalen Vektor Kantenerkennung.
Bezüglich der Simulations Engine:
Hier hat sich leider noch nicht sonderlich viel getan. Bisher läuft die Simulation auf der CPU in WebAssembly mit Multi-threading, allerdings erlaubt der WebGPU Port nun endlich die Simulation auf die GPU in Compute Shader zu schieben. Das wird einen gigantischen Performance Boost geben, da ich den Simulations Code eh schon immer auf der GPU laufen lassen wollte und ihn auch schon von der ersten Stunden an dafür ausgelegt geschrieben habe :)
Ansonsten:
Es gibt nun auch einen Minecraft Map Importer, welcher .mca Dateien parsen und das Box Modell Format + Texturen (und Texture Packs!) in Voxel Volumen umwandelt. Die ganzen Modelle, Texturen zum parsen etc. werden natürlich nicht irgendwo gespeichert, sondern schön aus der minecraft game jar extrahiert ;)
Soo genug Text Block, hier ein paar Screenshots vom Projekt welche über die letzten Monate gemacht wurden: