[Projekt] Falling Sand Voxel Engine

Hier könnt ihr euch selbst, eure Homepage, euren Entwicklerstammtisch, Termine oder eure Projekte vorstellen.
Forumsregeln
Bitte Präfixe benutzen. Das Präfix "[Projekt]" bewirkt die Aufnahme von Bildern aus den Beiträgen des Themenerstellers in den Showroom. Alle Bilder aus dem Thema Showroom erscheinen ebenfalls im Showroom auf der Frontpage. Es werden nur Bilder berücksichtigt, die entweder mit dem attachement- oder dem img-BBCode im Beitrag angezeigt werden.

Die Bildersammelfunktion muss manuell ausgeführt werden, die URL dazu und weitere Details zum Showroom sind hier zu finden.

This forum is primarily intended for German-language video game developers. Please don't post promotional information targeted at end users.
Benutzeravatar
x1m4
Establishment
Beiträge: 106
Registriert: 02.04.2022, 22:56
Kontaktdaten:

Re: [Projekt] Falling Sand Voxel Engine

Beitrag von x1m4 »

marcgfx hat geschrieben: 29.06.2022, 16:30 sieht für mich super aus. was genau geht kaputt? ich kann es nicht erkennen.
Ab Sekunde 7 sieht man, dass der Nebel an der linken Seite der Welt viel zu stark ist. Eigentlich sollte das nicht passieren, hab den Grund immer noch nicht gefunden..

Ich hab einen kleinen temporalen Upscaler gebaut, der bisher ganz gute Ergebnisse liefert:
Bild
- Links: Ohne temporalem Upscaling
- Rechts: Mit temporalem Upscaling

Im Bild wird das volumetrische Licht und das volumetrische Sonnenlicht auf 1/4 der Bildschirmauflösung berechnet. Davor 6ms pro Frame, jetzt 0.6ms und ich erkenne kaum einen Verlust an Qualität.

Und hier ist der rohe Input ohne Filterung (yikes):

Bild
Benutzeravatar
marcgfx
Establishment
Beiträge: 2050
Registriert: 18.10.2010, 23:26

Re: [Projekt] Falling Sand Voxel Engine

Beitrag von marcgfx »

Wenn so kleine Lichter schon so stark sichtbar sind, wäre es ja logisch das es bei mehr Licht im Raum dichter wird? Vielleicht ist einfach zu viel Licht im Raum. Oder kannst du vielleicht gewisse Lichter dichter als andere machen?
Benutzeravatar
x1m4
Establishment
Beiträge: 106
Registriert: 02.04.2022, 22:56
Kontaktdaten:

Re: [Projekt] Falling Sand Voxel Engine

Beitrag von x1m4 »

Mit dem volumetrischen Licht kann man Szenen jetzt deutlich mehr Tiefe geben:
Bild
Bild
Bild
Benutzeravatar
x1m4
Establishment
Beiträge: 106
Registriert: 02.04.2022, 22:56
Kontaktdaten:

Re: [Projekt] Falling Sand Voxel Engine

Beitrag von x1m4 »

marcgfx hat geschrieben: 30.06.2022, 00:47 Oder kannst du vielleicht gewisse Lichter dichter als andere machen?
Ja das hab ich mir auch schon überlegt. Eine Möglichkeit, Informationen über die Dichte eines Voxels in der Welt zur Verfügung zu haben, könnte für dynamischen Nebel, aber auch für so Kram wie volumetrische Wolken sehr nützlich sein. Ich habe neben der Licht Engine ja auch eine Falling Sand bzw. CA simulation, mit der ich neben Strom auch sowas wie Dichte (oder auch Hitze) ausbreiten könnte. Wolken wollte ich eh schon lange mal versuchen, vielleicht bekomme ich da demnächst mal was hin^^
scheichs hat geschrieben: 30.06.2022, 21:41 Sieht richtig gut aus!
Danke!
Benutzeravatar
x1m4
Establishment
Beiträge: 106
Registriert: 02.04.2022, 22:56
Kontaktdaten:

Re: [Projekt] Falling Sand Voxel Engine

Beitrag von x1m4 »

Noch Autofokus und Auto Exposure für die Kamera eingebaut.
Autofokus stellt automatisch die fokale Länge der Kamera auf die Mitte des Bildschirms ein.
Auto Exposure stellt automatisch den Gamma Wert anhand der durchschnittlichen Helligkeit des Bilds ein.

Für beide Effekte verwende ich temporale Akkumulation, so dass z.B. der Autofokus bei einer Mausbewegung nicht instant ist, sondern smooth über mehrere Frames verteilt wird.

bruebaker
Establishment
Beiträge: 428
Registriert: 08.12.2015, 10:42
Benutzertext: Sven Rahn
Echter Name: Sven Rahn

