Voxelrendering beschleunigen
Verfasst: 10.11.2013, 18:07
Hallo zusammen,
ich hatte am Wochenende Lust etwas mit Voxeln zu spielen. Das ganze Testprogramm war ziemlich schnell zusammengebaut. Die Welt wird aus einer Heightmap erstellt (256x256). Ich verwende eine Chunkgröße von 32x32x32 Blocks. Für jeden Block wird die Farbe, Position sowie 1 Byte mit aktiv/inaktiv, sowie jeder aktiven Seite des darzustellenden Würfels gespeichert. Die Aktiven Würfel werden im Indexbuffer gespeichert. Texturen habe ich erstmal außen vorgelassen.
Gerendert wird dann als Pointlist im Geometryshader, der alle Blockinformationen bekommt und daraus dann die Würfel abhängig von den sichtbaren Seiten zusammenstellt.
Eigentlich funktioniert das schon ganz gut, aber die Performance stimmt noch nicht. Wenn alle Chunks dargestellt werden bricht die Framerate auf 56-60fps ein. Der Geometryshader scheint nicht der Bottleneck zu sein, da sich die Framerate auch nicht ändert, wenn ich nur 1 Seite der Würfel darstellen lasse.
Zum Vergleich: Die gleiche Map als Heightmap als normale Heightmap per Geometryshader und jeweils 4 Dreiecken pro Heightmap-Punkt rendert meine Grafikkarte auf 300fps. Und Minecraft im Vergleich läuft mit Standardrendering ohne Geometryshader auf konstant 90fps und da wird nicht nur allein gerendert.
Folgende Optimierungen habe ich bereits implementiert:
- Hiddenfaces entfernen für alle komplett umschlossenen Blöcke
- Hiddenfaces entfernt an den Chunkgrenzen, wenn 2 Chunks aneinander stoßen
- Frustumculling für Chunks
Ich hatte noch überlegt, ein Occlusion Culling einzubauen und dafür immer einen inneren Würfel pro Chunk zu berechnen, der immer komplett von den aktiven Chunkblöcken umschlossen ist. Nur ob das soviel bringt weiß ich auch nicht.
Hat jemand noch Ideen oder Quellen, wie man das Rendering beschleunigen kann?
ich hatte am Wochenende Lust etwas mit Voxeln zu spielen. Das ganze Testprogramm war ziemlich schnell zusammengebaut. Die Welt wird aus einer Heightmap erstellt (256x256). Ich verwende eine Chunkgröße von 32x32x32 Blocks. Für jeden Block wird die Farbe, Position sowie 1 Byte mit aktiv/inaktiv, sowie jeder aktiven Seite des darzustellenden Würfels gespeichert. Die Aktiven Würfel werden im Indexbuffer gespeichert. Texturen habe ich erstmal außen vorgelassen.
Gerendert wird dann als Pointlist im Geometryshader, der alle Blockinformationen bekommt und daraus dann die Würfel abhängig von den sichtbaren Seiten zusammenstellt.
Eigentlich funktioniert das schon ganz gut, aber die Performance stimmt noch nicht. Wenn alle Chunks dargestellt werden bricht die Framerate auf 56-60fps ein. Der Geometryshader scheint nicht der Bottleneck zu sein, da sich die Framerate auch nicht ändert, wenn ich nur 1 Seite der Würfel darstellen lasse.
Zum Vergleich: Die gleiche Map als Heightmap als normale Heightmap per Geometryshader und jeweils 4 Dreiecken pro Heightmap-Punkt rendert meine Grafikkarte auf 300fps. Und Minecraft im Vergleich läuft mit Standardrendering ohne Geometryshader auf konstant 90fps und da wird nicht nur allein gerendert.
Folgende Optimierungen habe ich bereits implementiert:
- Hiddenfaces entfernen für alle komplett umschlossenen Blöcke
- Hiddenfaces entfernt an den Chunkgrenzen, wenn 2 Chunks aneinander stoßen
- Frustumculling für Chunks
Ich hatte noch überlegt, ein Occlusion Culling einzubauen und dafür immer einen inneren Würfel pro Chunk zu berechnen, der immer komplett von den aktiven Chunkblöcken umschlossen ist. Nur ob das soviel bringt weiß ich auch nicht.
Hat jemand noch Ideen oder Quellen, wie man das Rendering beschleunigen kann?