Frage zu Order Independent transparency
Frage zu Order Independent transparency
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?
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?
- TomasRiker
- Beiträge: 96
- Registriert: 18.07.2011, 11:45
- Echter Name: David Scherfgen
- Wohnort: Hildesheim
Re: Frage zu Order Independent transparency
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).
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).
Re: Frage zu Order Independent transparency
Hmm, ja das dachte ich mir schon. Also wäre das Sortieren das am einfachsten zu integrierende.
- TomasRiker
- Beiträge: 96
- Registriert: 18.07.2011, 11:45
- Echter Name: David Scherfgen
- Wohnort: Hildesheim
Re: Frage zu Order Independent transparency
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.
-
- Establishment
- Beiträge: 488
- Registriert: 01.03.2009, 19:09
Re: Frage zu Order Independent transparency
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.
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
Re: Frage zu Order Independent transparency
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.
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/
https://jonathank.de/games/
- TomasRiker
- Beiträge: 96
- Registriert: 18.07.2011, 11:45
- Echter Name: David Scherfgen
- Wohnort: Hildesheim
Re: Frage zu Order Independent transparency
Die Lösung für dieses Problem heißt "alpha to coverage": https://en.m.wikipedia.org/wiki/Alpha_to_coverageJonathan 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
- 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
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.
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.
- TomasRiker
- Beiträge: 96
- Registriert: 18.07.2011, 11:45
- Echter Name: David Scherfgen
- Wohnort: Hildesheim
- 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
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
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.
-
- Establishment
- Beiträge: 488
- Registriert: 01.03.2009, 19:09
Re: Frage zu Order Independent transparency
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