Re: [Projekt] Falling Sand Voxel Engine

Beitrag von bruebaker »

Schaut schick aus
Benutzeravatar
x1m4
Establishment
Beiträge: 106
Registriert: 02.04.2022, 22:56
Kontaktdaten:

Re: [Projekt] Falling Sand Voxel Engine

Beitrag von x1m4 »

bruebaker hat geschrieben: 02.07.2022, 10:37 Schaut schick aus
Danke! :-)

Hab heute "Checkerboard Upscaling" eingebaut. Das wird meistens benutzt, um Bilder über Zeit hoch zu skalieren. Die Idee ist dabei, dass nur die Hälfte der Pixel berechnet wird, und im nächsten Frame dann der andere Teil. Eine einfache Methode, die auch schon lange zum Einsatz kommt.

Anstatt die Texture runter zu skalieren und und die Koordinaten zu shiften, benutze ich einen Trick, der es ausnutzt, dass Fragment Shader in 2x2 Blöcken ausgeführt werden. Hierbei setze ich die Pixel Koordinaten, welche weggelassen werden sollen einfach zu den Koordinaten eines Nachbar Pixels, was dazu führt, dass die GPU das optimieren kann, da die beiden Pixel dann ja auf das gleiche Ergebnis kommen bzw. die gleichen Rechenkonditionen beim Start haben. Das hat die Rechenzeit für die Lichtberechnung um fast die Hälfte reduziert.

Hier ein Closeup Vergleich:
Bild

Scheinbar unterstützt das Checkboard Upscaling sogar mein TAA. Meine TAA Implementierung scheint also nicht ganz vom feinsten zu sein^^

Und hier der komplette Vergleich:
Bild
Benutzeravatar
xq
Establishment
Beiträge: 1581
Registriert: 07.10.2012, 14:56
Alter Benutzername: MasterQ32
Echter Name: Felix Queißner
Wohnort: Stuttgart & Region
Kontaktdaten:

Re: [Projekt] Falling Sand Voxel Engine

Beitrag von xq »

Der Vergleich ist so leider schwer abzuschätzen, denn den einzigen Unterschied, den ich in den Bildern sehen kann, sind JPEG-Artefakte. Kannst du die Bilder hier im Forum verlustfrei komprimiert hochladen? Bestfalls als PNG?

Ansonsten klingt das aber nach ner smarten Optimierung, grade bei so gleichmäßig ausgeleuchteten Szenen
War mal MasterQ32, findet den Namen aber mittlerweile ziemlich albern…

Programmiert viel in ⚡️Zig⚡️ und nervt Leute damit.
Benutzeravatar
x1m4
Establishment
Beiträge: 106
Registriert: 02.04.2022, 22:56
Kontaktdaten:

Re: [Projekt] Falling Sand Voxel Engine

Beitrag von x1m4 »

Beim Vergleich kann man wenn man genau hinschaut sehen, dass die Kanten mit dem Checkboard Upscaling ein bisschen smoother sind. Ansonsten konnte ich keinen großen Unterschied feststellen. Vielleicht findest du ja was^^

Hier unkomprimiert:
Bild

Bild
Benutzeravatar
Lord Delvin
Establishment
Beiträge: 574
Registriert: 05.07.2003, 11:17

Re: [Projekt] Falling Sand Voxel Engine

Beitrag von Lord Delvin »

Wenn die Bilder deterministisch sind ist das Differenzbild vermutlich für Menschen leichter zu verarbeiten. Würde erwarten, dass es relativ schwarz ist, bin aber auch nicht gut in sowas. Also einfach abs(l-r) für jeden Kanal.
XML/JSON/EMF in schnell: OGSS
Keine Lust mehr auf C++? Versuche Tyr: Get & Get started
Benutzeravatar
x1m4
Establishment
Beiträge: 106
Registriert: 02.04.2022, 22:56
Kontaktdaten:

Re: [Projekt] Falling Sand Voxel Engine

Beitrag von x1m4 »

Wieder Doppelpost ups --
Zuletzt geändert von x1m4 am 04.07.2022, 18:44, insgesamt 1-mal geändert.
Benutzeravatar
x1m4
Establishment
Beiträge: 106
Registriert: 02.04.2022, 22:56
Kontaktdaten:

Re: [Projekt] Falling Sand Voxel Engine

Beitrag von x1m4 »

Stimmt damit könnte man wahrscheinlich ein sauberes Differenzbild erstellen. Mein Renderer ist aber nur teilweise deterministisch, bzw. eigentlich nur beim temporalen Jittering (über Halton Sequenz) und dem RNG für die stochastische Lichtberechnung (mit TEA - Tiny Encryption Algorithm). Ich denke mal spätestens bei meinem Upscaling und der temporalen Akkumulation geht der Determinismus bei mir futsch, und das umzustellen klingt schmerzhaft.

