[DX9] Light Shaft Rendering / Volumetric Light

Für Fragen zu Grafik APIs wie DirectX und OpenGL sowie Shaderprogrammierung.
Antworten
DomiOh
Establishment
Beiträge: 132
Registriert: 08.10.2002, 14:44

[DX9] Light Shaft Rendering / Volumetric Light

Beitrag 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?
Benutzeravatar
Schrompf
Moderator
Beiträge: 4859
Registriert: 25.02.2009, 23:44
Benutzertext: Lernt nur selten dazu
Echter Name: Thomas Ziegenhagen
Wohnort: Dresden
Kontaktdaten:

Re: [DX9] Light Shaft Rendering / Volumetric Light

Beitrag 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.
Früher mal Dreamworlds. Früher mal Open Asset Import Library. Heutzutage nur noch so rumwursteln.
DomiOh
Establishment
Beiträge: 132
Registriert: 08.10.2002, 14:44

Re: [DX9] Light Shaft Rendering / Volumetric Light

Beitrag 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.
VizOne
Moderator
Beiträge: 17
Registriert: 03.07.2003, 22:08
Kontaktdaten:

Re: [DX9] Light Shaft Rendering / Volumetric Light

Beitrag 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.
konkavkonvex.png
DomiOh
Establishment
Beiträge: 132
Registriert: 08.10.2002, 14:44

Re: [DX9] Light Shaft Rendering / Volumetric Light

Beitrag von DomiOh »

Danke für die Erklärung. So hatte ich das auch in erinnerung.
Das heisst, ein normaler Lichtkegel (Cone) ist immer konvex.
Benutzeravatar
Schrompf
Moderator
Beiträge: 4859
Registriert: 25.02.2009, 23:44
Benutzertext: Lernt nur selten dazu
Echter Name: Thomas Ziegenhagen
Wohnort: Dresden
Kontaktdaten:

Re: [DX9] Light Shaft Rendering / Volumetric Light

Beitrag von Schrompf »

Genau.
Früher mal Dreamworlds. Früher mal Open Asset Import Library. Heutzutage nur noch so rumwursteln.
DomiOh
Establishment
Beiträge: 132
Registriert: 08.10.2002, 14:44

Re: [DX9] Light Shaft Rendering / Volumetric Light

Beitrag 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.
Benutzeravatar
Krishty
Establishment
Beiträge: 8248
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: [DX9] Light Shaft Rendering / Volumetric Light

Beitrag 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
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Antworten