Sparse Voxel Octree Raytracer

Übersicht Sonstiges Smalltalk

Neue Antwort erstellen

Noobody

Betreff: Sparse Voxel Octree Raytracer

BeitragMo, Apr 11, 2011 19:22
Antworten mit Zitat
Benutzer-Profile anzeigen
In den letzten paar Monaten habe ich mich ein wenig mit Sparse Voxel Octrees (SVOs) beschäftigt und eine kleine Implementation davon in BMax geschrieben. Da ich aber wieder einmal feststellen musste, dass der Threaded Modus in BMax sehr sehr langsam ist, schrieb ich die ganze Sache von Grund auf in C++ neu. Darum steht dieser Post jetzt im Smalltalk und nicht im Projekte-Forum Razz

SVOs sind eine Datenstruktur, die es erlaubt, Voxeldaten zum einen stark zu komprimieren und zum anderen effizient zu rendern. Das ganze funktioniert so, dass die Daten anfangs in einen Octree gespeichert werden, wobei nur die Knoten gespeichert werden, die Voxel enthalten, welche an der Oberfläche des Modells liegen. Das macht das Raytracen nachher um einiges komplizierter, aber auch schneller, da die leeren (und daher uninteressanten) Teile des Modells übersprungen werden können.

SVOs werden in der nächsten id Tech 6 verwendet, sind also definitiv einen Blick wert. Die Speicherprobleme, die man früher mit Voxeln hatte, wurden praktisch gelöst (mit SVOs konnte ich ein 5.6GB Modell in einen 73MB Octree quetschen) und rendern geht jetzt auch schon mehr oder weniger in Echtzeit. Ich vermute daher mal stark, dass man von Voxeln in Spielen in nächster Zeit mehr sehen wird Razz

Wie dem auch sei, hier ist meine Implementation:

Screenshots:

user posted image

Beispiel eines Octrees
Konvertierungsablauf von Voxeldaten zu Octree

Video:

user posted image

Download (Windows): Link (11.7MB)
Bedienung wird in der ReadMe.txt erklärt.

Das ganze wurde, wie bereits erwähnt, in C++ geschrieben und läuft ohne GPU-Beschleunigung. Dank Multithreading läuft es aber (zumindest auf meiner Maschine) noch in Echtzeit mit 30-60FPS. Es hilft also definitiv, wenn ihr einen Multicore-Prozessor verwendet.
Man is the best computer we can put aboard a spacecraft ... and the only one that can be mass produced with unskilled labor. -- Wernher von Braun

ZaP

BeitragMo, Apr 11, 2011 22:38
Antworten mit Zitat
Benutzer-Profile anzeigen
Auf meinem soliden, alten Doppelkern AMD leider nur echtzeitfähig, wenn ich nicht heranzoome, aber definitv ein tolles Ergebnis.
Wie stellen die sich das bei ID eigentlich vor, dass man komplexe Voxelszenerien rendern soll? Vielleicht bringen die die GPU noch mit ins Spiel?
Starfare: Worklog, Website (download)

Xaron

BeitragDi, Apr 12, 2011 6:37
Antworten mit Zitat
Benutzer-Profile anzeigen
Wow cool! Also bei uns in der Firma läuft das Voxel-Rendern komplett auf der GPU. Aber meinen allergrössten Respekt, das ist wirklich tolle Arbeit!
Cerberus X - Monkey X Reloaded!

gameworx

BeitragDi, Apr 12, 2011 20:13
Antworten mit Zitat
Benutzer-Profile anzeigen
Ist sehr interessant. Aber in einem Spiel kann ich mir das nur sehr schwer vorstellen. Wie stellt man Materialien und Oberflächen (Texturen) dar? Kannst du dafür auch ein Beispiel bringen? Wie muss ich mir eigentlich die Erstellung von 3D Modellen vorstellen? Statt mit vertexes und triangles knete ich das Modell wie bei Zbrush aus einem Haufen? Und wie kann man Animationen realisieren? Habe mich nie mit dem Thema befasst. Embarassed

