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.
Antworten:
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.
quelle