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:
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).
opengl
glsl
shadow-mapping
shadow
Blarglenarf
quelle
quelle
Antworten:
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:
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" .
quelle