Unityで深度バッファからカメラZを取得

忘れないようにメモ。
Unity 2017.1


float LinearEyeDepth(float rawdepth)
{
  float x, y, z, w;
#if UNITY_REVERSED_Z
  x = -1.0 + _NearClip / _FarClip;
  y = 1;
  z = x / _NearClip;
  w = 1 / _NearClip;
#else
  x = 1.0 - _NearClip / _FarClip;
  y = _NearClip / _FarClip;
  z = x / _NearClip;
  w = y / _NearClip;
#endif

  return 1.0 / (z * rawdepth + w);
}

float d = _CameraDepthTexture.Load(int3(xy, 0));
float camera_z = LinearEyeDepth(d);

_NearClipと_FarClipの値は、CameraコンポーネントのnearClipPlaneとfarClipPlaneプロパティをそのまま渡せばよい。

広告