Unityで焦点が合っていない部分をぼかす

今回はUnityのStandardAssetsに入っているDepthOfFieldとTilt Shiftを使い焦点の合わないゲームオブジェクトをぼかして表示してみます。

スポンサーリンク

Depth Of Field

Depth Of Fieldを使用すると焦点が合っていない部分をぼかして表示する事が出来ます。

カメラのインスペクタからAdd Component→Image Effects→Camera→Depth Of Field(Lens Blur, Scatter, D)を選択します。

DepthOfFieldのインスペクタ

Defocus TypeでDisc BlurとDX11が選択出来、それぞれ設定項目が変わります。

まずは共通項目であるFocal Settingsの部分を見ていきましょう。

Visualizeは焦点が合っている部分と合っていない部分を単純に見える化するかどうかです。黒い部分が焦点が合ってる部分です。
Focus On Transformは焦点対象を設定出来ます(キャラクターをフォーカスするならキャラクターを設定する)。
Focal Distanceはカメラから焦点面までの距離
Focal Sizeは焦点のサイズ
Apertureは焦点の合っている部分と合っていない部分のカメラの絞りの設定みたいです。よくわかりませんが・・・(^_^;)

次にDefocus TypeをDisc Blurにした時の設定です。

Sample Countはフィルタタップの量
Max Blur Distanceはフィルタタップの最大距離
High Resolutionにチェックを入れると不要なノイズを低減します。
Near Blurにチェックを入れると前景領域の重ね合わせを行います。パフォーマンスコストが大きくなります。
Overlap Sizeは前景の重ね合わせの領域の大きさです。

専門的すぎてよくわかりません・・・・・(^_^;)

Defocus TypeをDX11にした場合DX11 Bokeh Settingsが表示されます。

Bokeh Textureはボケの形状のテクスチャ
Bokeh Scaleはボケのテクスチャのサイズ
Bokeh Intensityはボケの強度
Min Luminanceはこの値より明るいピクセルにだけボケが投影されます。
Spawn HeuristicはUnityマニュアルに

Bokeh 形状は、クエスチョンのピクセルが頻度チェックをパスした場合にのみキャストされます。

とありますが、よくわかりません。

値は0.1ぐらいがいいと書いてあります・・・・・(-_-)

Defocus TypeをDX11にして使用するにはShader Model 5が必要みたいで、わたくしのパソコンでは出来ませんでした・・・。

なのでDefocus TypeをDisc Blurにして試してみます。

↑のようになりました。

Depth Of Fieldを使うと焦点を合わせる対象を設定出来るのが便利ですね。

Tilt Shift

Tilt Shiftを使うとカメラの描画画面の中心に垂直方向と放射状に焦点を合わせ周りをぼかす事が出来ます。

Tilt Shiftのインスペクタ

ModeはTilt Shift Mode(垂直方向)とIris Mode(放射状)が選択出来ます。
Qualityはぼかしの量でPreviewを選択するとDepthOfFieldのVisualizeと同じように焦点を視覚的に見る事が出来ます。
Max Blur Sizeはブラ-の効く最大距離
Blur Areaはぼかしの領域と強度

になります。

それでは実行して確認してみましょう。

↑のようになりました。

カメラの中心に焦点を当て他をぼかすという単純な場合はこちらの方が簡単に出来ますね。(^_^)v

参考サイト

UnityマニュアルーDepth of Fieldー

Unityマニュアルーティルトシフトー

スポンサーリンク

記事をシェアして頂ける方はこちら

フォローして頂くとやる気が出ます