Wäre die Darstellung einer komplexen Spielszene mit dieser Technik überhaupt in Echtzeit möglich?

Welche Vorteile bringt die Voxeltechnik?

Aber gut ausschauen tut es definitiv.
AMD Athlon II X3 440 (3 GHz), 4GB Ram, ATI Radeon HD 5450, Win 7

Noobody

BeitragDi, Apr 12, 2011 23:16
Antworten mit Zitat
Benutzer-Profile anzeigen
Zitat:
Wie stellt man Materialien und Oberflächen (Texturen) dar?

Jedes Voxel besitzt eine individuelle Farbe, ist also kein Problem. Da die Modelle, für die meine Implementation ausgelegt ist, aber sowieso keine Farbe besitzen, habe ich das bei mir nicht eingebaut.

Zitat:
Wie muss ich mir eigentlich die Erstellung von 3D Modellen vorstellen?

Das kommt natürlich auf die verwendete Software an, aber die Programme, die ich kenne, funktionieren ähnlich wie ZBrush. Ist natürlich um einiges einfacher, da man sich um die Topologie gar nicht erst scheren muss und einfach drauflos arbeiten kann Razz

Zitat:
Und wie kann man Animationen realisieren?

Animationen (und generell Meshdeformation) sind im Moment noch der grosse Knackpunkt am Ganzen. Bewegende Objekte etc. sind ja kein Problem, aber wenn man komplexeres wie etwa Skinning hinzunimmt, kommt man schnell an die Grenzen des momentan machbaren. Es gibt ein Paper über "Animated SVOs", allerdings habe ich das noch nicht gelesen und weiss nicht, wie praktikabel der Ansatz ist.

Was aber noch am ehesten machbar ist (und auch in der id Tech 6 geplant ist), wäre ein Hybrid aus Polygon/Voxel-Techniken, bei der Voxel für die Levels und andere Objekte ohne Animation verwendet werden, aber Polygone für Charakter o.ä.

Zitat:
Wäre die Darstellung einer komplexen Spielszene mit dieser Technik überhaupt in Echtzeit möglich?

Durchaus, ja. Man muss sehen, dass meine Implementation auf keinen Fall optimal ist - sie läuft nur auf der CPU und implementiert knapp mal die Hälfte der vorgeschlagenen Features für SVOs, mit welchen man das Rendering um einiges schneller machen könnte (die liess ich hauptsächlich aus, um die Grösse des Octrees klein zu halten).

Eine GPU-Implementation, die von Leuten geschrieben wird, die tatsächlich etwas von der Materie verstehen, sollte einiges mehr zustandebringen (Voxelstein ist da interessant - auch wenn dort der "würfelige" Look beibehalten wurde, den man eigentlich beheben könnte). Siehe auch die SIGGRAPH-Demo, die sehr cool aussieht.

Zitat:
Welche Vorteile bringt die Voxeltechnik?

Praktisch kostenlos viel Detail. Was mich immer wieder erstaunt hat bei der Programmierung war, dass die Grösse oder Komplexität des Voxelmodells gar keinen Einfluss hatte auf die Renderzeit. Ein 8192^3-Modell rendert praktisch gleich schnell wie ein 512^3-Modell, währenddem es einen deftigen Unterschied macht, ob man 30 Millionen oder 300 Dreiecke zeichnet Razz Das heisst, dass Künstler nun freie Hand dabei haben, wie detailliert die Spiellandschaften werden, ohne dass sie von Polygonzahlen begrenzt werden.

Es gibt auch noch andere Gründe, unter anderem das immer grösser werdende Aliasingproblem bei den heutigen Spielen, welches bei SVOs nicht vorkommt, und auch kostenloses LOD bei SVOs, was es erlaubt, bei begrenztem Speicher die Details der Modelle sehr genau zu steuern. Ausserdem ist mit SVOs das kontinuierliche nachstreamen von Modelldaten sehr einfach umzusetzen.

