ライティングモード

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

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

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

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

シャドウカスケード

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

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

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

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

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

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

シャドウディスタンス

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

シャドウディスタンスをできるだけ低く設定すると、遠くのオブジェクトをシャドウマップにレンダリングする必要が無くなるので、レンダリングのパフォーマンスを向上させるのに役立ちます。それだけでなく、シーンは、しばしば、遠くの影が排除されている方が、見栄えが良くなる事が多いのです。モバイルプラットホームでは、シャドウカスケードをサポートしていないので、シャドウディスタンスを正しく設定することが、パフォーマンスのために特に重要です。使用中のカメラのファークリップ面がシャドウディスタンスよりも近くにある場合は、Unity は、シャドウディスタンスでなく、ファークリップ面の距離を使用します。

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

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

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

シャドウパンケーキ

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

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

上のダイアグラムでは、

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

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

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

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

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

ライティングモード