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.