Frage zu Order Independent transparency

Für Fragen zu Grafik APIs wie DirectX und OpenGL sowie Shaderprogrammierung.
Antworten
Andy90
Beiträge: 73
Registriert: 08.10.2023, 13:02

Frage zu Order Independent transparency

Beitrag von Andy90 »

Hallo, ich habe heute festgestellt, dass ich ein Problemm mit Transparenzen habe. Nach einiger Zeit habe ich dann das Problemm gefunden, dass besagte Mesh welches Probleme macht, wird mit am Anfang gerendert. Daraus ergibt sich, dass man an den transparenten stellen die Skybox sieht. Also habe ich mich etwas informiert was man dagegen machen kann. Es würde einmal die Möglichkeit geben, dass man die Materiallien sortiert und erst die nicht transparenten Sachen rendert und dann erst die transparenten.

Eine andere Möglichkeit und für mich aus Sinnvollere wäre das ganze ohne Sortierung zu machen, mit so genannten "Order Independent transparency". Nun kommen wir zu meiner frage, eine der Möglichkeiten wäre es, die Mesh's auf verschiedene Framebuffer zu rendern. Einen mit den Normalen nicht Transparenten Materialien und einen mit nur Transparenten und diese dann am Ende zusammenfügt.

Nun wäre meine frage, ob das wirklich so "einfach" geht und praktisch zwei "Bilder" zu erstellen und diese dann zusammen legen oder muss ich da noch andere Sachen beachten?
Benutzeravatar
TomasRiker
Beiträge: 96
Registriert: 18.07.2011, 11:45
Echter Name: David Scherfgen
Wohnort: Hildesheim

Re: Frage zu Order Independent transparency

Beitrag von TomasRiker »

So einfach ist das nicht, da du auch die Tiefen beachten musst. Im Z-Buffer kann man nur eine einzige Tiefe pro Pixel speichern. Sobald du mehrere Oberflächen übereinander renderst, geht der Großteil der Tiefeninformation verloren. Man kann sich leicht Konstellationen ausdenken, wo man an einem Pixel beliebig viele transparente Oberflächen hintereinander hat, und eine nicht-transparente Oberfläche müsste dann ja nach Tiefe einige der transparenten Oberflächen verdecken und einige nicht. Es gibt für dieses Problem leider keine einfache Lösung. Wenn man es ganz korrekt machen wollte, müsste man für jede (x, y)-Position alle Pixel (genauer gesagt: Fragmente) nach ihrer Tiefe sortieren, aber das ist sehr unpraktisch und langsam.

In der Praxis wird man meistens zuerst die nicht-transparenten Materialien rendern und dann die transparenten, sortiert nach Tiefe (die am weitesten entfernten zuerst). Wobei das mit der Sortierung nach Tiefe auch nicht immer einfach ist, weil das auf Mesh-basis oft zu falschen Ergebnissen führt, wenn ein Teil eines Meshs einen anderen Teil desselben Meshs verdeckt. Dann müsste man ggf. sogar die einzelnen Dreiecke sortieren (und hoffen, dass die sich nicht schneiden).
Andy90
Beiträge: 73
Registriert: 08.10.2023, 13:02

Re: Frage zu Order Independent transparency

Beitrag von Andy90 »

Hmm, ja das dachte ich mir schon. Also wäre das Sortieren das am einfachsten zu integrierende.
Benutzeravatar
TomasRiker
Beiträge: 96
Registriert: 18.07.2011, 11:45
Echter Name: David Scherfgen
Wohnort: Hildesheim

Re: Frage zu Order Independent transparency

Beitrag von TomasRiker »

Ja. Je nach Art der Transparenz ist es ggf. gar nicht nötig, zu sortieren. Bei rein additiver Transparenz (oft genutzt für Feuer- oder Leuchteffekte) ist es egal, in welcher Reihenfolge gerendert wird. Sortieren ist allerdings nötig, wenn Alpha-Blending genutzt wird.
Matthias Gubisch
Establishment
Beiträge: 488
Registriert: 01.03.2009, 19:09

Re: Frage zu Order Independent transparency

Beitrag von Matthias Gubisch »

Richtiges Order Independent Transparency ist ziemlich hart
Hier der Link zu Part 1 eines (wie ich finde) guten 3 Teiligen Artikels der Verschiedene OIT Techniken beleuchtet:
https://interplayoflight.wordpress.com/ ... cy-part-1/

Du sparst dir eine Menge Aufwand (und Ärger) wenn du darauf verzichten kannst, und mit sortieren der Meshes auskommst.
Bevor man den Kopf schüttelt, sollte man sich vergewissern einen zu haben
Benutzeravatar
Jonathan
Establishment
Beiträge: 2542
Registriert: 04.08.2004, 20:06
Kontaktdaten:

Re: Frage zu Order Independent transparency

Beitrag von Jonathan »

