テラシュールブログ

旧テラシュールウェアブログUnity記事。主にUnityのTipsやAR・VR、ニコニコ動画についてのメモを残します。

【Unity】PostProcessingStackの被写界深度のピントを動的に変更する

今回は被写界深度(Depth of Field)…ピントがあっていないモノがボケる表現についてです。

f:id:tsubaki_t1:20180312105940j:plain

この被写界深度、何処にフォーカスを当てるのかが重要なポイントの一つなのですが、ImageEffect(Cinematic Image Effectや通常のImageEffect)と異なりPostProcessingStack(PPS)では変更が難しいです。

 

f:id:tsubaki_t1:20180312105231g:plain

今回はソレを何とかします。

 

PPSのピントの距離変更はCinemachineが必要

理由は単純で、設定がScriptableObjectに格納されているためです。*1ScriptableObject(Asset)にデータを書き込むと、大本のScriptableObjectにも変更が影響してしまうので、出来れば行うべきではない…という感じです。

Resettable Scriptabel Objectしてくれればこんな面倒な話は無いんですが…

 

これを、カメラ制御を担当するCinemachinePost FXで解決します。


CinemachinePost FXを導入

Post Processing Stack(PPS)にはピントを動的に変更する機能はありません。なのでCinemachineののパッケージを導入する必要があります。
ただしこのCinemachineの追加パッケージ、PPSのコードに密結合しており、PPSのバージョンによって導入するパッケージが変わります。

Post Processing Stack V1*2

Post Processing Stack V2*3

f:id:tsubaki_t1:20180311183629j:plain

このメニュー項目が無い場合はChinemachineが入っていないか、コードがコンパイル出来ない状態です。

 

PostProcessing Stack v1の場合

まずはPost Processing Stack v1の場合です。
最初はPPS側の設定でDOFを有効にします。

  1. CameraのRendererModeをDeferredに設定
  2. Asset>CreateからPost Process Profileを作成
  3. PostProcess BehaviourコンポーネントをMainCameraに追加し、
    作成したPostProcessProfileのDepth Of Fieldを有効にする
  4. PostProcessBehaviourに作成したPostProcessProfileを設定

f:id:tsubaki_t1:20180311184540j:plain

これでとりあえずDoFが有効になります。ならない場合は…多分どっか間違ってます。この記事か、手順か、他何らかの理由か。

 

上手くいったら次はCinemachine Post FXをメインカメラ…PostProcessingBehaviourコンポーネントのついているオブジェクトに追加します。

追加したら、Cinemachine Post FXのProfileに先程作成したPostProcessing Profileを設定します。

f:id:tsubaki_t1:20180311184218j:plain

フォーカスを有効にするには、Focus Tracks Targetにチェックを入れておきます。


では、対象となるフォーカスはどうやって決めているのか? 
これはCinemachineがLookAtしているオブジェクトです。

f:id:tsubaki_t1:20180311185240j:plain

これでVirtual Cameraが有効なオブジェクトへ自動的にフォーカスがあたるようになります。

例えば下の場合、手前をフォーカスするVirtual Cameraと奥をフォーカスするVirtual Cameraを切り替えています。

f:id:tsubaki_t1:20180311192234g:plain

ただしF値はフェードで変更出来ないので(差し替える事はできる)、その辺りは注意が必要です。

Post Processing Stack V2の場合

Post Processing Stack V2の場合も似たような感じです。
まず導入についてはコチラ

【Unity】PostProcessingStack v2を使ってみる - テラシュールブログ

 

さて、今回設定する上でPPS v1とPPS v2で大きく違うのは、PPS v1はメインカメラに設定を置きましたがPPS v2ではVirtual Camera毎に設定します。

 

  1. Virtual CameraのExtensionsからCinemachinePostProcessingを追加
  2. Focus Tracks targetにチェック
  3. Profileを追加し、Add EffectでDepth Of Fieldを追加
  4. Focus Distanceにチェックを入れて、変更可能にする

f:id:tsubaki_t1:20180311195137j:plain

f:id:tsubaki_t1:20180311195228j:plain

これでエフェクトがブレンドします。
PPS v2の場合はv1と異なり、ApertureやFocal Length等もフェード出来るのが良いです。

f:id:tsubaki_t1:20180312112840g:plain

*1:PostProcessのような膨大な設定項目を毎回インスタンスするとコストがかなり高いので、インスタンス回数を減らそうというアイディアと思われ。実はParticleにも同じ様な問題がある

*2:2018年3月現在、AssetStoreで配布されているもの

*3:Packagemanagerで入手するもの