Light のトラブルシューティングとパフォーマンス

ディレクショナルライトの影

ディレクショナルライトの典型的な使われ方として太陽光のシミュレーションがあり、一つのライトでシーン全体を照らすことができます。つまり多くの場合、シャドウマップがシーンの大部分を一気に覆うことになる訳ですが、このことで、シャドウが「パースペクティブ・エイリアシング」という問題の影響を受けやすくなります。これは簡単に言うと、カメラ近くのシャドウマップのピクセルが、遠くにあるものと比較して、拡大されて「粗く」見えるというものです。

カメラに近いシャドウにパースペクティブ・エイリアシングが起こっている
カメラに近いシャドウにパースペクティブ・エイリアシングが起こっている

パースペクティブ・エイリアシングは、Soft シャドウ使用時およびシャドウマップの高解像度を使用している場合は目立ちにくくなります。しかし、これらの機能を使用するとグラフィックスハードウェアへの負担が大きくなるため、フレームレートに悪影響を及ぼす可能性があります。

シャドウカスケード(Shadow Cascades)

パースペクティブ・エイリアシングが起こる理由は、シャドウマップのそれぞれのエリアのスケールがカメラの視点から不均衡に見積もられるからです。あるライトによるシャドウマップは、シーン内のカメラから見える範囲だけを覆っている必要があります。その範囲はカメラの視錐台を理解する によって決まります。ディレクショナルライトが真上から当たっている単純なケースを想像すれば、錐台とシャドウマップの関係が分かりやすいでしょう。

錐台の遠端ではシャドウマップは 20 ピクセル分カバーされており、近端では 4 ピクセルのみカバーしています。ですが、両端は 同じサイズ のスクリーン上で表示されます。この結果として、マップの解像度はカメラに近くなるほど影の範囲の影響が少なくなります。(実際には、解像度は 20x20 よりも大きく、マップは通常カメラ上で正方形にはならないことに注意してください)

すべてのマップを高解像度化すると、“chunky” なエリアへの影響を減らす事ができますが、これは、メモリーと、レンダリング時の帯域を、より多く消費します。シャドウマップの広い部分が、円錐の近端では二度と表示されないため無駄になるとは言え、ダイアグラムに注意した方がよいでしょう; また、カメラから遠く離れた影の解像度も高くなりすぎます。円錐エリアは、カメラからの距離を基準にして、分割することができます。 近端のゾーンでは、縮小サイズ(ですが解像度は同じ)の分離したシャドウマップを使用することができます。ピクセル数は均一になります。

このように段階的にサイズを小さくしたシャドウマップは カスケード式シャドウマップ(cascaded shadow maps) または、パラレルスプリットシャドウマップ(Parallel Split Shadow Maps)と呼ばれます。画質設定 から、ひとつのクオリティレベルに対して0、2、または4つのカスケードを設定できます。

カスケードを多く使えは使う程、パースペクティブ・エイリアシングがシャドウに与える影響は小さくなりますが、数を多くすると描画のオーバーヘッドが発生します。とは言えこのオーバーヘッドは、シャドウ全体に高解像度のマップを使用した場合よりはまだ少なくて済みます。

前述の、4つのカスケードのあるシャドウの例
前述の、4つのカスケードのあるシャドウの例

: モバイルプラットフォームの場合、ディレクショナルライトにはシャドウカスケードは使用できません。

シャドウディスタンス(Shadow Distance)

オブジェクトからの影は、オブジェクトがカメラから遠くにあると注目されなくなります。画面上に小さく表示され、遠いオブジェクトも普通は注意をひかないからです。Unity では 画質設定Shadow Distance プロパティーで、この効果を利用できるようにしています。オブジェクトの影が徐々にフェードアウトするこの距離に近づくまで、(カメラからの)距離を超えたオブジェクトには影が落ちません。

shadow distance をできるだけ低く設定すると、遠くのオブジェクトをシャドウマップにレンダリングする必要が無くなるので、レンダリングのパフォーマンスを改善するのに役立ちます。それだけでなく、遠くの影が排除されたシーンの方が、見栄えが良くなる事が多いです。モバイルプラットホームでは、シャドウカスケードをサポートしていないので、shadow distance を正しく設定することが、パフォーマンスのために特に重要です。

シャドウを可視化してパラメーターを調整

Scene view は、シーンのパーツを異なるカスケードレベルごとに色分けして表示する Shadow Cascades と呼ばれる シーンビューコントロールバー を持っています。これは、shadow distance 、cascade count それに cascade split ratios を調べるのに都合が良く、役に立ちます。

シーンビューでの Shadow Cascade 描画モード
シーンビューでの Shadow Cascade 描画モード
Light のトラブルシューティングとパフォーマンス