Gamestudio Links
Zorro Links
Newest Posts
Help with plotting multiple ZigZag
by degenerate_762. 04/30/24 23:23
M1 Oversampling
by 11honza11. 04/30/24 08:16
Trading Journey
by howardR. 04/28/24 09:55
Zorro Trader GPT
by TipmyPip. 04/27/24 13:50
Data from CSV not parsed correctly
by jcl. 04/26/24 11:18
AUM Magazine
Latest Screens
The Bible Game
A psychological thriller game
SHADOW (2014)
DEAD TASTE
Who's Online Now
1 registered members (AndrewAMD), 946 guests, and 5 spiders.
Key: Admin, Global Mod, Mod
Newest Members
firatv, wandaluciaia, Mega_Rod, EternallyCurious, howardR
19050 Registered Users
Previous Thread
Next Thread
Print Thread
Rate Thread
Order Independent Transparency #424963
06/24/13 19:54
06/24/13 19:54
Joined: Dec 2002
Posts: 3,363
Vindobona (Ostarichi)
Harry Potter Offline OP
Expert
Harry Potter  Offline OP
Expert

Joined: Dec 2002
Posts: 3,363
Vindobona (Ostarichi)
Hallo zusammen!

Viele kennen das Problem, dass in der A8 (bzw. unter DirectX 9) halbtransparente Polygone oft falsch sortiert gerendert werden. Oder dass die Sortierung, abhängig von der Kameraposition, einmal korrekt ist, und dann plötzlich fehlerhaft.

Das hängt damit zusammen, dass halbtransparente Polygone nicht in den Z-Buffer geschrieben werden können, und dadurch auch nicht anhand ihrer tatsächlichen Position im virtuellen Raum sortiert werden können.
Stattdessen werden sie nach folgender Reihenfolge sortiert/gerendert:
  • Innerhalb eines Models werden transparente Polygone in der Reihenfolge ihrer Erstellung gerendert. Polygone, die beim Modellieren zu einem späteren Zeitpunkt erstellt wurden, überlagern also beim Rendern jene Polygone, die zuvor erstellt wurden.
  • Die Entities selbst (also Sprites, Models) werden abhängig von ihrem Abstand zur Kamera gerendert (wobei der Mittelpunkt der Entity entscheidend ist).

Dieser Thread soll dazu dienen, über verschiedene Techniken zu diskutieren, mit denen man die Probleme mit der falschen Sortierung zumindest teilweise umgehen kann.

Für den Anfang könnten wir über folgende Punkte diskutieren:

1.) Order Independent Transparency unter DirectX 11
DirectX 11 unterstützt einen Shader, der es ermöglicht, halbtransparente Polygone in der korrekten Sortierreihenfolge zu rendern.
Beispiel-Video: http://www.youtube.com/watch?v=zANEUhyT2y8
Von Slin stammt dieser interessante Link mit einer detailierten Beschreibung:
https://graphics.stanford.edu/wikis/cs44...s-10-11-oit.pdf


2.) Eine Technik, bei der halbtransparente Objekte (Vegetation) in einem zweiten Schritt gerendert werden
Dieser Hinweis kam von Superku, und ist in folgendem Dokument genauer beschrieben:
http://www2.disney.co.uk/cms_res/blackrockstudio/pdf/Foliage_Rendering_in_Pure.pdf


3.) Tricks beim Modellieren zum Vermeiden der falschen Sortierung
Und dann gibt es noch jede Menge Tipps und Tricks, wie man schon beim Modellieren bzw. beim Designen der halbtransparenten Models die Sortierreihenfolge der Polygone beeinflussen kann. Oder indem man ein Model auf mehrere Models aufteilt, oder programmgesteuert den Mittelpunkt eines Models verlagert. Auch darüber können wir gerne diskutieren.


Ich habe diesen Thread auf deutsch eröffnet. Antworten können auch gerne in englisch gegeben werden.
Dank Google-Translator dürfte es ja kein Problem sein, beide Sprachen zumindest lesen zu können.

Re: Order Independent Transparency [Re: Harry Potter] #424965
06/24/13 20:53
06/24/13 20:53
Joined: Jul 2001
Posts: 6,904
H
HeelX Offline
Senior Expert
HeelX  Offline
Senior Expert
H

Joined: Jul 2001
Posts: 6,904
Meiner Meinung nach kommt es stark darauf an, welche Objekte du verwenden willst, ob die wirklich halbtransparent sind und was für dich "akzeptabel" ist. Eine perfekte Lösung wird es nicht geben.

