Jump to content
Unity Insider Forum

Voxel Engine


Tiwaz
 Share

Recommended Posts

Moin Leute,

 

nachdem ich jetzt hoffentlich endlich meinen Durchbruch beim LOD hatte, möchte ich euch gerne meine Voxel Engine vorstellen - das war so mein eigenes kleines Ziel das ich erfüllen wollte bevor ich es vorstelle :)

 

Das Projekt gibt es übrigens mittlerweile schon seit über 1 Jahr (die 1. Version ist vom 28. Juli 2015 :D), damals habe ich mich erst mal in Boxel (Minecraft-Style) eingearbeitet, um überhaupt in das Thema zu finden und mich dann über Marching Cubes zum Dual Contouring gehangelt.

Zwischenzeitig habe ich auch noch die Datenstruktur der Chunks von 3D-Arrays auf Octrees umgestellt - was Anfangs auch erst mal gedauert hat die zum Laufen zu bringen - und mich generell vorwiegend belesen, altes verworfen, neues hinzugefügt, etc.

Im November letzten Jahres dann (wow.. das ist jetzt auch schon wieder knapp 11 Monate her) musste ich das Projekt wegen allgemeinem Uni-Stress pausieren und das bis vor kurzem, denn bis auf ein paar wenige und sehr kurze Phasen in denen ich Zeit hatte - wobei der Großteil davon erst mal drauf gegangen ist mich wieder in das Thema einzuarbeiten - hab ich nicht viel daran schreiben können.

 

Jedenfalls freut es mich jetzt natürlich umso mehr euch jetzt ein paar Bilder davon präsentieren zu können ^^

Das ganze befindet sich nach wie vor in einer sehr frühen Version, bis dato ist tatsächlich nur das Generieren des Terrains möglich und die Meshes sind auch noch untexturiert etc.

Dafür klappt es 2D und 3D Meshes zu generieren und die Generierung des Octrees und Meshes sind Multithreading-fähig, wobei ich noch am überlegen bin, ob und wie ich die Octreegenerierung (samt Densityberechnung) auf die GPU auslagere.

 

post-3240-0-25413000-1476381425_thumb.pngpost-3240-0-30757700-1476381303_thumb.png

Das ganze läuft übrigens mit diesen Stats:

post-3240-0-55355500-1476381441_thumb.png

Insgesamt werden übrigens ~44k Triangles generiert und das Terrain bietet eine Sichtweite von 256m. Ist zwar nicht wirklich viel aber es ist ja auch nur bedingt optimiert und Singlethreaded (obwohl es multithreadingfähig wäre, dann geht das in einem Bruchteil der Zeit ^^)

@edit:

Achja, kurze Erklärung:

Die Generation Time ist wie lange es dauert die Octrees zu generieren, die Update Time ist das Meshing (sollte ich vllt mal umbenennen) und die Buffer Time ist das Befüllen des Density Buffers ^^

Mein Laptop hat übrigens einen 2.4GHz Quad-Core Prozessor, 16GB DDR4 RAM und eine Nvidia GeForce GTX 675MX mit 4GB GDDR5 Grafikspeicher, falls es jemanden interessiert bzw. um die Zeiten/Rechenaufwand einschätzen zu können.. ^^

 

Bin auch sehr froh darüber, dass der Algorithmus nicht auf restricted Octrees beschränkt ist, d.h. es ist vollkommen egal, um wie viele Auflösungsstufen sich die benachbarten Chunks unterscheiden, es klappt :)

post-3240-0-46380100-1476380971_thumb.png

 

Hier mal noch ein kleines Bild mit 3D Terrain (kein besonders tolles):

post-3240-0-82770700-1476381210_thumb.png

 

 

Ich weiß ehrlich gesagt noch nicht woran ich mich als nächstes wage. Wahrscheinlich überarbeite ich das LOD System noch ein paar Mal, damit das auch wirklich 100%ig klappt und nichts unnötig berechnet wird.