Da man all das mit einem einzigen Algorithmus bekommt, ist es natürlich verlockend, darauf umzusteigen. Es wird sich zeigen, ob die Kosten des Umstiegs nicht den Ertrag übersteigen, aber ich bin gespannt.
Man is the best computer we can put aboard a spacecraft ... and the only one that can be mass produced with unskilled labor. -- Wernher von Braun

BtbN

BeitragMi, Apr 13, 2011 13:24
Antworten mit Zitat
Benutzer-Profile anzeigen
Wenn rausgezoomt läuft es flüssig, aber sobald ich reinzoome ruckelt es wie sau. Und es nutzt dabei nur ca. 20% meiner CPU aus.
Ich hab nen AMD 6-Kerner, auf 4GHz übertaktet. Da sollte also eigentlich wesentlich mehr drin sein.

Aber ansonsten sieht das echt nett aus.

Jo0oker

BeitragMi, Apr 13, 2011 15:31
Antworten mit Zitat
Benutzer-Profile anzeigen
Ein Implementation mit OpenCL wäre mal sehr interessant, vorallem die Untershiede in der Performance.


Aber auf jedenfall sehr schick!

lg Jo0oker
Tehadon, das kostenlose 3D RPG
www.tehadon.de
http://www.blitzforum.de/worklogs/14/
Das Abenteuer wird beginnen!

gameworx

BeitragDo, Apr 14, 2011 7:29
Antworten mit Zitat
Benutzer-Profile anzeigen
Vielen Dank für die ausführliche Erklärung. Damit kann ich doch was anfangen. Smile

Soweit ich mich erinnern kann, basierten die Spiele von Novalogic (Commanche, Delta Force, Armored Fist) seinerzeit auf einer Voxel-Engine, um die Landschaft darzustellen. Wie lange ist das jetzt her? 10-15 Jahre? Hat sich aber irgendwie nicht durchgesetzt. Kann man die Technik von damals noch mit der heutigen vergleichen?
AMD Athlon II X3 440 (3 GHz), 4GB Ram, ATI Radeon HD 5450, Win 7

Noobody

BeitragDo, Apr 14, 2011 16:26
Antworten mit Zitat
Benutzer-Profile anzeigen
Man nannte es damals zwar "Voxel Raymarching", aber mit Voxeln hatte das nicht wirklich was zu tun (mehr damit, dass sich Fachbegriffe auf der Verpackung gut machen Very Happy ).

Was da eigentlich gemacht wurde, war, eine gewöhnliche zweidimensionale Heightmap auf den Bildschirm zu zeichnen, ohne das ganze mit Polygonen umzusetzen. Das wird heute nicht mehr gemacht, da Heightmaps zum einen nicht mehr ganz so viel Anwendung finden (Meshterrains sind scheinbar "in" im Moment) und zum anderen die GPU heute eh Millionen von Dreiecken in Echtzeit rendern kann, dass sich Raymarching gar nicht mehr lohnt.

Es ist trotzdem aber noch lustig und einfach zu programmieren. Ich stellte eine BB-Version vor einer Weile ins Codearchiv, aber just gestern schrieb ich eine neue C++ Version, die mit Interpolation und Multithreading schneller läuft und hübscher aussieht. Wenn du willst, kannst du dir das hier runterladen.

Du wirst sofort merken, dass es extrem viel schneller läuft als die "echte" Voxelimplementation, obwohl noch interpoliert und texturiert wird. Es ist halt immer noch 2D und nicht 3D.

Hier noch ein kleiner Screenshot davon:
user posted image
Man is the best computer we can put aboard a spacecraft ... and the only one that can be mass produced with unskilled labor. -- Wernher von Braun

Neue Antwort erstellen


Übersicht Sonstiges Smalltalk

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group