Ich habe mich mit beiden Papern vor einiger Zeit befasst, Technik 1 wirst du so nicht ohne Probleme umsetzen können, schon gar nicht unter DX9. Ich bin mir nicht sicher, aber das Stochastic Transparency paper von Enderton (http://www.cse.chalmers.se/~d00sint/StochasticTransparency_I3D2010.pdf) schlägt in dieselbe Kerbe (oder ist dasselbe), da beide Ansätze - für mein Verständnis - auf screen door transparency basieren. Ich denke, das die Lösung auf jedenfall zu einem erheblichen Performanceverlust führt in einem realen Szenario.

Technik 2 ist sehr attraktiv, da man relativ weiche Alpha für große Flächen bei extrem geringen Kosten erhält. Ich denke das Alphablending bricht aber sofort, wenn man nahe an alpha-Kanten rankommt, wie z.B. im Wald oder bei einer Grasfläche, da man dort "harte" Treppenstufen aufgrund des alphatestings sieht, die nicht "verschwinden", weil die mehrfachen Alphawerte pro Pixel aufsummiert >= 1 ergeben. Da müsste man dann mit einem FXAA-artigen shader drübergehen - eventuell müsste man dann auf dem Pass mit dem alphatest-Material in ein zweites Target den Gradienten der Kante oder so reinschreiben, damit man genau weiß wo man unscharf zeichnen muss. - Nichtsdestotrotz finde ich diese Technik sehr sehr sexy smile

Ansonsten würde ich noch klassisches Depthpeeling ins Spiel bringen, was dafür geeignet ist, intersections alpha-korrigiert aufzulösen.

Funktioniert so:

Du renderst deine Szene ganz normal, wobei du alle Pixel mit voller alpha renderst und den Z-Buffer behälst; die Alpha der Pixel schreibst du in eine separaten Buffer. Dann renderst du die Szene nochmal, wobei du alle Pixel wegwirfst, die größer-oder-gleich diesem Z-Wert ist, sodass du die Schicht "unterhalb" der zuvor gerenderten Szene renderst. Wieder mit Alpha = 100%. Mit der Alpha der Pixel blendest du die Farbwerte mit denen der zuvor gerenderten Schicht und dessen Alphawerte. Fahre fort wie zuvor, bis nichts mehr zu rendern ist. -- Natürlich ist diese Abbrechbedingung sehr fuzzy, weshalb man auch z.B. ein festes Offset draufrechnet und das ganze x-mal macht, oder man zerschneidet die Szene fest anhand eines Intervalls basierende auf der clipping-Range.. was weiß ich, ganz nach gusto.

Hier mal ein Beispiel: http://dl.dropboxusercontent.com/u/17249329/DepthPeel/DepthPeel.html

Ansonsten würde ich erstmal probieren, das programmatisch zu lösen. Ich würde z.B. ein Tool schreiben, in das man ein Modell reinlädt. Dann könnte man z.B. dem User die Möglichkeit geben, bis zu 8 distinkte Perspektiven anzugeben (durch rumfliegen mit der Kamera), aus welchen Perspektiven man das Modell so sieht. Dann würde ich für jede Position für jedes Polygon eine Art "rank" berechnen, wie weit das Polygon flächenmäßig nahe an der Kamera ist und das über die Positionen mitteln (arithmetisches-, geometrisches Mittel, ... was halt besser ist). Anhand der ranks würde ich dann die Polygone in der Reihenfolge neu in das Modell reinschrieben.

[EDIT] Ich könnte mir sehr gut vorstellen, dass das für Bäume und gemischt-transparent/solide Objekte gut klappt. Bei Gras(flächen) oder so.. naja, eher nicht wink

Last edited by HeelX; 06/24/13 20:56.
Re: Order Independent Transparency [Re: HeelX] #424989
06/25/13 09:19
06/25/13 09:19
Joined: May 2005
Posts: 2,713
Lübeck
Slin Offline
Expert
Slin  Offline
Expert

Joined: May 2005
Posts: 2,713
Lübeck
1) Sortiert die zu blendenden Werte auf Fragment Ebene auf der Grafikkarte und mischt sie zusammen, was zu fehlerfreien Ergebnissen führt und warscheinlich sogar recht performant ist, wenn sich nicht für zu viele Fragmente zu viele transparente Polygone überlagern. Wobei ich mir vorstellen könnte dass es sogar dann noch ziemlich gut funktioniert. Es ist ein bisschen vergleichbar mit tiled lighting.
Vermutlich kann man soetwas auch mit DX9 irgendwie umsetzen, darunter würde aber sicherlich die Performance und Flexibilität ziemlich stark leiden, weil man die listen irgendwie sinnvoll in texturen packen muss, mehr daten braucht usw, wärend das in DX11 einfach ein vorhandenes mehr oder weniger performantes Feature ist.
Stochastic transparency funktioniert ziemlich anders da es nur versucht im Mittel die korrekte Transparenz zu bestimmen indem es mehr oder weniger zufällig zusammenblendet und im Fall von dem geposteten Paper das Ergebniss noch irgendwie verwischt um das durch die Technik entstehende Rauschen zu mindern. Im Prinzip eine interessante Technik die auch einigermaßen performant sein sollte, dafür aber etwas aufwändiger zu implementieren und außerdem mit Macken die man versuchen muss zu reduzieren, von daher ist meiner Meinung nach das von AMD vorgestellte echte OIT die deutlich bessere Lösung wenn sie denn anwendbar ist.

