Cómo recuperar la posición del espacio de vista dado el valor de profundidad de espacio de vista y ndc xy

Estoy escribiendo un sombreador diferido, y estoy tratando de empacar mi gbuffer más apretado. Sin embargo, no puedo calcular la posición de la vista dada la profundidad del espacio de la vista correctamente

// depth -> (gl_ModelViewMatrix * vec4(pos.xyz, 1)).z; where pos is the model space position
// fov -> field of view in radians (0.62831855, 0.47123888)
// p -> ndc position, x, y [-1, 1]
vec3 getPosition(float depth, vec2 fov, vec2 p)
{
vec3 pos;
pos.x = -depth * tan( HALF_PI - fov.x/2.0 ) * (p.x);
pos.y = -depth * tan( HALF_PI - fov.y/2.0 ) * (p.y);
pos.z = depth;
return pos;
}

La posición calculada es incorrecta. Lo sé porque todavía estoy almacenando la posición correcta en el gbuffer y haciendo pruebas con eso.

Respuestas a la pregunta(3)

Su respuesta a la pregunta