Hier nochmal ein paar Screenshots von gestern, nachdem ich ein bisschen an den Reglern rumgespielt hab. Wenn ich das Programm endlich mal public machen kann, bin ich wirklich gespannt was ein Designer hier rausholen kann. Meine Design Kenntnisse sind leider sehr begrenzt, gerade bzgl. Farbwahl und genereller Ästhetik. Saubere Sub-voxel Modelle mit ausgewogenen Farben würden solche Szenen um ein vielfaches verbessern.

Bild
Bild
Bild
Bild
Benutzeravatar
x1m4
Establishment
Beiträge: 106
Registriert: 02.04.2022, 22:56
Kontaktdaten:

Re: [Projekt] Falling Sand Voxel Engine

Beitrag von x1m4 »

Noch Bloom wie folgt eingebaut:
Das HDR Bild (ohne Tonemapping, ohne Gamma Korrigierung) wird erst mit bilinearer Filterung und einem Weichzeichner von der original Größe bis auf z.B. 1/8 runter gerechnet. Im Anschluss wird das Verfahren umgekehrt, und von 1/8 wieder auf die originale Größe hoch gerechnet mit einem Schwellwert. Am Ende wird der Bloom dann (wieder mit einem Schwellwert) auf das Bild addiert. Ist relativ schnell das Verfahren und minimiert die üblichen Bloom Probleme wie z.B. flackern und verteilt den Bloom-Effekt auch schön weit (aber subtil) über den Bildschirm.



Bild
Zuletzt geändert von x1m4 am 09.07.2022, 10:48, insgesamt 1-mal geändert.
Mirror
Establishment
Beiträge: 248
Registriert: 25.08.2019, 05:00
Alter Benutzername: gdsWizard
Kontaktdaten:

Re: [Projekt] Falling Sand Voxel Engine

Beitrag von Mirror »

Sieht schon faszinierend aus. Echt cool.
Hat den StormWizard 1.0 und 2.0 verbrochen. http://www.mirrorcad.com
Benutzeravatar
x1m4
Establishment
Beiträge: 106
Registriert: 02.04.2022, 22:56
Kontaktdaten:

Re: [Projekt] Falling Sand Voxel Engine

Beitrag von x1m4 »

Mirror hat geschrieben: 09.07.2022, 00:51 Sieht schon faszinierend aus. Echt cool.
Schön dass es dir gefällt!^^

Eine weitere Szene mit Partikeln:
Benutzeravatar
Chromanoid
Moderator
Beiträge: 4254
Registriert: 16.10.2002, 19:39
Echter Name: Christian Kulenkampff
Wohnort: Lüneburg

Re: [Projekt] Falling Sand Voxel Engine

Beitrag von Chromanoid »

Sieht richtig cool aus.
Benutzeravatar
x1m4
Establishment
Beiträge: 106
Registriert: 02.04.2022, 22:56
Kontaktdaten:

Re: [Projekt] Falling Sand Voxel Engine

Beitrag von x1m4 »

Chromanoid hat geschrieben: 12.07.2022, 08:06 Sieht richtig cool aus.
Thx!

Hier ein kleines Video das zeigt, wie meine Schaltungen funktionieren:

Benutzeravatar
x1m4
Establishment
Beiträge: 106
Registriert: 02.04.2022, 22:56
Kontaktdaten:

Re: [Projekt] Falling Sand Voxel Engine

Beitrag von x1m4 »

Das Projekt hat jetzt eine Webseite! :)
Benutzeravatar
x1m4
Establishment
Beiträge: 106
Registriert: 02.04.2022, 22:56
Kontaktdaten:

Re: [Projekt] Falling Sand Voxel Engine

Beitrag von x1m4 »

Ein Nutzer hat einen sehr kompakten 7 Segment Display und eine kleine Casino Gamble Maschine gebaut:
- 7 Segment Display
- Gamble Maschine
Benutzeravatar
x1m4
Establishment
Beiträge: 106
Registriert: 02.04.2022, 22:56
Kontaktdaten:

Re: [Projekt] Falling Sand Voxel Engine

Beitrag von x1m4 »

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:
Bild
Bild
Bild
Bild
Bild
Bild
Benutzeravatar
Schrompf
Moderator
Beiträge: 4838
Registriert: 25.02.2009, 23:44
Benutzertext: Lernt nur selten dazu
Echter Name: Thomas Ziegenhagen
Wohnort: Dresden
Kontaktdaten:

Re: [Projekt] Falling Sand Voxel Engine

Beitrag von Schrompf »