2) Hat nicht viel mit Transparenz und Sortierung zu tun, dass einzige Ziel hierbei ist, dass Pflanzen mit hübschen, weichen, aliasingarmen Kanten gerendert werden. Korrektes mischen der Transparenten Farben oder soetwas ist hierbei nicht gegeben. Die Idee der Technik ist ja, dass die Pflanzen mit Alphatesting (also ohne Transparenz und dafür korrekt sortiert) in eine zusätzliche Textur gerendert werden und zusätzlich noch eine Maske basierend auf den Alphawerten die dann genutzt wird um die Pflanzen über das Ausgangsbild zu legen. Ich find die Idee super, da sie sehr einfach umzusetzen ist und für Pflanzen sehr hübsche Ergebnisse liefern müsste, für etwas anderes ist es allerdings nicht geeignet und "korrekt" ist das Ergebnis sowieso nicht, optisch vermute ich aber sehr schöne Ergebnisse.
Ich will gleich mal versuchen diese Technik umzusetzen, ich zeig dann mal Bilder wenn ich erfolgreich bin laugh.

3) Also in Blender gibt es die Möglichkeit die Faces abhängig vom Abstand zum Cursor neu zu sortieren und ich würde ähnliche Features auch in anderer Modellingsoftware erwarten.
Für manche Anwendung ist dies eine super Lösung. Zum Beispiel wenn man mehrere transparente Zylinder ineinander hat. Man könnte auch überlegen für verschiedene Perspektiven unterschiedlich sortierte Modelle zu verwenden und solche Sortierungen für alle möglichen Betrachtungswinkel automatisch zu erzeugen und wärend es für manche Fälle eine gute Lösung sein kann gibt es auch Fälle wo es eine eher unrealistische Lösung ist, zumal die sortierung nur innerhalb eines Meshes korrekt ist, nicht aber zwischen mehreren. Für sich kreuzende Polygone geht es auch kaputt.

4) (Depthpeeling) Ist eine gute Lösung wenn man mit eher weniger Ebenen auskommt, was oft der Fall sein sollte, da es oft wichtiger ist die vorderen Polygone korrekt zu sortieren und die weiter hinten zufällig zu lassen ohne dass es kaputt aussieht.

Letztlich hängt es ganz stark davon ab um was für transparente Objekte es sich handelt und davon abhängig kann man dann mehr oder weniger tricksen um eine geeignete Lösung zu finden.
1) und 4) sorgen für korrektes Blending sind aber recht teuer und aufwändig umzusetzen. 2) und 3) sind für Spezialfälle sehr gut geeignet darüber hinaus aber nicht zu gebrauchen.

Harry Potter, hast du mal ein Beispiel wo du Probleme mit Alpha und Sortierung hast und gern OIT nutzen würdest? Denn dann könnte man hier mal versuchen eine dafür geeignete Lösung zu finden oder so. laugh


Moderated by  checkbutton, mk_1 

Gamestudio download | chip programmers | Zorro platform | shop | Data Protection Policy

oP group Germany GmbH | Birkenstr. 25-27 | 63549 Ronneburg / Germany | info (at) opgroup.de

Powered by UBB.threads™ PHP Forum Software 7.7.1