Ich würde dann demnächst gerne mal einen vernünftigen Worldgenerator basteln (also, dass das Terrain auch nach was aussieht, verschiedene Materialien hat, etc..), aber ich glaube das wird auch wieder ein eher langwieriger Prozess, da bastel ich wohl immer mal wieder dran.

Auf der Liste steht auf jeden Fall noch so einiges, da hab ich noch sehr lange was zu tun und ich hoffe, dass ich demnächst öfter mal ein paar weitere Errungenschaften präsentieren kann, warne aber schon mal vor, dass sich das wohl sehr zieht :D

 

Tiwaz

Edited by Tiwaz
  • Like 7
Link to comment
Share on other sites

16³ aber falls ich die Densityberechnung und Octreegenerierung auf die GPU auslagere werd ich auch mal 32³ probieren.

Was ich auch noch möglichst zeitnah versuchen möchte umzusetzen sind "GeoMips" (kA ob es den Term in dem Bereich gibt, der Begriff ist aus dem Transvoxel-Skript entnommen). Also, dass mehrere Chunks in einen größeren Octree zusammengefasst werden, sodass ein Chunk immer 16³ Voxel hat. Ist die Voxelgröße höher (weil höheres LOD) dann wird eben auch der Chunk größer.

Die meiste "Runtime-Performance" geht bei mir nämlich durch die Vielzahl der Chunks drauf, die dauernd updaten und die Distance checken etc. Da könnte ich vllt auch generell noch eine schönere Methode finden.

 

Finde das hier so krass:

The problem in using a global simulation is speed. Picking the right evaluation structure is paramount. I wanted to produce maps of approximately 2000x2000 pixels, where each pixel would cover around 2 km. I wanted this process to run in less than five seconds for a single CPU thread. Running the generation algorithm over pixels would not get me there.

https://procworld.bl...is-destiny.html

Das würde ich auch gerne mal schaffen ^^

Generell ein sehr cooler Blog finde ich.

Momentan brauche ich für ein Terrain mit 2km Sichtweite 21 Sekunden :/ (falls das in dem Artikel gemeint ist? 2km² sind denke ich nicht gemeint.. ^^)

 

@edit:

Die Zeit pro Chunk ist beim LOD aber auch nur eine Hausnummer.. Je mehr niedrig aufgelöste Chunks da sind, desto stärker wird die Per-Chunk Zeit runtergezogen, weil's nur eine Durchschnittsrechnung ist.

Zumal ich noch keine QEF hab, es wird ja noch nicht texturiert, etc. Da werd ich wohl früher oder später noch einiges an Performance einbüßen erst mal.

Und eventuell auch generell noch mehr berechnen muss um die LOD Stufen auch beim rumlatschen anständig blenden zu können ^^

Weiß noch nicht wie sich das noch entwickeln wird.

Edited by Tiwaz
  • Like 1
Link to comment
Share on other sites

Kleines Update:

Ich hab dummerweise durch einen kleinen Denkfehler eine Methode "korrigiert", wodurch das ganze deutlich langsamer gelaufen ist. Vor allem ohne LOD ging alles extrem langsam. Habe den mal korrigiert und brauche jetzt nur noch 2.25ms pro Chunk bei den gleichen Settings. Das mag nicht nach wirklich viel ausschauen aber es sind immerhin 25% ^^

Ohne LOD übrigens bis zu 64%.

 

Btw lasse ich übrigens immer alles im Editor laufen, also alle Werte die ich so erreiche sind auf den Editor-Betrieb bezogen.

Im Build ist das eine ganze Ecke schneller (Single-Threaded versteht sich):

post-3240-0-32919600-1476640957_thumb.png

Wie man sieht werden mehr Chunks generiert, das liegt daran, dass ich den Seed der vorherigen Welt nicht mehr weiß, aber Zeit technisch nehmen sich die Welten alle nicht so viel.

 

