衝突検知 - saitocastel1900/UnityShader GitHub Wiki
- 「sampler2D _CameraDepthTexture;」で深度バッファの生データを取得する
- ピクセルごとの深度バッファを取得為るためには、スクリーン座標が必要なので「ComputeScreenPos」でスクリーン座標を取得する
- 「half screenPosition = i.screenPos.w;」でそのオブジェクトからスクリーン(カメラ)との距離を表している
- ピクセルごとの深度値を取得為るために、いろいろ変換する
//LinearEyeDepth()でカメラからのワールド空間における距離として取得(ビュー座標)...別に変換しなくても使えるけど、非線形な価として返ってくるので使い勝手が悪い。そのため変換する感じらしい
//参考:http://hiyoko1986.web.fc2.com/program/pages/WebGL/LinearDepth.html
half sceneDepth = LinearEyeDepth(
//SAMPLE_DEPTH_TEXTURE_PROJ : 深度値を取得為るためのサンプリング関数
//tex2D()と同じで、(テクスチャ、座標)を指定する
//tex2D()ならスクリーン座標でも良い?はずだが、DEPTH_TEXTURE_PROJ()とあるようにプロジェクション座標(クリッピング座標)に変換するため、UNITY_PROJ_COORD()でスクリーン座標を反感している
//これでスクリーン座標に対応して深度値を取得できる
SAMPLE_DEPTH_TEXTURE_PROJ(_CameraDepthTexture, UNITY_PROJ_COORD(i.screenPos)));
- 最後に深度値(他のオブジェクト) - 衝突オブジェクトで距離の差を求めて、差が大きいほど色を黒くしている.
「half depth = sceneDepth - screenPosition;」
- stepを使うことで、局所的に色を当てることができる