2016-05-08 8 views
0

Ich schreibe eine Partikelsimulation, bei der die Logik mit Intel AVX aktualisiert wird. Ich verwende einen SoA-Ansatz, um meine "SIMD-Freundlichkeit" zu maximieren, aber ich mische die Partikelpositionskomponenten beim Aktualisieren des Vertexpuffers in das XYZ-Format .Ist es möglich, Vertex auf GPU aus einem Nicht-XYZ-Vertexpuffer zu konstruieren?

Ist es möglich, den Shuffle-Teil auszuschließen und einfach die Eckdaten im XXYYZZ-Format zu übergeben und jeden Eckpunkt in einer Shaderstufe zu konstruieren?

Mein erster Gedanke war, unter Verwendung von drei Scheitelpunktpuffern mit x, y und z Komponenten getrennt, und jeden Vertex konstruiert unter Verwendung des gleichen Index Index, der die x, y und z-Komponente eines Knotens zuzugreifen.

Ich bin mir bewusst, dass dies nicht der konventionelle Weg ist, aber ich möchte betonen, dass dies nur ein Experiment ist. Vielleicht hat irgendjemand etwas über diesen Ansatz gelernt (wenn es überhaupt möglich ist) und/oder könnte er mich in die richtige Richtung weisen? Vielleicht gibt es auch einen Namen?

Vielen Dank!

Antwort

4

Es gibt keine Einschränkung, wie Sie die GPU mit Ihren Scheitelpunkten füttern. Sie können das Eingabe-Layout anpassen, um Werte aus einer beliebigen Anzahl von Stützpunktpuffern zu lesen. In Ihrem Beispiel haben Sie mindestens drei Elemente. Im Vertex Shader erhalten Sie Ihre drei Elemente als drei Skalare und swizzle sie zurück. Die einzige wirkliche Einschränkung ist, dass jeder Wert in jedem Puffer den gleichen Index hat.

In Bezug auf die Leistung, es sei denn, Sie möchten die beste 1% Leistung der GPU erhalten, sehen Sie keinen Unterschied im Vergleich zu einem gut verschachtelten Vertex. Dies beeinflusst hauptsächlich die Bandbreite und den L2-Cache-Fehler, so dass es unwahrscheinlich ist, dass, wenn Sie verrückte Millionen von Partikeln haben. Und wenn Sie das getan haben, können Sie einen Compute-Shader verwenden, um die Daten in einem Vorprozess zu verschachteln.

+0

Ich dachte, ich könnte ein paar Worte über meine Ergebnisse teilen. Mit diesem Ansatz kann ich die Mischvorgänge vollständig ausschließen, die zuvor den größten Teil der Bildzeit verbraucht haben. Dies bedeutet, dass ich meine Partikelpositionskomponenten in drei verschiedenen Arrays und drei separaten Vertex-Puffern speichern kann. Nur ein einfaches 'memcpy' zum Neuabbilden der Vertexdaten. Mein vorheriges Ergebnis war ~ 80 FPS für 1 Million + Partikel. Jetzt bekomme ich aber ~ 230 FPS für die gleiche Menge an Partikeln. Danke nochmal dafür, dass du dein Wissen zu diesem Thema weitergegeben hast. – SvinSimpe

Verwandte Themen