Getting the true z value from the depth buffer

后端 未结 3 600
广开言路
广开言路 2020-11-28 02:24

Sampling from a depth buffer in a shader returns values between 0 and 1, as expected. Given the near- and far- clip planes of the camera, how do I calculate the true z value

3条回答
  •  一向
    一向 (楼主)
    2020-11-28 02:53

    I ended up here trying to solve a similar problem when Nicol Bolas's comment on this page made me realize what I was doing wrong. If you want the distance to the camera and not the distance to the camera plane, you can compute it as follows (in GLSL):

    float GetDistanceFromCamera(float depth, 
                                vec2 screen_pixel, 
                                vec2 resolution) {
      float fov = ... 
      float near = ...
      float far = ...
      float distance_to_plane = near / (far - depth * (far - near)) * far;
    
    
      vec2 center = resolution / 2.0f - 0.5;
      float focal_length = (resolution.y / 2.0f) / tan(fov / 2.0f);
      float diagonal = length(vec3(screen_pixel.x - center.x,
                                   screen_pixel.y - center.y,
                                   focal_length));
    
      return distance_to_plane * (diagonal / focal_length);
    }
    

    (source) Thanks to github user cassfalg: https://github.com/carla-simulator/carla/issues/2287

提交回复
热议问题