Kürzlich arbeite ich an meiner SSAO-Implementierung, für meine Engine möchte ich Unterstützung sowohl für Vorwärts- als auch für Deferred-Renderer hinzufügen, daher wähle ich den Tiefenanflug-Ansatz und rekonstruiere normale aus der Tiefenkarte, hier ist der Code:Wie normal aus der Tiefe ohne Artefakte an der Kante zu rekonstruieren?
//Restore view space position with non-linear depth
vec3 viewPos = getPosition(uv, depth, invProjMat);
//Restore view space normal
vec3 normal = normalize(cross(dFdx(viewPos), dFdy(viewPos)));
Dann wende ich das normal auf meine SSAO Implementierung, erreichen sie ein ganz überwiegend gutes Ergebnis, mit Ausnahme der Kante:
ich bin sicher, das ist, weil die diskontinuierliche normalen kant , aber ich habe keine Ahnung, wie ich es beheben kann. Gibt es also einen Ansatz, um das Artefakt am Rand zu vermeiden, wenn man normal aus der Tiefe rekonstruiert? DANKE.
Der richtige Weg, es zu tun ist, um Normalen zu einem Puffer zu rendern. Mit nur Tiefe wirst du an Kanten niemals gut sein. Sie können einige Heuristiken machen, aber es wird nie die ganze Zeit richtig sein. Selbst wenn Sie Objekt-Uids rendern, wird es für ein Pixel breite Linien brechen. Wenn Sie dies wirklich tun wollen, machen Sie einen Filter basierend auf der Tiefe statt dFd *. Anstelle von dFdx (pos) können Sie einen Wert (pos-1) - Wert (pos + 1) eingeben. Und nun mache einen Filter, der verschiedene Dinge macht, wenn die beiden Werte zu weit auseinander liegen. Aber auch dies wird scheitern, wenn beispielsweise ein einzelnes Pixel schattiert wird. – starmole
@starmole: Warum ist das keine Antwort? –