Version: 5.6
ライティングモード

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

ディレクショナルライトは一般に太陽光のシミュレーションとして使われ、ライト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 Distance よりも近くにある場合は、Unity は、Shadow Distance の距離でなく、ファークリップ面の距離を使用します。

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

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

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

シャドウパンケーキ

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

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

上のダイアグラムでは、

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

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

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

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

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

ライティングモード