Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

BlackSnake

Community-Fossil

  • »BlackSnake« ist der Autor dieses Themas

Beiträge: 1 549

Beruf: Student

  • Private Nachricht senden

1

13.10.2012, 01:28

[Vorstellung] Partikelsystem (CPU&GPU)

Hi,

nach langer Pausezeit auf der Seite hier möchte ich gerne mal wieder was vorstellen.
Animiert durch die Uni habe ich ein wenig mit ComputeShadern herumgespielt und mich dahingehend weitergebildet. Da ich kein Fan von irgendwelchen mathematischen Prototypen bin, habe ich mich für ein Partikelsystem entschieden, was sich stetig weiterentwickelt hat.

Das System
Die Idee dahinter ist denkbar einfach. Ein paar Interfaces geben das Layout des Systems vor. Wie genau das System im Hintergrund arbeitet ist für den Nutzer (in dem Fall mich) ziemlich egal und auch nicht ersichtlich bei der Verwendung der Bibliothek. Durch den Ansatz ist es bis jetzt möglich das System durch die CPU simulieren zu lassen sowie auch durch die GPU. Bei der GPU gibt es zurzeit die Einschränkung, dass nur DirectX11 mit dem Feature-Level 11 unterstützt wird (Zweck war ja unter Anderem das Kennenlernen von ComputeShadern...). Die Partikel verweilen komplett auf der GPU und müssen nicht zurückgelesen werden!

Das System selbst hat keinerlei Einschränkungen bzgl. den "Richtlinien". Eine Richtlinie ist hier eine Kontrollstruktur, die für die Simulation der einzelnen Partikel genutzt wird (Positioninitialisierung, Berechnung der neuen Position usw...). Aktuell werden folgende Richtlinien unterstützt bzw. Angeboten (Der Nutzer kann spielend leicht seine eigenen Strukturen beifügen!):
  • Position: Oberfläche einer Kugel (zufällig)
  • Position: Oberfläche einer Ebene (zufällig)
  • Texturindex
  • Skalierung
  • Gravitation
  • Lineare Bewegung
Gerade auf der GPU Seite galt es diverse, nicht sofort ersichtliche Hindernisse zu überwinden. Ein Beispiel dafür ist das 16 byte Alignment des HLSL Compilers (eine gute Erklärung zu dem Thema kann man hier finden: http://blog.signalsondisplay.com/?p=244). Das System kümmert sich um das Byte Alignment sowie die Aktualisierung des globalen Variablen. Unterschieden wird zwischen Variablen, die ein ständiges Update benötigen und statischen (getrennte Buffer). Sollte ein Buffer mal nicht ausreichen, wird automatisch ein weiteren hinzugefügt.

Das emittieren der Partikel erfolgt über einen Emittern (bis jetzt nur mit dem Typ: Constant Rate Emitter). Die Emitter selbst halten die Richtilinien, die für die Aktualisierung genutzt werden.


Einschränkungen
Das System ist testhalber programmiert worden. Daher fehlen zurzeit teils viele Fehlerabfragen und Parameterprüfungen. Einer der größten Nachteile betrifft das dynamische hinzufügen/entfernen von Richtlinien. Dies ist schlichtweg nicht machbar, da die Shader dann neukompiliert werden müssten und dessen Buffer eine neue Generierung benötigen würden. Aus Performancegründen wurde dieses Features nicht eingebunden.
Zusätzlich gibt es mit dem Alpha Blending teils sehr hässliche Artefakte, da die Partikel durch den ComputeShader immer wieder in eine andere Reihenfolge gebracht werden. Dies könnte man durch eine Sortierung mit Hilfe von einem QuickSort auf der GPU lösen.

Aussichten
Ein Feature, was nützlich bei vielen unterschiedlichen System werden kann, ist das von DirectX11 angebotene "multithreaded Rendering". Grundlegend funktioniert dies bereits, führt allerdinds ab und zu zu schweren Treiberabstürzen.

Demo
Eine Demoanwendung selbst gibt es nicht. Für die Tests wurde ein einfaches Framework genutzt. Der größte Performanceverlust bei steigender Partikelanzahl ist das eigentliche Rendering. Es werden alle Partikel auf einmal gezeichnet ohne jegliche optimierung.

Ohne das Rendering schafft das System mit nur einer Partikelquelle (keine Vorteile durch das DX11 Feature "multithreaded Rendering") 1 Mio. Partikel bei 250 FPS zu simulieren. Schaltet man das Rendering dazu, bricht die Framerate teils bis 30 FPS ein. Das Testsystem hat eine Nvidia 560 Ti.

Ein Bild von einem Testausschnitt des System:

(Link)



Viel ist nun nicht zu erkennen. Paar Partikel, die langsam nach oben schweben. Die Textur besteht aus einem 2x2 Tile-Set (jede Farbe ist ein Tile). Der PRNG (implementiert auf der GPU) liefert dabei halbwegs brauchbare Ergebnisse.

Wie weit das Projekt selbst noch gehen wird, vermag ich nicht zu sagen. Aber ansich ist so geplant, dass auch FeatureLevel 10 unterstützung finden sollte. Evtl. treffe ich mit dem kleinen Testprojekt die Interesse mancher Leute.

Somit wünsche ich dann noch einen schönen Abend. Offene Fragen beantworte ich gerne!