title: Reconstructing world position from linear depth
body: <p>i have issues reconstructing world positions from previously stored linear depth in glsl. I read lots of info online, but can't find my problem...
  So this is what I got:</p>
  
  <pre><code>VS (storing depth to 32F):
  float linDepth(float z) {
      return (-z-zNear)/(zFar-zNear);
  }
  void main() {
      vec4 position = uViewMatrix * uModelMatrix * vec4(aPosition, 1);
      depth = linDepth(position.z); //store linear view-depth
  }
  
  FS (reconstuction):
  void main() {
      vec3 vUV = vec2(0..1, 0..1); (from screen aligned quad)
      vec3 ndc = vec3(vUV*2-1, linearViewDepth*2-1);
      vec4 v0 = inverse(uProjectionMatrix)*vec4(ndc, 1);
      vec3 reconViewPos = v0.xyz/v0.w;
      vec3 reconWorldPos = inverse(uViewMatrix) * v0;
  }
  </code></pre>
  
  <p>...and the results are completely off.
  Though I sense a problem by using unchanged linear view depth as ndc z. In the end I wish to apply the ray-interpolation approach:</p>
  
  <pre><code>VS (reconstruction, aligned screenquad):
  out vec3 vViewRay;
  void main() {
      gl_Position = aPosition;
      vec4 v = vec4(aPosition.x, aPosition.y, 1, 1); //ndc (at the back of cube)
      v = inverse(uProjectionMatrix) * v;
      v /= v.w; //view coordinate
      v /= v.z; //normalize by z for scaling
      vViewRay = v.xyz;
  }
  
  FS(reconstruction):
  in vec3 vViewRay;
  float delinDepth(float z) {
      return -(z*(zFar-zNear)+zNear);
  }
  void main() {
      vec3 reconViewPos = vViewRay * delinDepth(linearViewDepth);
  }
  </code></pre>