Computers

Voxel-Leistung

Autor: Laura McKinney
Erstelldatum: 3 April 2021
Aktualisierungsdatum: 18 November 2024
Anonim
Was sind Voxel? Phil erklärt / PCGH Raw & Uncut
Video: Was sind Voxel? Phil erklärt / PCGH Raw & Uncut

Inhalt

Charles ist ein Software-Ingenieur und College-Professor, der sich für Technologie, Medizin, Wirtschaft und Ernährung interessiert.

Voxel-Problem

Dieses Projekt begann, als ich aus Voxeln Kreaturen, Gegenstände und Landschaften machen wollte. Ich mochte die Idee von Voxeln, weil sie verwendet werden können, um Objekte auf intuitive Weise aufzubauen und zu zerlegen. Die Probleme waren Geschwindigkeit, Speichernutzung und mangelnde Standardisierung.

Ich wusste, dass ich mein eigenes Voxel-Paket schreiben musste, also machte ich eine kurze Übersicht über einige kostenlose und bezahlte Assets for Unity. Die meisten von ihnen wichen jeglicher Verantwortung für die Leistung aus und waren dafür geeignet, einige Zehntausende von Voxeln in einer Spielszene so zu verwenden, wie Sie Partikeleffekte verwenden könnten. Ich wollte Voxel als Kernspielmechanik verwenden.

Selbst mit aufgeblähten Klassen, die für einzelne Voxel verwendet werden, verfügen moderne PCs über so viel RAM, dass dies fast kein Problem darstellt. Das größte Problem war die Geschwindigkeit.


Analyse

Die Profilerstellung zeigte, dass die Umwandlung eines Voxelstücks in ein Dreiecksnetz über 90% der Laufzeit in Anspruch nahm. Das schnelle Erstellen großer Voxelkarten war eine einfache Sache, bei der Aufrufe der Perlin-Rauschfunktion wiederverwendet wurden. Nach der Konvertierung in Netze funktioniert ein Voxel-Volume ähnlich wie jedes andere Objekt.

Das Konvertieren von Chunks kann problemlos parallel erfolgen, aber mit acht Threads war die Leistung immer noch nicht zufriedenstellend. Die Verwendung eines Geometrie-Shaders zur direkteren Anzeige von Voxeln war keine Hilfe und begann mit Volumina von nur wenigen Millionen Voxeln ernsthaft zu verzögern. Das Senden von nur Oberflächenvoxeln an den Shader gab das Problem an die CPU-Threads zurück. Die CPU-Leistung ist für Updates ausreichend, jedoch nicht für die anfänglichen massiven Volumes, die für die zufällige Kartengenerierung erforderlich sind.

Lösung

Die Verwendung einer Reihe von Compute Shader-Kerneln zum Erstellen und Komprimieren von Karten zu einer Reihe sichtbarer Voxel erwies sich als zufriedenstellende Lösung. Ein Geometry Shader kann einen GPU-Puffer akzeptieren, der das Array enthält, um zu vermeiden, dass vor der ersten Anzeige in und aus dem Hauptsystem-RAM kopiert werden muss.


In dem Unity Asset, das ich geschrieben habe, um diesen Prozess zu implementieren und zu testen, habe ich mich für Cube-Voxel-Chunks 256 auf jeder Seite entschieden, die ein Byte pro Voxel verwenden. Das Senden eines Blocks an oder von der GPU würde auf einem neueren PCIe-Bus weniger als eine Sekunde dauern, ist aber immer noch viel zu langsam. Durch die Kartenerstellung und die anfängliche Anzeige vollständig auf der Grafikkarte wird die CPU für andere Szeneneinstellungen freigegeben, und Voxel-Rohdaten können nach Bedarf (wenn überhaupt) übertragen werden.

Performance

Die Geschwindigkeit der Compute- und Geometry-Shader hängt von der Hardware ab. Eine integrierte GPU benötigt jedoch etwa eine Drittelsekunde pro Block. Das Konvertieren in ein Netz dauert etwas länger und benötigt mehr Speicher. Das Konvertieren in Unity TerrainData ist sehr schnell, speichert jedoch nur eine Höhenkarte.

Sechzehn Millionen Voxel (256 x 256 x 256) in einem Block belegen 16 MB. Oberflächenvoxel haben normalerweise eine Größe von 512 KB (128 KB x 4 Byte) für jeden zur Anzeige bereitgestellten Block.

Stresstest

Dies ist ein Fraktal, das manchmal zum Stresstest von Voxelbibliotheken verwendet wird, da es keine versteckten Voxel enthält. Das heißt, jedes Voxel hat aus einem bestimmten Winkel mindestens eine sichtbare Fläche. Das Gesamtvolumen beträgt 14,3 Millionen (243 x 243 x 243), mit 3,2 Millionen festen Voxeln.


Bei Verwendung einer integrierten GPU variiert der FPS zwischen 5 und 9, wenn sich die Kamera um und durch das Objekt bewegt.

Demonstrationen

Das Geländedemonstrationsvideo zeigt ein Raster von 16 Blöcken mit allen zur Laufzeit generierten Daten. Gegen Ende können Sie die gesamte 1024x1024-Karte sehen. Sogar ein 256x256-Voxelbereich könnte eine Spielszene sein, aber mit diesem Asset können viel größere Szenen generiert und aktiv gehalten werden, ohne die CPU und den Hauptspeicher zu beeinträchtigen.

Implementierung: Geometry Shader

Ein Geometry Shader hat einen gewissen Overhead. Ein Grund ist, dass es eine variable Menge an Ausgabe erzeugen kann, die in einen zusammenhängenden Speicherblock verschoben werden muss. Meine Lösung besteht darin, für jeden Geometriefunktionsaufruf die gleiche Ausgabemenge zu erzeugen und das Verzweigen und Kopieren so weit wie möglich zu minimieren.