Ich würde empfehlen, mit den einfachen Techniken anzufangen, die schon die meisten Probleme beseitigen, und danach dann zu schauen, ob man wirklich noch mehr machen muss.
Ich habe das Problem hauptsächlich bei Vegetation (Gras / Bäume). Ich glaube, aktuell render ich zunächst alles nicht-transparente. Man kann z.B. bei Gras auch statt Alphablending einzelne Pixel im Shader discarden, dann hast du zwar harte und hässliche Ränder, aber keine Transparenz mehr und damit auch z.B. keine Pixel, in denen die Helle Skybox durchscheint, anstatt der dunkle Boden. Z-Write aus (aber Z-Test an) ist auch schon recht nützlich.
Lieber dumm fragen, als dumm bleiben!
https://jonathank.de/games/
Benutzeravatar
TomasRiker
Beiträge: 96
Registriert: 18.07.2011, 11:45
Echter Name: David Scherfgen
Wohnort: Hildesheim

Re: Frage zu Order Independent transparency

Beitrag von TomasRiker »

Jonathan hat geschrieben: 27.02.2024, 08:38 Ich habe das Problem hauptsächlich bei Vegetation (Gras / Bäume). Ich glaube, aktuell render ich zunächst alles nicht-transparente. Man kann z.B. bei Gras auch statt Alphablending einzelne Pixel im Shader discarden, dann hast du zwar harte und hässliche Ränder
Die Lösung für dieses Problem heißt "alpha to coverage": https://en.m.wikipedia.org/wiki/Alpha_to_coverage
Benutzeravatar
Schrompf
Moderator
Beiträge: 5040
Registriert: 25.02.2009, 23:44
Benutzertext: Lernt nur selten dazu
Echter Name: Thomas
Wohnort: Dresden
Kontaktdaten:

Re: Frage zu Order Independent transparency

Beitrag von Schrompf »

Ja, das sind so die Standardtechniken. Das Discarden von Pixeln "ganz oder gar nicht" nennt man Alpha Testing, und es vermeidet allen Transparenz-Stress, weil der ZBuffer einfach seine Arbeit tut. Kann Dir aus Erfahrung sagen, dass es nicht aussieht. Richtige Transparenz ist schon ne feine Sache, wenn das Gebüsch ein bissl weiter weg steht.

Das mit den separaten Framebuffern kannst Du erstmal sein lassen. Standardmethode für Bewuchs ist: zuerst alles Feste mit DepthTest und DepthWrite, dann obendrauf den Bewuchs nur mit DepthTest. Mach das erstmal, sieht schon ok aus, dann zusätzlich einzelne Instanzen nach Tiefe sortiert.

Wenn Du da irgendwelche groß überlagernden Büsche hast, kann das trotzdem noch hässlich werden. Dann lohnt sich ein Zusatz-Pass nur für den Bewuchs:
1) Landschaft mit DepthTest und DepthWrite.
2) Bewuchs mit hohen AlphaTest, DepthTest und DepthWrite
3) Nochmal Bewuchs mit echtem AlphaBlending, nur DepthTest, kein Write.

Mach das erstmal, das sieht dann schon echt gut aus. Es wird dann wieder übel, wenn Du Partikel hinzufügst - große Nebelschwaden oder sowas. Oder wenn Du damit Schilf in flaches Wasser stellen willst. Aber das ist ein Ding für später.

AlphaToCoverage, was Tomas gerade vorschlug, erfordert MultiSampling, das könnte anstrengend werden.
Früher mal Dreamworlds. Früher mal Open Asset Import Library. Heutzutage nur noch so rumwursteln.
Benutzeravatar
TomasRiker
Beiträge: 96
Registriert: 18.07.2011, 11:45
Echter Name: David Scherfgen
Wohnort: Hildesheim

Re: Frage zu Order Independent transparency

Beitrag von TomasRiker »

Schrompf hat geschrieben: 27.02.2024, 09:36 AlphaToCoverage, was Tomas gerade vorschlug, erfordert MultiSampling, das könnte anstrengend werden.
Inwiefern anstrengend (wohlgemerkt Multisampling, nicht Supersampling)? Was schlägst du stattdessen für Antialiasing vor? PostFX?
Benutzeravatar
Schrompf
Moderator
Beiträge: 5040
Registriert: 25.02.2009, 23:44
Benutzertext: Lernt nur selten dazu
Echter Name: Thomas
Wohnort: Dresden
Kontaktdaten:

Re: Frage zu Order Independent transparency

Beitrag von Schrompf »

Hier isses egal, stimmt schon. Meine Sorge wegen MultiSampling ist zum Einen uralt:

a) Resolve ist kompliziert mit HDR, Farbräumen und so

und zum Anderen ganz neu:

b) Niemand mag das mehr und macht stattdessen Temporal Gedöns oder Dithering für Alphatransparenz
Früher mal Dreamworlds. Früher mal Open Asset Import Library. Heutzutage nur noch so rumwursteln.
Matthias Gubisch
Establishment
Beiträge: 488
Registriert: 01.03.2009, 19:09

Re: Frage zu Order Independent transparency

Beitrag von Matthias Gubisch »

Naja dass das niemand mehr mag liegt halt auch daran dass die meisten Renderer Deferred Renderer sind und keine Forward/Forward+ Renderer und sich das einfach mit der Arbeitsweise vom MSAA ziemlich beisst....
Bevor man den Kopf schüttelt, sollte man sich vergewissern einen zu haben
Antworten