夜風のMixedReality

xRと出会って変わった人生と出会った技術を書き残すためのGeekなHoloRangerの居場所

ShaderGraphでオブジェクト同士の交差点を取得する

本日はShader学習枠です。

今回は水面表現などでよく見かけるほかのオブジェクトと交差している個所が発光するような見た目のシェーダーを実装します。

〇Unityでオブジェクト同士の交差点の取得

Unityであるオブジェクトと別のオブジェクトが接触、交差しているかどうかはDepthTextureを使用することで取得できます。

レンダリング時にUnityでは深度(奥行)情報をもとに一度テクスチャとして保存することができます。

 これをDepthTextureと呼び、今回使用するようにシェーダーやPostprocessingなどで使用して様々な表現を行うことができます。

docs.unity3d.com

〇ShaderGraphでオブジェクト同士の交差の検知

シェーダーでよく使われるテクニックですが、EyeレベルのSceneDepthの値からScreenPositonのα値を引くことでオブジェクトとの交点をとることができます。

これを出力することで、次のように交差点が黒く表示されます。

SceneDepthは深度情報になります。ここからカメラ座標のα値を引いていますが、上記のように黒くなるということはSceneDepthScreen Positionの差が0に近いことを示しています。

 逆に白い部分は数値上は1以上となり、差が大きいことを示しています。

 SceneDepthはカメラから円柱までの距離、Screen PositionはカメラかPlaneの法線の距離をそれぞれピクセルごとに計算しており、Planeと円柱の距離が近くなればなるほどそれぞれが接触しているという判断ができます。

 この値は0以上の値を持ち、色情報として扱う場合0~1の間にクランプしたいためsaturateノードをつなぎます。

 最後にInvertColorを使用して0、1を反転させることで交差点が白く表示されるようになります。

 

以上でオブジェクト同士の交差点を取得できました。