Shadow Mapping-Artefakte

8

Ich habe mit Schattenzuordnung in OpenGL unter Verwendung von Tiefenstrukturen herumgespielt. Die Tiefenstruktur ist in Ordnung und ich kann sie auf die Szene abbilden, aber ich habe einige seltsame Artefakte auf der Rückseite des Objekts:

Kugel wirft einen Schatten mit Artefakten auf der Rückseite

Meine Frage ist, was dies verursacht und wie ich es beheben kann.

Der Fragment-Shader, den ich verwende, ist ziemlich einfach (ich habe die Farbe der Einfachheit halber entfernt, falls Sie sich fragen, warum es hier kein Blau gibt):

in vec4 vShadowCoord;

uniform sampler2DShadow shadowMap;

out vec4 fragColor;

void main()
{
    float bias = 0.005;
    float visibility = 1.0;
    if (texture(shadowMap, vec3(vShadowCoord.xy, vShadowCoord.z / vShadowCoord.w)) < (vShadowCoord.z - bias) / vShadowCoord.w)
        visibility = 0.25;

    fragColor = vec4(visibility);
}

Bearbeiten: Wie gewünscht, Mindestarbeitsbeispiel-Screenshot, der nur den obigen Code verwendet (keine Farbe).

Gleiche Kugel, minus Farbe

Blarglenarf
quelle
1
Können Sie bestätigen, ob der angezeigte Code (mit entferntem Blau) auch die Artefakte verursacht? Wenn Sie den Code eingegrenzt haben, können Sie durch Anzeigen des Bildes aus dem eingegrenzten Code irrelevante Details ausschließen und das Problem hervorheben.
Trichoplax
Ja, ich dachte, ich würde einen Screenshot mit Farbe machen, sonst sieht es noch hässlicher aus :)
Blarglenarf
Ich kann das verstehen, aber da es die Hässlichkeit ist, bei der Sie um Hilfe bitten, haben Sie möglicherweise eine bessere Chance, dass jemand das Problem sieht, wenn Sie den Screenshot einfügen, der auch dem Code entspricht.
Trichoplax
1
Meinetwegen. Ich habe einen zusätzlichen Screenshot hinzugefügt.
Blarglenarf
Haben Sie versucht, ein bisschen mehr mit der Tendenz herumzuspielen?
CIFZ

Antworten:

11

Dieses Problem sieht aus wie Standard-Akne-Artefakte auf der Schattenkarte. Außerdem ist Ihre Beleuchtungsgleichung unvollständig oder falsch. Licht sollte keine Gesichter beeinflussen, bei denen Normalen davon abgewandt sind. Dies bedeutet auch, dass mit einer richtigen Gleichung die "dunkle" Seite der Kugel keine Akne-Artefakte aufweisen sollte.

Es gibt drei Quellen für Akne-Artefakte:

  • Die erste Aknequelle ist die Genauigkeit der Schattenkarte. Stellen Sie sicher, dass die nahen und fernen Ebenen des Schattenwurfs so eng wie möglich sind. Alle Objekte vor der nahen Ebene können zusammengebacken werden, da ihre genaue Tiefe nicht wichtig ist.
  • Die zweite Aknequelle ist die Auflösung der Schattenkarte. Für ein gerichtetes Licht sollten Sie kaskadierte Schattenkarten mit mindestens 3 Kaskaden von 1024 x 1012 für ~ 100-200 m Schattenentfernung erstellen. Es ist schwierig, eine ähnliche Schattenentfernung mit einer Schattenkarte mit einheitlicher Projektion zurückzulegen.
  • Die dritte Aknequelle ist ein Wide Shadow Map-Filter wie PCF, da die Verwendung eines einzelnen Tiefenvergleichswerts für einen breiten Kernel nicht ausreicht. Es gibt viele Methoden, um das Problem zu beheben, aber keine davon ist robust.

Zusammenfassend lässt sich sagen, dass ein enger Kegelstumpf mit einigen Kaskaden und einigen Vorspannungsänderungen erforderlich ist, um den allgemeinen Fall zum Laufen zu bringen (gerichtetes Licht). Starten Sie die Optimierung, indem Sie die Schattenfilterung deaktivieren und die Filterung nur dann optimieren, wenn die grundlegenden Schattenkarten robust genug sind.

Zusätzlich zu der konstanten Tiefenvorspannung (die Sie derzeit verwenden) sollten Sie auch die Neigungstiefenvorspannung und die maximale Neigungstiefenvorspannung hinzufügen. Beide können beim Rendern von Shadowmap entweder als Renderstatus oder als Shader-Code implementiert werden. Die Neigungstiefe ist einfach ein magischer Vorspannungswert, der durch einen Punkt skaliert wird (normal, lightDir).

Es gibt einige weitere interessante Methoden, von denen die meisten in der hervorragenden Demo implementiert sind: Matt Pettineo - "Eine Auswahl von Schattentechniken" .

  • Flip Culling während des Renderns von Schattenkarten (tauscht Akne gegen Peter Panning).
  • Die normale Offset-Schattenzuordnung wirkt sich positiv auf Bias-Probleme aus, erfordert jedoch Scheitelpunktnormalen während der Schattierung.
  • Varianzbasierte Methoden (ESM, VSM, EVSM) beseitigen Bias-Probleme vollständig, weisen jedoch andere Nachteile auf (Lichtlecks und / oder Leistungsprobleme).
Krzysztof Narkowicz
quelle