Ich versuche, 3D-Weltkoordinaten aus Tiefenwerten in meinem Deferred-Renderer zu rekonstruieren, aber ich habe eine Menge Zeit. Die meisten Beispiele, die ich online finde, gehen von einer Standardperspektivtransformation aus, aber ich möchte diese Annahme nicht machen.Weltkoordinaten aus Tiefenpuffer und willkürlicher Ansichts-Projektionsmatrix rekonstruieren
In meinen Geometrie Pass Vertex-Shader, berechne ich gl_Position mit:
gl_Position = wvpMatrix * vec4(vertexLocation, 1.0f);
und in meinem Lichtpass Fragment-Shader, ich versuche, die Welt zu bekommen Koordinaten:
vec3 decodeLocation()
{
vec4 clipSpaceLocation;
clipSpaceLocation.xy = texcoord * 2.0f - 1.0f;
clipSpaceLocation.z = texture(depthSampler, texcoord).r;
clipSpaceLocation.w = 1.0f;
vec4 homogenousLocation = viewProjectionInverseMatrix * clipSpaceLocation;
return homogenousLocation.xyz/homogenousLocation.w;
}
Ich dachte, mich hatte es richtig, und tatsächlich scheinen Objekte in der Nähe der Kamera richtig zu leuchten. Aber vor kurzem habe ich festgestellt, dass Objekte, wenn ich mich weiter entferne, beleuchtet werden, als ob sie weiter von der Kamera entfernt wären, als sie tatsächlich sind. Ich habe mit meinem Lichtpass gespielt und verifiziert, dass meine Weltkoordinaten das einzige sind, was sich verrechnet hat.
Ich kann nicht helfen, aber denke, dass meine clipSpaceLocation.z und clipSpaceLocation.w die Quelle des Problems sind, aber ich habe versucht jede Variation, die ich denken kann, um sie zu berechnen, und der obige Code führt am meisten- korrekte Ergebnisse.
Irgendwelche Ideen oder Vorschläge?
wie haben Sie Ihre inverse Ansicht Projektionsmatrix berechnen? Ich habe das Problem mit Licht Raum Position greifen und ich nehme die Annahme, dass es meine inversen Ansicht Projektionsmatrix. –