Seite 1 von 1
[DX9] Light Shaft Rendering / Volumetric Light
Verfasst: 15.10.2009, 00:36
von DomiOh
Hallo,
ja ich bin's mal wieder.
Ich wollte fragen, ob jemand eine Idee für ein einfaches Light-Shaft Rendering bzw. Volumetric Light hat.
Das ganze benötigt keinen Schattenwurf.
Ich habe mir dieses Paper dazu durchgelesen:
http://developer.amd.com/media/gpu_asse ... Shafts.pdf
Das ganze ist aber nicht besonders schnell und hat außerdem ziemlich viele visuelle Fehler.
Wie man auf dem Bild auf Page 39 sieht, entstehen sichtbare "Kästen" an den Rändern der einzelnen Slices.
Davon ab ist die benötigte Füllrate viel zu hoch.
Ein anderer Ansatz ist das was Fallout 3 macht, wenn man sich da mal anschaut. Jedoch bin ich noch nicht dahintergekommen, wie deren Shader das macht.
Dort wird als Object ein Quasi-Decalkreuz benutzt, welches allerdings nicht aus 2 Planes sondern aus 2 Boxen besteht. Dazu wird dem Objekt eine merkwürdige 1D-Gradient-Texture zugewiesen, die allerdings kein durchgehender Gradient ist, sondern komplett leere Pixel dazwischen hat (schwer zu beschreiben). Daher weiss ich im Moment nicht, wie das über deren Shader gelöst worden sein kann.
Hat jemand noch einen anderen, relativ schnellen Ansatz für so einen Effekt?
Re: [DX9] Light Shaft Rendering / Volumetric Light
Verfasst: 15.10.2009, 08:38
von Schrompf
Kommt drauf an, was Du brauchst. Wenn Du nur volumetrische Lichtvolumen brauchst, reicht der klassische Vorderseiten/Rückseiten-Ansatz: Tiefe der Rückseiten in ein Neben-Rendertarget ausrendern, dann Vorderseiten ausrendern und die Tiefendifferenz als Dichte interpretieren. Die kannst Du dann auf vielfältige Art und Weise in eine Farbänderung umwandeln - üblich ist Alphablending mit Dichte je nach Tiefe. Wenn das Lichtvolumen sich mit der Szene schneidet, verändert sich die Formel zu "Vordertiefe - max( Hintertiefe, Szenentiefe)" - in dem Fall ist dann ein PräZ-Pass oder ein Deferred Renderer von Nutzen.
Diese Varianten funktionieren dann natürlich nur für konvexe Volumen. Konkave kann man zusätzlich durch Aufaddieren der Vorder- und Rückseitentiefen ermöglichen, aber dann wird das Schneiden mit der restlichen Szene etwas komplizierter.
Re: [DX9] Light Shaft Rendering / Volumetric Light
Verfasst: 15.10.2009, 11:08
von DomiOh
Ich benutze derzeit schon Deferred Rendering für meine Szene, sollte also implementierbar sein.
Kannst du mir mal kurz und einfach den Unterschied zwischen Konvex und Konkav erklären? Ich kann mir in etwa denken, was es bedeutet, aber bin mir nicht 100%ig sicher.
Re: [DX9] Light Shaft Rendering / Volumetric Light
Verfasst: 15.10.2009, 11:58
von VizOne
Hier mal ein Bild (zeigt den Querschnitt des Volumes z.B. von oben, rot sind Sichtlinien)
Konvex bedeutet hier, dass wenn man durch das Lichtvolume schaut es immer genau einmal betreten und einmal verlassen wird (bzw. dass man am Ende auf Geometrie stößt), die Sichtlinie also exakt zwei Schnittpunkte mit dem Volume hat (links im Bild). Bei konkaven Volumes kann unter Umständen das Volume mehrfach betreten und verlassen werden (= mehr als 2 Schnittpunkte), wie rechts im Bild zu sehen.
Re: [DX9] Light Shaft Rendering / Volumetric Light
Verfasst: 15.10.2009, 12:01
von Zudomon
Re: [DX9] Light Shaft Rendering / Volumetric Light
Verfasst: 15.10.2009, 14:06
von DomiOh
Danke für die Erklärung. So hatte ich das auch in erinnerung.
Das heisst, ein normaler Lichtkegel (Cone) ist immer konvex.
Re: [DX9] Light Shaft Rendering / Volumetric Light
Verfasst: 15.10.2009, 14:18
von Schrompf
Genau.
Re: [DX9] Light Shaft Rendering / Volumetric Light
Verfasst: 16.10.2009, 20:00
von DomiOh
Schrompf hat geschrieben:Kommt drauf an, was Du brauchst. Wenn Du nur volumetrische Lichtvolumen brauchst, reicht der klassische Vorderseiten/Rückseiten-Ansatz: Tiefe der Rückseiten in ein Neben-Rendertarget ausrendern, dann Vorderseiten ausrendern und die Tiefendifferenz als Dichte interpretieren. Die kannst Du dann auf vielfältige Art und Weise in eine Farbänderung umwandeln - üblich ist Alphablending mit Dichte je nach Tiefe. Wenn das Lichtvolumen sich mit der Szene schneidet, verändert sich die Formel zu "Vordertiefe - max( Hintertiefe, Szenentiefe)" - in dem Fall ist dann ein PräZ-Pass oder ein Deferred Renderer von Nutzen.
Diese Varianten funktionieren dann natürlich nur für konvexe Volumen. Konkave kann man zusätzlich durch Aufaddieren der Vorder- und Rückseitentiefen ermöglichen, aber dann wird das Schneiden mit der restlichen Szene etwas komplizierter.
Ich habe über diesen Ansatz nachgedacht und kann mir absolut nicht vorstellen, wie man das für ein Light-Shaft-Rendering umsetzen könnte. Für Fog-Rendering ist mir das klar, aber nicht für das was ich erreichen will.
Bei Fallout 3 habe ich herausbekommen, dass dort ein Axis Billboard (Decal-Kreuz) gerendert wird, mit einem einfachen Gradient von Weiss/Voll-Alpha bis Weiss/Kein-Alpha.
Versuche ich allerdings, das "nachzuamen" sehe ich das Decal-Kreuz aus bestimmten Positionen ziemlich deutlich.
Einen Screenshot, wo man diese Lightshafts wunderbar sieht, habe ich hier gefunden:
http://www.donkeybiscuits.com/images/fa ... een108.jpg
Die Runden Lampen dort haben für mich ausreichende Light-Shafts.
Re: [DX9] Light Shaft Rendering / Volumetric Light
Verfasst: 16.10.2009, 21:35
von Krishty
DomiOh hat geschrieben:Versuche ich allerdings, das "nachzuamen" sehe ich das Decal-Kreuz aus bestimmten Positionen ziemlich deutlich.
Schonmal versucht, die Deckkraft mit dem Kosinus des Winkels zwischen Decal und Betrachter (zwischen
0 und 1 eingeklemmt!) zu multiplizieren?
Sonst nur eine einzige Sprite benutzen, die mit dem Betrachter um ihre Achse (die Strahlrichtung des Lichts) rotiert.
Gruß, Ky