Berechnen Sie clipspace.w aus clipspace.xyz und (inv) Projektionsmatrix

Ich verwende einen logarithmischen Tiefenalgorithmus, der dazu führt, dass someFunc (clipspace.z) in den Tiefenpuffer geschrieben wirdund keine implizite Perspektiventeilung.

Ich mache RTT / Postprocessing, also möchte ich später in einem Fragment-Shader eyespace.xyz neu berechnen, wobei ndc.xy (aus den Fragmentkoordinaten) und clipspace.z (aus someFuncInv () für den im Tiefenpuffer gespeicherten Wert) angegeben werden. .

Beachten Sie, dass ich nicht clipspace.w habe und mein gespeicherter Wert nicht clipspace.z / clipspace.w ist (wie es bei Verwendung der festen Funktionstiefe der Fall wäre) - also etwas in ...

float clip_z = ...; /* [-1 .. +1] */
vec2 ndc = vec2(FragCoord.xy / viewport * 2.0 - 1.0);
vec4 clipspace = InvProjMatrix * vec4(ndc, clip_z, 1.0));
clipspace /= clipspace.w;

... funktioniert hier nicht.

Gibt es eine Möglichkeit, clipspace.w aus clipspace.xyz zu berechnen, wenn die Projektionsmatrix gegeben oder umgekehrt ist?

Antworten auf die Frage(1)

Ihre Antwort auf die Frage