2017年9月26日

Unity 影が離れてしまったときは…


影がオブジェクトから離れてる!というときにまず確認するポイントをメモメモ…



※このページの内容の動作確認にはUnity5.6を使用しています。
オブジェクトを接地するように移動させたとき「あれ?なんか影がポリゴンにくっついてないぞ…」という現象に出くわすことがあります。影を忘れたピーターパンにちなんで"Peter Panning"なんてシャレた名前で呼ばれている現象なのですが、特に板ポリのような薄いオブジェクトだとかなり不自然で目立ちますよね。そういうときはとりあえず次の項目を確認してみてください。

手前の草と地面の間に不自然な隙間が

1. ライトのBias値をできるだけ下げる


オブジェクトを照らしているライトの設定項目にあるBiasの値をめいっぱい下げてみましょう。0に設定してみて影がくっつくようならこれが原因です。ただし0にすると変な縞模様やウニョウニョとした模様が出てしまうので、模様が出ないギリギリの値にします。


ちなみにBiasを0にしたときのこの模様には"Shadow Acne"という名前がついています。これは影をつける処理で誤差が生じたことが原因で起こる現象です。Unityでは影を描画するため「シャドウマップ」と呼ばれるテクスチャに物体の位置関係を書き込んでいくわけですが、シャドウマップの解像度にも限界があり、すべての情報を書き込めるわけではありません。1テクセル(テクスチャの1つの点)ごとに情報を格納していく過程でどうしても値が丸められてしまい、誤差が生じてしまうというわけです。そしてBiasとは、そのShadow Acneを解決する方法なのですが…詳しくはこちらのページにすごくわかりやすくまとめられているので(コードはまだよくわかんないけど)是非ご覧ください。

Shadow Acne の例 (左が低解像度 右が高解像度)

Biasをどう変更しても影のつき方が変わらない!という場合は…


2. QualitySettingsのShadows関連の設定を見直す


Edit -> Project Settings -> Quality と選択していき、表示されるQualitySettingsの項目をいじってみましょう。

まず「どの距離まで影を描画するか」を示すShadow Distanceの値をほどほどに小さくします。この値が大きすぎると描画範囲がムダに広くなってしまい影のつき方が「雑」になるようです。

次に、Shadow Projectionが"Stable Fit"に設定されている場合は"Close Fit"にしてみてください。Close Fitにすると高解像度でレンダリングされるため、影がぼやけず隙間が埋まる場合があります。ただしShadow Distanceの値によってはカメラを動かしたときに影が微妙にちらちらと揺れたりすることがあるので注意。

Shadow Cascadesは簡単に言うと「近くの影は詳細に、遠くの影は大雑把に」描画するための設定です(詳しくはこちら)。カメラが一定距離離れたときだけなんか影がおかしくなる、という場合はこの設定を見直しましょう。

たいていはこの1.と2.で解決すると思うのですが…


3. オブジェクトの位置とライトマップが一致しているか再確認する


Staticなオブジェクトの影をライトマップに焼きつけた状態で、Realtimeな影がオフに設定されているというパターン。影の位置は固定なのでオブジェクトが本来の位置からズレるとおかしくなります。「なんかよくわからんけど遠距離の影だけズレてる!」という場合はこれかも。"Lighting"ウィンドウから影を焼き直しましょう。



4. シェーダを疑う


デフォルトのシェーダ以外を使用している場合は、念のためシェーダの処理を確認してみてください。実は頂点を移動して変形させているのに影は元のままだとか、描画順がおかしいとか、そもそもdiscardやclip()で物体ごと消しちゃってるとか…。考えられる理由は様々です。



…以上、今のところざっと思いつくのはこんな感じでしょうか。

「シーンやプロジェクトの設定はこれ以上変えられない!でもこのオブジェクトの影だけはなんとか誤魔化したい!」という場合は、シェーダを使って影の位置を少しずらす、みたいな対処になるのかな(よくわかりましぇん)。あるいはもっと手っ取り早く、影専用の別オブジェクトを配置して隙間を埋める(Mesh Rendererで"Shadows Only"に設定しておく)なんていう方法でも意外と誤魔化せたりして…

0 件のコメント:

コメントを投稿