Calcule clipspace.w desde clipspace.xyz y (inv) matriz de proyección

Estoy usando un algoritmo de profundidad logarítmica que da como resultado que algunos caracteres (clipspace.z) se escriban en el búfer de profundidady no hay división de perspectiva implícita.

Estoy haciendo RTT / postprocesamiento, así que más adelante en un sombreador de fragmentos quiero volver a calcular eyespace.xyz, dado ndc.xy (de las coordenadas del fragmento) y clipspace.z (de someFuncInv () en el valor almacenado en el buffer de profundidad) .

Tenga en cuenta que no tengo clipspace.w, y que mi valor almacenado no es clipspace.z / clipspace.w (como lo sería si utilizara la profundidad de la función fija), por lo que hay algo en la línea de ...

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;

... no funciona aquí.

Entonces, ¿hay una manera de calcular clipspace.w fuera de clipspace.xyz, dada la matriz de proyección o es inversa?