Sehr cool! Hab Deine Ausführungen zum Licht mit großem Interesse genossen. Und ja, ein World Space Cache drängt sich bei so regelmäßigen Strukturen wie Voxeln ja regelrecht auf. Das Ding zu kaskadieren ist ein feiner Trick für große Szenen, und ich glaube, alle Engines dieser Welt lassen irgendwann das clear() weg und mischen die Ergebnisse über mehrere Frames. Und damit kriegst Du quasi aus Versehen Infinite Bounces. Trotzdem isses ne enorme Leistung, das alles implementiert zu kriegen und stabil und cornercase-arm.

Ich wundere mich noch über die Spherical Harmonics. 2nd order waren 9 Werte? Ich würde ja vermuten, dass bei Deinen perfekten Würfeln überall 4 Werte reichen würden: Base, XGradient, YGradient, ZGradient. Aber vielleicht verwechsel ich da auch was.
Früher mal Dreamworlds. Früher mal Open Asset Import Library. Heutzutage nur noch so rumwursteln.
Benutzeravatar
x1m4
Establishment
Beiträge: 106
Registriert: 02.04.2022, 22:56
Kontaktdaten:

Re: [Projekt] Falling Sand Voxel Engine

Beitrag von x1m4 »

Danke für das Interesse!

Ja sind 9 Werte, ich verwende pro Kaskade 3x RGBA16F Texturen (und nochmal mal 2 wegen double buffering) mit einer Größe von 128^3. Der Vorläufer der Technik nannte sich glaube ich Ambient Cubes, wo man das Licht fix pro Voxel Seite (also für 6 Richtungen) speichert. Ist vom Speicher her aber teuer und die Richtung vom Licht wird reduziert. Im obersten Screenshot kann man sehen, dass die Schatten der Trapdoors schräg sind, was mit Ambient Cubes denke ich schwierig wäre? Hab über Ambient Cubes aber bisher nur gelesen und nie damit gearbeitet.

Bin auch am überlegen 3rd Order SH für die erste Kaskade zu verwenden, um nochmal ein paar extra Details in der Nähe raus zu kitzeln.
Zuletzt geändert von x1m4 am 20.04.2023, 14:25, insgesamt 1-mal geändert.
joeydee
Establishment
Beiträge: 1039
Registriert: 23.04.2003, 15:29
Kontaktdaten:

Re: [Projekt] Falling Sand Voxel Engine

Beitrag von joeydee »

Sehr schön, Glückwunsch!
@Schrompf: Du brauchst für Cubesamples 6 Werte (1 für jede Richtung, also 2 je Achse), da du ja rundum richtungsabhängige Infos brauchst. ein Gradient reicht nicht, von a nach b ist nicht der umgekehrte Energietransport durch den Raum wie von b nach a.

Trotzdem, Cubesamples statt SH kann man auch grundsätzlich für Nicht-Würfel-Welten nutzen, also der Normal-Lookup funktioniert genauso weich wie bei SH. Ich nehme so ein Cubesample z.B. standardmäßig für meine Debug-Szenenbeleuchtung, aber nur als einzelnen globalen diffusen Light-Lookup. Wirkt auch in dieser einfachsten Form deutlich angenehmer (und lesbarer) als ein Standard NdotL Diffuse+Ambient.

SHs haben übrigens einen geringeren Fehler (Input vs. Output), also sobald es an Light-/Energietransport und Bounces geht, weiß ich nicht ob man sich da mit Cubesamples im Ergebnis wirklich einen Gefallen tut, müsste man mal ausprobieren und vergleichen.
Benutzeravatar
Schrompf
Moderator
Beiträge: 4838
Registriert: 25.02.2009, 23:44
Benutzertext: Lernt nur selten dazu
Echter Name: Thomas Ziegenhagen
Wohnort: Dresden
Kontaktdaten:

Re: [Projekt] Falling Sand Voxel Engine

Beitrag von Schrompf »

Nur mit 4 Werten hast Du nicht darstellbare Werte, also potentiell Verlust, klar. Aber unmöglich ist es nicht, auch mit ner 2nd Order SH hast Du noch bissl Verluste. Schrägen funktionieren schon, sind ja die Strahlen in alle Richtungen, die dann stochastisch mal die Trapdoor treffen und mal nicht. Du samplest die Lichtverteilung dann halt nur in genau 6 Richtungen, alle Winkel dazwischen brauchst Du nicht.

Nuja, war nur bissl formlos gegrübelt. Du hast da ja auch keine Not, Speicher zu sparen oder so, 48 Byte pro Sample bei 128^3 frisst jetzt nicht mehr die GPU auf wie vor Jahren noch.
Früher mal Dreamworlds. Früher mal Open Asset Import Library. Heutzutage nur noch so rumwursteln.
Antworten