Version: 2019.3
言語: 日本語
グローバルイルミネーション

ディレクショナルライトのシャドウ

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

カメラから距離のある影 (A) は適切な解像度で表示され、カメラに近い影 (B) には透視エイリアシングが発生する
カメラから距離のある影 (A) は適切な解像度で表示され、カメラに近い影 (B) には透視エイリアシングが発生する

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

シャドウカスケード

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

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

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

このような段階的なシャドウマップサイズの削減は カスケードシャドウマップ (「平行分割シャドウマップ」とも呼ばれます) として知られています。Quality ウィンドウから、任意の品質レベルに 0、2、または 4 つのカスケードを設定できます。

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

前述の、4 つのカスケードのある影の例
前述の、4 つのカスケードのある影の例

シャドウディスタンス

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

Set the shadow distance as low as possible to help improve rendering performance. This works because distant objects do not need to be rendered into the shadow map at all. Additionally, the Scene often looks better with distant shadows removed. If the current camera far plane is smaller than the shadow distance, Unity uses the camera far plane instead of the shadow distance.

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

シーンビューには、シーンのパーツを異なるカスケードレベルごとに色分けして表示する Shadow Cascades と呼ばれる 描画モード があります。これを使うと、シャドウディスタンス、カスケード数、カスケードの分割の割合を丁度正しい値を得るのに役立ちます。この視覚化は、通常、シャドウディスタンスよりも大きいシーンビューのファークリップ面を使っています。ですから、カメラのゲーム内の挙動を小さなファークリップ面に一致させたい場合は、シャドウディスタンスを小さくする必要があるかもしれません。

シーンビューでの Shadow Cascade 描画モード
シーンビューでの Shadow Cascade 描画モード

シャドウパンケーキ

さらに、シャドウアクネを避けるために シャドウパンケーキ という技術を利用できます。照明方向に沿ってシャドウマップをレンダリングするときに、使用する照明空間の範囲を減らすという考えです。結果として、シャドウマップをより正確にし、シャドウアクネを削減します。

シャドウパンケーキの原理を表現する図
シャドウパンケーキの原理を表現する図

上のダイアグラムでは、

  • 薄青の輪 はシャドウを投影するものを表しています。
  • 濃い青の四角 は元の照明空間を表しています。
  • 緑の線 は最適化されたニアクリップ面 (視錐台からみえない影を投じるものはすべて除外) を表しています。

影を投影するものを (頂点シェーダーの) 最適化された空間のニアクリップ面に固定します。一般的にこの方法は効果的ですが、そのニアクリップ面を横切るとても大きな三角に関しては、アーティファクトを発生することがあります。

大きな三角に発生する問題
大きな三角に発生する問題

この場合、青い三角の頂点の 1 つを最適化されたニアクリップ面の範囲内に置きます。ただし、ここうすると、三角の形状を変えるため、正しくない影を作成してしまうことがあります。

Quality ウィンドウの Shadow Near Plane Offset プロパティ を微調整してこの問題を避けることができます。調整することにより、ニアクリップ面を後ろにずらします。ただし、これをとても高い値に設定すると、結果的にシャドウアクネが発生します。なぜなら、シャドウマップが照明方向に沿って処理する必要がある範囲が増加するからです。その他の方法として、問題がある投影の三角をテッセレーションすることもできます。詳しくは シャドウBias セクションを参照してください。

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