Wie kann ich Physik aus einem Geometrie-Shader in eine prozedural erzeugte Welt integrieren?

10

Im Wesentlichen möchte ich die Notwendigkeit beseitigen, kohärentes Rauschen von der CPU zur GPU zu erzeugen. Von dort aus möchte ich auch das Terrain für eine dreidimensionale Welt erzeugen, indem ich dieses Rauschen als Dichte in Voxelpunkten verwende. Danach möchte ich diese Dichten nehmen und sie polygonisieren (Eckpunkte erzeugen), die das Terrain der Welt darstellen.

Das ist in Ordnung und alles. Ich möchte aber auch die Welt in Echtzeit dynamisch deformieren. Sobald ich an diesem Punkt angelangt bin, habe ich ein Problem damit, die Scheitelpunkte wieder in die CPU zu bringen, um beispielsweise die Kollisionserkennung und alle Spielberechnungen durchzuführen, die ich auf der CPU und nicht auf der GPU ausführen möchte.

Die Frage ist also: Wie kann ich eine Teilmenge der Eckpunkte an die CPU zurückgeben, um unter anderem Kollisionen zu behandeln?

Und noch eine Frage: Gibt es eine einfache Möglichkeit, eine Reihe von Eckpunkten zu nehmen und daraus Indizes auf der GPU zu generieren?

Ich bin verwirrt und weiß nicht, welche Arten von Shadern ich für diese verschiedenen Dinge verwenden soll. Ich höre von Leuten, die einen Pixel-Shader zum Sammeln von Dichten und dann einen Geometrie-Shader zum Behandeln der Geländegenerierung aus den Scheitelpunkten verwenden und dann irgendwie einen Scheitelpunkt-Shader einbauen, um die dynamischen Verformungen durchzuführen.

Ich verwende C # 4.0, .NET 4.0 und XNA Game Studio 4.0.

Michael J. Gray
quelle
1
Sie sagen, Sie verwenden einen Geometrie-Shader im Titel, aber Sie sagen auch, dass Sie XNA4.0 verwenden, soweit ich weiß, dass XNA 4.0 DirectX 10 erfordert (um die Entwicklung für eine einheitlichere Plattform zu vereinfachen) Unterstützt nur SM3.0-Funktionen, daher kein Geometrie-Shader. forums.create.msdn.com/forums/p/31369/178924.aspx
Roy T.
Und jetzt werde ich XNA nicht mehr verwenden oder mein Design überarbeiten. Vielen Dank für den Hinweis. Ich hatte mich damit befasst und diese Einschränkung nicht erkannt (kein SM 4). Ich nehme an, die Frage bleibt ohne die Berücksichtigung von XNA weiterhin bestehen. Gibt es aus Sicht von DirectX eine Möglichkeit, das zu tun, was ich will? Oder vielleicht mit einem Vertex-Shader in XNA?
1
Die Verwendung von XNA ist weiterhin gültig, es sei denn, Sie haben einen bewährten Testfall, bei dem Deformationen und die Erzeugung zu langsam sind. Und dass Sie in einem anderen Testfall bewiesen haben, dass die GPU deformiert + generiert und dann Daten schneller an die CPU zurückgesendet werden :)
Roy T.
Tatsächlich. Wir haben festgestellt, dass die Verwendung von XNA und die Beibehaltung der CPU-Kapazität in etwa drei Minuten auf einem Core i7 mit 8 Kernen und 8 Threads, die mehrere Geländeabschnitte pro Thread parallelisieren, ungefähr 1 Million Eckpunkte ergab. Beim Versuch, dies in Echtzeit zu tun und hoffentlich das Gelände zu rendern, bevor der Spieler es sehen konnte, erreichten wir ungefähr 20 Bilder pro Sekunde. Ein Testfall ist also definitiv mit jeder der Methoden in Ordnung.
Michael J. Gray

Antworten:

3

