テラシュールブログ

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

【Unity】Shadow ProjectionのClose FitとStable Fitについて

今回はQualityの設定にあるShadow Projectionの設定について、少し説明が分かりにくかったので検証してみます。

f:id:tsubaki_t1:20161124233258j:plain

Shadow Projection

Quality SettingsのShadow Projectionのマニュアルを見てみます。

ディレクショナルライトから影を投影する 2 つの方法があります。Close Fit は高解像度の影をレンダリングするが、カメラのわずかな動きで揺れることがあります。Stable Fit は、低解像度の影をレンダリングするが、カメラの動きでは揺れません。

昨日のテクスチャに焼いた影とリアルタイムな影を混ぜる に書いた通り、Directional Lightの影は、Shadow Distanceの影響を強く受けます。Shadow Distanceの距離が広いと描画に使用するテクスチャの範囲が広大になるため、1mに使用できるテクスチャのピクセルが小さくなり、結果として影が荒くなります。

f:id:tsubaki_t1:20161124234513j:plain

この影の投影方法は実は二つのオプションがあります。

Stable Fit

初期設定であるStable Fitの場合、 Shadow Distanceの描画範囲は、オブジェクトの有無に関係なく利用されます。例えば300と指定した場合、遠方がせいぜい1mの距離しか無い場合であっても、300m分の影が作られます。*1
特にモバイルはShadow Textureのサイズが厳しいので、Unityの初期設定である150mなんて設定していると、かなり汚い影になります。
パフォーマンスや品質を考えると、Shadow Distanceはかなりよく考える必要がありそうです。

https://cdn-ak.f.st-hatena.com/images/fotolife/t/tsubaki_t1/20161123/20161123235624.jpg

なお、距離に応じてテクスチャの範囲を変化させるShadow Cascadeというオプションがあります。近距離は大きめの領域を使用し(6%の描画範囲が25%のShadowMapを使用)遠距離は小さめの領域(53%が25%を使用)を使います。
描画に追加の負荷がかかりますが、広範囲の影を描画したい場合、良い感じに描画してくれます。(PCの影がモバイルと比較して妙に綺麗なのは、コレのお陰です)

f:id:tsubaki_t1:20161125004223j:plain

translate.unity3d.com

Close Fit

Close Fitの場合、Cameraが見える範囲のオブジェクトに合わせてShadow Textureに描画する範囲を調整してくれます。つまり、Shadow Distanceが大きい値を持っていても、近いオブジェクトしか描画しない場合は非常にクォリティの高い影を使用してくれます。

これはどちらかと言えば、景色が動かない物向けです。またClose Fitの設定には幾つか注意すべき点があります。

f:id:tsubaki_t1:20161125000422j:plain

 あくまで描画範囲を設定しているだけ

注意すべきは、あくまで描画対象の距離に応じてShadowMapに使う範囲を設定してくれるだけという点です。遠距離に描画対象がある場合、それほど綺麗にはなりません。

下のように、遠方にオブジェクトが描画される場合、影はStable Fitと同じように汚くなります

f:id:tsubaki_t1:20161125003727j:plain

動かすと影がちらつく

Close Fitを使用している場合影がちらつく事があります。また上記のように描画対象の奥行きが変化する場合、影が動的に変わり、ちらつきます(左)。

これはShadow Distanceがある程度低く、かつQualityがHighの場合(右)はそこまで気にする物では無くなるかもしれません。

f:id:tsubaki_t1:20161125001253g:plain f:id:tsubaki_t1:20161125001517g:plain

描画判定はRecieve Shadow

ちなみにClose Fitの「描画対象となる判定」はRecieve Shadowみたいです。つまりキャラクターの近づかない遠方のモデルは Baked でライトマップを焼いておき、Recieve Shadowのチェックを外しておく事で、Close Fitの品質をある程度保てる訳です。

f:id:tsubaki_t1:20161125002745j:plain

 

勿論遠方にハイクォリティなLightmapを使うのは無駄なので、Scale In Lightmapの品質は下げておきます。

tsubakit1.hateblo.

感想

基本的にはStable FitでShadowDistanceを適切な値に設定*2、それが面倒ならClose Fitを設定するのが良さそうです。
Close Fitを使用する場合は、Recieve Shadowにチェックの入ったオブジェクトを遠距離に置かないように注意します。

関連

tsubakit1.hateblo.jp

tsubakit1.hateblo.jp

tsubakit1.hateblo.jp

*1:この距離はCameraのNearとFarの値でClampされます。まぁCameraのNaer-Farの初期設定は1000mな訳ですが

*2:150mとかは止める