Jede Würfelfläche benötigt vier Eckpunkte, und die Kamera kann abhängig von ihrer Position relativ zum Voxel höchstens drei Flächen sehen. Dies ergibt drei Zweige, die sehr ähnliche Flächen zeichnen, mit Ausnahme einer Verschiebung entlang einer der Achsen. Die Verschiebungsvariable wird zugewiesen, um den Effekt des Zweigs zu minimieren, und zum Anpassen der Gesichtsposition beim Erstellen der Scheitelpunkte verwendet.

Den vollständigen Quellcode finden Sie unter dem folgenden Link.

  • Geometrie-Shader
    Voxel Performance Quellcode

Geometrie-Shader

// Malen Sie für jedes Voxel, das aus einem bestimmten Winkel sichtbar ist, die // drei Seiten, die die angegebene Kamera möglicherweise sieht. [maxvertexcount (12)] void geom (PunkteingabeGS p [1], inout TriangleStreaminput> triStream) {float4 pos = p [0] .pos * float4 (_Size, _Size, _Size, 1); float4 shift; float4 voxelPosition = pos + _chunkPosition; float halfS = _Size * 0.5; // x, y, z ist die Mitte des Voxels, // Seiten malen um die Hälfte der Größe versetzt pIn1, pIn2, pIn3, pIn4; pIn1._color = p [0] ._ color; pIn1.uv = float2 (0.0f, 0.0f); pIn2._color = p [0] ._ color; pIn2.uv = float2 (0.0f, 1.0f); pIn3._color = p [0] ._ color; pIn3.uv = float2 (1.0f, 0.0f); pIn4._color = p [0] ._ color; pIn4.uv = float2 (1.0f, 1.0f); shift = (_cameraPosition.x voxelPosition.x)? float4 (1, 1, 1, 1): float4 (-1, 1, -1, 1); pIn1.pos = mul (UNITY_MATRIX_VP, mul (_worldMatrixTransform, pos + shift * float4 (-halfS, -halfS, halfS, 0)); triStream.Append (pIn1); pIn2.pos = mul (UNITY_MATRIX_VP, mul (_worldMatrixTransform, pos + shift * float4 (-halfS, halfS, halfS, 0)); triStream.Append (pIn2); pIn3.pos = mul (UNITY_MATRIX_VP, mul (_worldMatrixTransform, pos + shift * float4 (-halfS, -halfS, -halfS, 0)); triStream.Append (pIn3); pIn4.pos = mul (UNITY_MATRIX_VP, mul (_worldMatrixTransform, pos + shift * float4 (-halfS, halfS, -halfS, 0)); triStream.Append (pIn4); triStream.RestartStrip (); ...

Zukünftige Richtungen

Ich habe dieses Asset für meinen eigenen Gebrauch erstellt und es in eine hoffentlich einfache, performante und wiederverwendbare Form verpackt. Ich habe Ideen für spätere Versionen, aber ich würde auch gerne Ihre hören, wenn Sie bereit sind, sie zu teilen, oder mich wissen lassen, wie Sie diesen Vermögenswert verwenden, um die Welt der Voxel zu erobern.

Eine Idee, mit der ich in letzter Zeit gespielt habe, besteht darin, den Optimierungsschritt vor der Anzeige so zu ändern, dass mehrere GPU-Puffer anstelle von nur einem zurückgegeben werden. Dies würde es spezialisierteren Shadern ermöglichen, unterschiedliche Voxelinformationen zu verarbeiten, z. B. die Unterstützung von Wolken, Flüssigkeiten oder eine Grafikänderung für verschiedene Voxelflächen.

Lass mich wissen was du denkst!

Verwandte Arbeiten mit Wetter (und Inspiration für dieses Asset)

Das unten gezeigte Video-Tutorial stammt von Charles Humphrey, einem Gelehrten und Gentleman, der zeigt, wie ein GPU-Puffer von einem Compute Shader an einen Geometry Shader übergeben wird. Diese Technik ist erst seit kurzem in Unity verfügbar, sodass sie eher eine schwarze Kunst bleibt. Das Tutorial zeigt auch, wie Sie im Billboard-Modus einige Wettereffekte in Unity erzielen, sodass Schneeflocken immer zur Kamera zeigen. Es sind ein paar nette Shader-Tricks, die er wahrscheinlich weiter verfolgen und in eines seiner Vermögenswerte im Unity-Laden stecken möchte, aber er wird gleichzeitig in zehn verschiedene Richtungen gezogen.

Dieser Artikel ist genau und nach bestem Wissen des Autors. Der Inhalt dient nur zu Informations- oder Unterhaltungszwecken und ersetzt nicht die persönliche Beratung oder professionelle Beratung in geschäftlichen, finanziellen, rechtlichen oder technischen Angelegenheiten.

Wir Empfehlen

Empfohlen

Stanzwerkzeuge: Eine grundlegende Erklärung zum Stanzen von Metall
Industriell

Stanzwerkzeuge: Eine grundlegende Erklärung zum Stanzen von Metall

Ja on Marovich war von 1990 bi 2005 al Zeichner und CAD-Bediener im Bereich Fahrzeugtechnik be chäftigt.Beim Metallprägen wird ein Metallrohling (normalerwei e tahlblech) geformt, zuge chnit...
Bewertung von Choetech Dual USB Autoladegerät mit Schnellladung
Computers

Bewertung von Choetech Dual USB Autoladegerät mit Schnellladung

Krzy ztof i t ein leben langer zukünftiger Tech-Junkie, der die neue ten Ge chichten von Unternehmen wie Apple, am ung, Google und Amazon unter ucht.Da 30-W-Dual-U B-Autoladegerät von Choete...