グローバルイルミネーション

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

ディレクショナルライトは一般に太陽光のシミュレーションとして使われ、ライト1灯でシーン全体を照らすことができます。そうすると、1枚のシャドウマップでシーンの大部分を覆うことになる訳ですが、これによって、シャドウが「パースペクティブエイリアシング」という問題の影響を受けやすくなります。パースペクティブエイリアシングとは、カメラに近いシャドウマップのピクセルが、遠くにあるものよりも拡大されて「粗く」見える現象です。

カメラから距離のある影 (A) は適切な解像度で表示され、カメラに近い影 (B) にはパースペクティブエイリアシングが発生している
カメラから距離のある影 (A) は適切な解像度で表示され、カメラに近い影 (B) にはパースペクティブエイリアシングが発生している

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

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

パースペクティブエイリアシングが起こるのは、シャドウマップの各エリアが、カメラの視点によって不均衡に拡大されてしまうためです。ライトによるシャドウマップは、カメラに映っている範囲だけに及んでいれば良く、その範囲はカメラの 視錐台 によって決まります。ディレクショナルライトが真上から当たっているシンプルな状態を想像すれば、錐台とシャドウマップの関係が分かりやすいでしょう。

錐台の遠端は 20 ピクセル分のシャドウマップで覆われていますが、近端を覆うのは、たった 4 ピクセルです。ですが、画面上にはどちらも 同じサイズ で表示されます。結果的に、カメラに近い影のエリアでは、マップの解像度が事実上、かなり低い事になります。(実際には、解像度は 20x20 よりもずっと高く、マップは通常カメラ上で正方形にはなりません)

すべてのマップを高解像度化すると、ある範囲が「粗く」みえる影響を減らす事ができますが、これは、メモリと、レンダリング時の帯域幅を、より多く消費します。しかしながら、図からわかるように、錐台の近端の部分は絶対に見えないため、シャドウマップの多くの部分が無駄になります。また、カメラから遠く離れたシャドウの解像度も高くなりすぎる傾向があります。錐台範囲は、カメラからの距離を基準にして、分割することができます。 近端の領域では、縮小サイズ (ですが解像度は同じ) の別のシャドウマップを使用できます。ですから、ピクセル数は均一になります。

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

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

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

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

Shadow Distance

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

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

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

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

シーンビューでの Shadow Cascade 描画モード
シーンビューでの Shadow Cascade 描画モード
グローバルイルミネーション