コメント

  1. shiroshiro より:

    返信が遅れてしまい申し訳ありません。
    ご丁寧な回答本当にありがとうございました。
    いろいろと試行錯誤をし、実装したいコンテンツの内容も考え、ブラーの強度を変更できるすりガラスのようなマテリアルを内側にも適用したsphereをカメラを覆うように配置し、sphereの内側と視線のrayの衝突位置に、

    ttp://onoty3d.hatenablog.com/entry/2015/03/12/204630

    のサイトを参考にした球体を配置して、視線位置を高解像度にする方法をとりました。
    しかし、sphereの外側から出たrayであればsphereと衝突した部分を球体が移動してくれるのですが、sphereの内側にrayの起点を置くと、sphereよりも大きい半径で球体が宙を移動するような挙動になってしまいます。

    ttps://qiita.com/mechamogera/items/166f7486323e171356b4

    このサイトをもとにしましたがうまくいきません。このサイトに問題があるのか、それとも私の実装に問題があるのかだけでも知りたいです。
    質問ばかりで申し訳ありませんが、ご回答いただけると幸いです。

    • URLの最初のhだけ消させて頂きました。(._.)

      2番目のサイトで行っているのはコライダは表面だけで判定する為にSphere等のメッシュをコピーして面を反転(normalを反転)したものを作成している処理のようです。

      スクリプトの詳細は大変なので見てませんが、そのまま適用するとうまくいかなかったのでReverseNormals2のStartメソッドを少し改造します。

      コピーして面を反転させたメッシュをMeshColliderに反映させ、その下にある処理をコメントにします。

      これでサンプルを作成してみました。

      スタンダードアセットのFPSControllerを使います。

      カメラであるFirstPersonCharacterにレイを飛ばすスクリプトを設定します。

      eyeMaskObjにはマスクに使用するオブジェクトを設定します。

      カメラを覆うSphereにMeshColliderを取り付けLayerにEyeというレイヤーを作成し設定、ReverseNormals2スクリプトを取り付けゲームオブジェクト登場時にコライダの反転処理を加えます。

      これでカメラから飛ばしたレイがカメラを覆うSphereにぶつかった時にその位置にマスク用のゲームオブジェクトを表示する事が出来ます。

      上の黒い表示部分がマスクのゲームオブジェクトです。

      やりたい事がこれかどうかはわかりませんが、こんなんなりました・・・(-_-)

      • shiroshiro より:

        お早くとても丁寧なご返事ありがとうございました。
        おかげさまでフォービエイテッドレンダリングのような機能を実装することができました。
        まだ実装したい機能はありますが、今後もこのブログを参考にさせてもらいながら実装していきたいと思います。
        助かりました。ありがとうございました。

  2. shiroshiro より:

    初めまして。よくこのブログを参考にさせていただいています。
    本題ですが、VRコンテンツでフォービエイテッドレンダリングのようなものを実装したいのですが、やり方が分からず行き詰っています。具体的には、全体にぼかしのかかった低解像度の表示の上に、視線の位置に合わせて自由に動く小さな高解像度の窓を開けるような機能を実装したいと考えています。視線はRayで取得方法は分かっています。どのようなアプローチが考えられますか?
    回答よろしくお願いします。

    • こんにちは、ブログを参考にして頂きありがとうございます。(^^)/

      VRコンテンツに関しては触っていないのでわかりませんが、右目、左目用のカメラを用意してそれぞれ表示するという感じでしょうか?

      フォービエイテッドレンダリングという用語も初めて聞きましたので、検索してみました。(^_^;)

      以前のバージョンのUnityのエフェクトでVignetteAndChromaticAberrationを使うと似たような機能を作成する事は出来ないでしょうか?

      https://gametukurikata.com/standardassets/effect-standardassets/vignetteandchromaticaberration

      カメラに設定し、Vignettingを0にし、Blurred Cornersの値を変化させるとカメラの中心位置に焦点が合い、他の部分はぼかされます。

      フォービエイテッドレンダリングの本来の目的である描画の処理負担が減るかどうかはわたくしにはわかりかねますが・・・・(^_^;)

      VignetteAndChromaticAberrationはカメラに設定するので、カメラの動きに合わせて中心が見え、周りがボケるという機能を作成出来ます。

      ただこのアセットは最近のUnityでは同梱されていないので、アセットストアで別途Legacy Image Effectsをダウンロードする必要があります。

      現在のUnityの標準エフェクト効果を与えるPostProcessingStackを使っても同じような事が出来ます。

      https://gametukurikata.com/standardassets/effect-standardassets/postprocessingstack

      しかし、コメントの文面を見るとFPSのようなものではなくて、TPSのように遠めのカメラがあってその画面内で窓枠をコントローラーやマウス等で移動出来るようにしてその中だけをクリア、それ以外をボカすということですかね?

      そうなるとちょっと難しそうですね・・・、やり方が思いつきません。

      • shiroshiro より:

        お早く丁寧なご返信ありがとうございます。

        自分ではかめくめさんのブログを参考にPostProcessingStackやDepth Of Fieldで試行錯誤してみたのですが、できなくて困っていました。
        ちなみにですが、HMDはFOVEを使っています。公式サイトで配布されているプラグインをプロジェクトのAssetsにインポートし、Fove Rigというprefabをヒエラルキーにドラッグするだけで、再生時に自動で二眼になるカメラを使うことができました。

        https://www.youtube.com/watch?v=GKR8tM28NnQ
        https://www.youtube.com/watch?v=Qq09BTmjzRs
        https://www.youtube.com/watch?v=lNX0wCdD2LA

        このような機能を実装したいと考えています。今回はあくまでフォービエイテッドレンダリングのようなものでいいので描画処理の軽減は考えていません。難しそうですかね…
        僕自身unityの機能はほとんど把握できていないので、詳しい方の助言が欲しく、不躾ながら質問させていただきました。

        • FOVEのUnity用のSDKをダウンロードして試してみました。

          が・・・・、やはりVR機器がないとエラーが出て確認出来ませんでした。(^_^;)

          FOVEのSDK自体にアイトラッキング?の目の移動箇所が鮮明に、他は荒く、といった機能があるかどうかまではわかりませんでした。

          FOVEのコミュニティで

          shiroshiroさんと同じような事をやりたい方が質問していました。

          https://support.getfove.com/hc/en-us/community/posts/115004658393-Unity-How-can-we-create-the-Depth-of-Field-in-FOVE-VR-

          そこのリンク先で両目それぞれ個別のカメラを設定するやり方のページにリンクされており、個別にカメラを設定すると出来るのかも?(グーグル翻訳してみましたが、個別にカメラを設定するだけかも?)

          https://support.getfove.com/hc/en-us/community/posts/115000925934-Applying-Unity-image-effect-post-processing-independently-to-each-eye-using-FoveInterface2

          で行っているようにFove Rigを使う場合は両目それぞれに対するカメラを作成しそれぞれのカメラにPostProcessingStackやImage EffectsのDepth Of Fieldの効果を加え、個別に割り当てて設定しても効果は出ないでしょうか?

          Depth Of Fieldを加えてもFoveの目のトラッキング部分だけクリアにはならないんですかね?

          ここら辺は試せないのでどのようにしたらいいかがわかりません。

          FOVEのサイトでUnityでFOVEを使うサンプルがあるんですが、

          https://github.com/FoveHMD/FoveUnitySample

          こちらのCameraにDepth Of FieldやImage Effectsの効果を加えて試してみるというのはどうでしょうか?

          わたくしも試したかったんですが、やはり機器がないとエラーで何も出来ないようです・・・・(-_-)