Gestern und heute hab ich ein bisschen mit Compute Shadern experimentiert. Hab es schon mal geschafft einen CS anzusprechen und Daten in und aus dem Buffer rein bzw. heraus zu kriegen. Sehr interessant auf jeden Fall, da werd ich wohl noch ein bisschen weiter rumtüffteln, aber weniger im Rahmen der Engine. Da will ich tatsächlich ganz gerne ohne die GPU auskommen, da ComputeShader ja DX11-only sind und ich die Engine nicht so stark einschränken will ^^

Muss ja auch ohne sie gehen.. wie man an manchen Beispielen sieht ;)

 

@edit:

Oh man ich Pfosten hab die Buffer Time nie zur Total Time gerechnet, wodurch auch die Per Chunk Time nicht korrekt war..

Da die Buffer Time nie wirklich zu Buche geschlagen hat, hab ich das einfach nicht bemerkt, aber hab jetzt mal ein riiesen Terrain generieren lassen und da war des dann doch ein Unterschied..

Es sind also tatsächlich nicht 2.25ms pro Chunk sondern 3.25ms.. Naja, wie gewonnen so zerronnen ^^

Edited by Tiwaz
  • Like 2
Link to comment
Share on other sites

  • 1 month later...

Moin moin,

 

es gibt eine Neuigkeit, bei der ich sehr froh bin, dass ich sie verkünden kann :)

Ich habe die letzten Wochen meine Freizeit dazu genutzt meine VoxelEngine in einem C++ Plugin neu zu schreiben und heute gelang es mir die letzten (gravierenden) Bugs raus zu fixen.

Bin jetzt annähernd auf dem Stand wie mit meiner Original C# Implementierung, kann aber noch nicht Multithreaden (da muss ich mir noch überlegen wo/wie genau ich da Threads anlege), aber das Generieren und Meshen klappt und sogar LOD funktioniert ohne weiteres zutun (worüber ich mich echt freue, da wäre wieder mega ätzend gewesen wahrscheinlich ^^)

 

Mich hat es ja schon bevor ich richtig damit angefangen hab total interessiert wie sich dann die Performance gegenüber der C# Implementierung verhalten wird.

Hab ich natürlich sofort getestet und ich bin eigentlich recht zufrieden :)

Für ein Terrain mit 24 Chunks Sichtweite (also Durchmesser 768m) brauche ich mit dem C# Code etwa 36 Sekunden (ohne LOD und Singlethreaded), das C++ Plugin braucht dafür grade mal 13 Sekunden :)

Als sehr positiven Nebeneffekt spart der C++ Code etwa 35% RAM ein (ich denke das liegt wohl daran, dass ich durch Pointer viel Overhead einsparen kann, aber kA)

 

Die 36 Sekunden kommen übrigens im Build raus, also nicht im Editor sprich ohne Debug Optionen, etc

Im Editor dauert es etwa 118 Sekunden aber die kann man nicht gegen eine compiler-optimierte, kompilierte DLL vergleichen ^^

 

Mir ist auch aufgefallen, dass ich den Density Buffer unnötigerweise im Vorfeld schon initialisiere, das hab ich jetzt weggelassen, wodurch jetzt ein bisschen Komplexität wegfällt und angenehmerweise die Performance ein kleines bisschen steigt.

 

Ich glaub das war's dann aber auch schon wieder, hab leider nicht so viel Zeit wie ich gerne hätte, weil die Uni auch immer präsent ist ^^

Aber ist finde ich trotzdem ganz oke, ich hab das C++ Plugin jetzt eigentlich auf 3 Wochen auf fast den gleichen Stand gebracht wie die "Original-Engine" und das obwohl ich quasi keine Ahnung von C++ hatte :D

Aber soweit ich das beurteilen kann ist die Codequalität trotzdem ganz gut. Zumindest hab ich versucht möglichst "modernes" Standard C++ zu benutzen, also mit smart-pointer, etc

 

Ich hoffe ich kann demnächst mal wieder öfter was vorstellen und hoffentlich auch ein paar Grafiken posten :)

  • Like 5
Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
 Share

×
×
  • Create New...