【Resonite】Depthカメラの作り方
Resoniteでdepthカメラを作るためのdepthテクスチャを得る方法を記述します.
撮影周りの機能については記述しません.
結論
上の説明で理解できたなら,以下は読まなくても問題ありません.
本記事において,コンポーネントは名前の後に<comp>と記述します.
例.MeshRendererコンポーネント:MeshRenderer<comp>
手順
step 0. カメラの用意
depthカメラの作成にあたり,まず,基本的なカメラを作成します.
Cameraスロットには,Camera<comp>とRenderTextureProvider<comp>を追加し,Camera<comp>のRenderTextureにRenderTextureProvider<comp>を適用してください.これによって,カメラの映像をテクスチャとして得られます.
Previewは,カメラの映像を出力するディスプレイです.
お好きな方法でGridを追加し,UnlitMaterialを適用してください.次に,UnlitMaterialのTextureにCameraスロットのRenderTextureProvider<comp>を適用してください.
ここまでで,次のようなものができます.
step 1. Depth Materialを適用したQuadの作成
Depth FileterスロットにQuadを追加し,DepthMaterialを適用してください.また,DepthMaterialのclipフィールドにチェックを入れてください.
これで,近い物体ほど黒く表示するQuadが得られました.
step 2. Depth Filterをカメラで撮る
1で作成したQuadがカメラのフレームいっぱいに収まる範囲で,Quadをカメラの前方に動かしてください.
このカメラの映像はCameraスロットのRenderTextureProviderから受け取れます.
Depthカメラの作り方としては,以上です.
応用:立体カメラ
以上で得たカメラからの出力は,そのままDepthテクスチャとして利用できます.
その一例として,最後に,近くにあるものほど出っぱって表示されるカメラを作成しましょう.
作り方は次の通りです.
カメラを2つ用意する:colorカメラとdepthカメラ
PreviewのマテリアルをPBS_DisplaceMetallicに変更して,Textureにcolorカメラの出力を,VertexDisplaceMapにdepthカメラの出力を適用する.
step 1. カメラの用意
colorカメラを用意しましょう.
上で作ったCameraスロットをコピーする
コピーしたスロットのCamera<comp>のExcludeRenderにDepth Filterスロットを追加する
colorカメラにはdepthマテリアルのかかったQuadは写したくないので,上述2の手順を行います.
ちなみに,colorカメラとdepthカメラの違いは,depth filterを通すか否かだけです.
step 2. depthに従ってPreviewを出っ張らせる
PBS_DisplaceMetallicマテリアルは,depthテクスチャに従ってメッシュを凸凹させるマテリアルです.このマテリアルをPreviewに(UnlitMaterialの代わりに)適用しましょう.
色情報として,PBS_DisplaceMetallicのAlbedoTextureにcolorカメラスロットのRenderTextureProviderを適用する.
深度情報として,PBS_DisplaceMetallicのVertexDisplaceMapにdepthカメラスロットのRenderTextureProviderを適用する.
デフォルトでは白を手前に,黒を奥に変形させます.今回は近くのものほど出っ張らせたいので,結果を反転させるためにVertexDisplaceMagnitudeを負の値にします.絶対値の大きさは出っ張り具合です.お好きなように.
最後に,VertexDisplaceBiasで位置を調整します(VertexDisplaceMagnitudeの値を反転した値を入れればよいです).
以上で,depthに従って Preview のメッシュが凸凹します.
Gridのデフォルトのメッシュの頂点数を増やしたりdepthフィルターが表示する距離の範囲を調整すると以下のようになります.
参考
本記事の内容のための分析において,orange氏のDeliciousCamおよびN-JELLY氏のPOP cameraを参考にしました.
また,Depth Materialの使い方は以下の動画を参考にしました.
この記事が気に入ったらサポートをしてみませんか?