Da XNA keine Geometrie-Shader unterstützt, werde ich darauf antworten, als ob Sie DX 10 verwenden würden. Sie haben im Wesentlichen drei Optionen.

Geometrie-Shader Geometrie-Shader können tatsächlich Scheitelpunkte ändern und einem Scheitelpunktpuffer hinzufügen. Sie können dies in die CPU zurücklesen. Ich habe es nicht untersucht, aber es ist definitiv möglich.

Verwenden Sie einfach die CPU Zweitens, warum berechnen Sie sie nicht einfach auf der CPU? Die Tatsache, dass es auf der GPU in Shadern ausgeführt wird, legt nahe, dass Ihr Verformungsalgorithmus lokalisierbar ist, dh Sie können problemlos nur die relaventen Teile für Ihre Kollisionsprüfung generieren.

Zum Beispiel habe ich vor einiger Zeit ein Segelspiel gemacht. Der Ozean benutzte die Scheitelpunkt- und Geometrie-Shader, um das Wasser mit Wellen zu verformen. Ich habe den gleichen Algorithmus verwendet, der auf der CPU an nur wenigen Punkten unter dem Boot für die Bewegung des Bootes in den Wellen berechnet wurde. Ich bin sicher, Sie könnten etwas Ähnliches für Ihre Voxel-Karte tun.

Pixel-Shader Die letzte Option, die Sie auch in Ihrer Frage erwähnt haben: Generieren Sie die Dichten im Pixel-Shader und schreiben Sie sie in eine 3D-Textur. Sie können von der CPU und den Shadern ziemlich harmlos darauf zugreifen. Der Pixel-Shader ist perfekt für diese Aufgabe, aber diese Methode hat viel Aufwand. Rendern der Volumentextur sowie Abtasten von innen im Scheitelpunkt und im Geo. Shader und müssen die Textur auf der CPU lesen.

Ich kenne die Besonderheiten Ihres Projekts nicht, würde aber immer die CPU dafür verwenden. Berechnen Sie auf jeden Fall auch die Dichte der Shader, verwenden Sie jedoch weiterhin die Grafikkarte zum Rendern.

Hannesh
quelle
Das Hauptproblem war die GPU-CPU-Barriere. In dem Sinne, wenn wir das Terrain auf der GPU generiert und gerendert haben, wie können wir herausfinden, wie das Terrain auf der CPU-Seite der Dinge aussieht, um Kollisionen und andere Dinge zu tun. Ich nehme an, Ihr Gedanke, es auf der CPU zu belassen, ist gültig. Ich meine, wir können unseren Algorithmus wahrscheinlich ziemlich optimieren und weniger Terrain erzeugen. Ich werde Ihre Antwort in ein oder zwei Tagen als Lösung markieren, um zu sehen, ob jemand anderes eine Antwort hat. Vielen Dank, dass Sie einige alternative Gedanken provoziert haben.
Michael J. Gray
Mit Ihrem Segelbeispiel könnten Sie das Wellenformergebnis eines durch Wellen spritzenden Bootes nicht einfach mit der GPU verbinden, oder?
verzögert
1
Sie können dasselbe Rendering-System beibehalten, dh das Terrain auf der GPU generieren und rendern, aber die Teile des Terrains, die Sie benötigen, auf der CPU spiegeln. Wenn Sie denselben Algorithmus und dieselben Parameter verwenden, erhalten Sie auf der CPU dasselbe Terrain wie auf dem Bildschirm.
Hannesh
@ Daniel Nicht mit dem Wellenalgorithmus direkt, aber es ist möglich, das Wassernetz entsprechend der Spur des Bootes mit einer Verschiebungstextur zu verformen, die jedes Boot dahinter "schleppt".
Hannesh
Ah! Das ist eine großartige Idee :). Aber es unterstützt wahrscheinlich nicht mehrere Wasserfahrzeuge sehr gut.
Verlangsamte