Ordnen Sie unabhängige Transparenz im Partikelsystem

9

Ich schreibe ein Partikelsystem und möchte einen Trick finden, um eine korrekte Alpha-Mischung zu erreichen, ohne Partikel zu sortieren, weil:

  • Jedes Partikel ist ein Punktsprite in einem einzelnen Netz, und ich kann die Szenendiagrammfunktion nicht zum Sortieren transparenter Knoten verwenden. Der Systemknoten sollte jedoch ordnungsgemäß sortiert sein.
  • Die Partikelposition wird auf dem Shader aus Anfangsgeschwindigkeit, Beschleunigung und Zeit berechnet. Um das System zu sortieren, müsste ich all diese Berechnungen auf der CPU durchführen, was ich vermeiden möchte.
  • Das Sortieren von Hunderten von Partikeln anhand der Kameraposition und das Hochladen auf die GPU jedes Bilds ergibt einen leisen, schweren Betrieb.

Alpha-Tests scheinen auf GLES 2.0 schnell genug zu sein und funktionieren gut für nicht transparente, aber "maskierte" Texturen. Für halbtransparente Partikel reicht dies jedoch nicht aus.

Wie würden Sie damit umgehen?

Stepan Zastupov
quelle
Wie wichtig ist es unbedingt, dass sie richtig sortiert sind? Haben Sie tatsächlich (wichtige) Artefakte mit Vanillemischung gesehen?
ChrisE
Ein Partikel kann sich mit dem Hintergrund anstelle eines anderen Partikels vermischen, und dann ist die "rechteckige" Essenz von Punkt-Sprite sehr auffällig. Alpha-Tests helfen hier, aber Artefakte sind immer noch erkennbar, wenn der Alpha-Wert niedrig ist, aber nicht ausreicht, um das Fragment zu verwerfen.
Stepan Zastupov
6
Haben Sie beim Rendern der Partikel versucht, Tiefenschreibvorgänge zu deaktivieren (Tiefenprüfungen aktiviert zu lassen)? Das sollte die falsche Reihenfolge weniger offensichtlich machen.
Adam
2
Nach einigen Experimenten stellte ich fest, dass das Deaktivieren des Tiefenschreibens in den meisten Fällen die beste Lösung ist.
Stepan Zastupov

Antworten:

10

Folgendes würde ich tun.

Schritt 1: Nicht sortieren. Mach es einfach. Sehen Sie, ob es ein Problem ist. Höchstwahrscheinlich nicht.

Schritt 2: Begrenzen Sie Partikel auf solche, die nicht wirklich sortiert werden müssen, wie z.

  • Nur Feststoffe (mit möglicherweise Kanten von Alpha bis Bedeckung)

    • Lassen Sie zbuffer sich um die Sortierung kümmern.
  • Nur additive Bits

    • a + b = b + a, also spielt die Reihenfolge keine Rolle

Schritt 3: Wenn mehr benötigt wird, teilen Sie das Partikel-Rendering in Bits auf, die vorne und im Rest sein müssen, und führen Sie das Rendering in mehreren Durchgängen durch (könnte beispielsweise komplexen Rauch reparieren).

Schritt 4: Wenn noch mehr benötigt wird oder wenn Sie eine allgemeine Lösung benötigen, sollten Sie MRTs verwenden, um eine sehr grobe N-Bucket-Sortierung durchzuführen. Rendern Sie die Partikel in N Ausgangsflächen und setzen Sie sie in einem separaten Durchgang zusammen.

Für weitere Informationen sind weitere Informationen zu Ihrem speziellen Anwendungsfall erforderlich. Aber ich bin mir ziemlich sicher, dass Sie doch keine wirkliche Auftragsunabhängigkeit brauchen. Verwenden Sie einfach genug Partikel zufällig genug und es wird in Ordnung sein =)

Jari Komppa
quelle
6

Schreiben Sie beim Rendern der Partikel nur nicht in den Tiefenpuffer. Dadurch können sie alle gerendert und miteinander gemischt werden. Sie sollten dennoch Tiefentests durchführen, damit sie durch die Geometrie in der Szene ordnungsgemäß verdeckt werden können.

KlashnikovKid
quelle
5

Die Verwendung der additiven Mischreihenfolge spielt keine Rolle:

glEnable(GL_BLEND)
glDepthMask(GL_FALSE)
glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA)
DrawParticles();

// Now turn depth masking on and blending off, so state is unchanged.
glDepthMask(GL_TRUE)
glDisable(GL_BLEND)

Dies setzt voraus, dass Ihre Sprite-Textur einen transparenten Hintergrund hat.

teh_leecherer
quelle