[DX9] Shadowmaps

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] Shadowmaps

Beitrag von DomiOh »

Hallöchen,

ich bin's mal wieder :)

Ich habe kleinere Probleme mit meinen Shadowmaps - konkret gesagt, mit diesem dämlichen Z-Bias für die Shadowmap.
Um so größer mein Licht, um so größer ist das FOV für die Projektionsmatrix. Dabei ändert sich dann auch der Bias.
Berechnen lässt sich dieser auch nicht so toll und ich kann nicht für jedes Licht Stundenlang suchen, bis ich den passenden Bias gefunden habe.

Kennt jemand ne alternative oder so? Wäre ein linearer Z-Buffer einfacher? Oder (ich nutze dafür deferred shading) den Z-Wert komplett speichern?
Benutzeravatar
Schrompf
Moderator
Beiträge: 4878
Registriert: 25.02.2009, 23:44
Benutzertext: Lernt nur selten dazu
Echter Name: Thomas Ziegenhagen
Wohnort: Dresden
Kontaktdaten:

Re: [DX9] Shadowmaps

Beitrag von Schrompf »

Welcher Lichtquellentyp? Denn eigentlich bleibt der FOV (ich interpretier den mal als Öffnungswinkel der Kamera) immer derselbe. Demzufolge skaliert das Bias, dass gegen Selbstschattierung nötig ist, nur noch mit der Texelgröße (== Auflösung der ShadowMap) und der Neigung der schattenwerfenden Fläche. Und beide Effekte kann man im VertexShader ganz gut kontern, auch wenn das Neigungsbias idealerweise eher im Geometrieshader berechnet werden sollte.
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] Shadowmaps

Beitrag von DomiOh »

Da muss ich wohl weiter ausholen.

Also ich habe Spot-Lichter deren Projektion ich anhand der größe berechne. Es gibt verschieden große Lichter.
Dementsprechend ist die Perspective-Matrix bei einem "Cone" der 0,5 x 1 Meter ist eine andere als bei einem Licht dessen Kegel z.B. 7 x 2 Meter groß ist... Die Matrix berechne ich mit D3DXMatrixPerspectiveLH. Das Problem ist, dass sich durch die verschiedenen Perspective-Matrizen unterschiedliche Bias-Werte ergeben. Nehme ich eine Perspektive, die immer gleich ist, bekomme ich teilweise die Lichtkegel nicht ganz in die Shadowmap.

Und übrigens: Unter DX9 habe ich keinen Geometry-Shader ;-)

Irgendwelche Ideen dazu?`
Wäre toll.
Benutzeravatar
Schrompf
Moderator
Beiträge: 4878
Registriert: 25.02.2009, 23:44
Benutzertext: Lernt nur selten dazu
Echter Name: Thomas Ziegenhagen
Wohnort: Dresden
Kontaktdaten:

Re: [DX9] Shadowmaps

Beitrag von Schrompf »

Über die Breite und die Texturauflösung kannst Du die räumliche Größe eines Texels berechnen. Die Länge des Kegels ist dabei egal. Da der Kegel sich linear öffnet, skaliert auch die räumliche Texel-Ausdehnung linear. Demzufolge sollte das Bias auf die Sichttiefe multiplikativ angewendet werden und nicht additiv. Von hier aus gibt es dann zwei Wege: Du nimmst einen statischen Maximalwinkel, bis zum dem Du selbstschatten-frei sein willst. Für den brauchst Du dann nur noch auszurechnen, wieviel Tiefe eine soviel zum Licht geneigte Oberfläche überstreicht, wenn man die Texelausdehnung als Querschnitt annimmt. Dann hast Du ein Bias. Das plus ein gewisses Minimal-Bias ist dann Dein Offset. Oder Du berechnest das Offset anhand dieser Formel direkt im Shader, wo Du anhand der Vertexnormale die Neigung der Fläche zum Licht auswerten kannst. Damit kannst Du dann das Neigungsbias live ausrechnen und bekommt bessere Ergebnisse.

Bei uns sieht das Bias für Kegellichter so aus:

Code: Alles auswählen

    // Offset mit zunehmender Flächenneigung: norm ist die Vertexnormale in Kamerakoords
    float streuoffset = min( sqrt( 1 - norm.z * norm.z) / abs(norm.z), 10.0f);
    // Vertexposition in Kamerakoords entsprechend vergrößern: Basis-Bias und neigungsabhängiges Bias
    kamPos.xyz *= 1.0f + gSchattenDaten.mStreuung.x * (0.3f + streuoffset * 2.0f);
    // korrigierte Position neu projezieren
    raus.mPosition = mul( gProjMatrix, kamPos);

    // Tiefe normiert auf Lichtreichweite (== Kamerasichtweite) ist Schattenentfernung
    raus.mLichtAbstand = kamPos.z / gKameraDaten.w;
Die Streuungskonstante gibt in Texturgröße an, wie groß der Bereich ist, über den die PCF-Samples verteilt sind. Wir streuen üblicherweise über zwo bis drei Texel, die Konstante ist also z.B. "2.5f / TexGroesse". Falls die Grafikkarte R32F-Texturen nicht linear filtern kann, muss der Streusicherheitsbereich nochmal um einen halben Texel erhöht werden.

Bye, Thomas
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] Shadowmaps

Beitrag von DomiOh »

Nunja, soweit klappt es ... aber es ist nicht so gut geeignet für meine Zwecke
Ich benutze Deferred Shading, was kein Problem ist, das Problem ist ein anderes.

Ich habe mehrer Lichtquellen, alle werfen Schatten - auch das ist soweit schonmal kein Problem.
Aber selbst eine Shadowmap mit einer Auflösung von 2048x2048 ist zu klein. Die Schatten sind zackelig und ungenau.

Hat jemand evtl. einen anderen Vorschlag für ein Shadowing-System?
Benutzeravatar
Schrompf
Moderator
Beiträge: 4878
Registriert: 25.02.2009, 23:44
Benutzertext: Lernt nur selten dazu
Echter Name: Thomas Ziegenhagen
Wohnort: Dresden
Kontaktdaten:

Re: [DX9] Shadowmaps

Beitrag von Schrompf »

"Nicht so gut geeignet"? Was bitte kann man an mathematisch korrekter Offset-Berechnung anders machen? Allerdings verstehe ich auch Dein anderes Problem nicht: wir reden immernoch von Kegellichtern, oder? Wenn der Schattenplatz nicht für alle reicht, dann fange doch eine weitere ShadowMap an oder schalte bei einigen den Schatten aus. Optimierungsmethoden, wie sie zu Dutzenden für szenenumfassende Parallellichter existieren, gibt es nach meinem Wissen nicht für Spotlights.
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] Shadowmaps

Beitrag von DomiOh »

Natürlich sind es Kegellichter. Das ganze realisiert mit Deferred Shading. Mir ist aber eben aufgefallen, dass die Schatten ziemlich ... bescheiden aussehen und ich suche nach Möglichkeiten ordentliche Schatten dazustellen.
Ein Geschwindigkeitsproblem habe ich nicht. Schatten ausschalten kann ich aber nicht, da die Lichter dann durch die Wand leuchten.
Antworten