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

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

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

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

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

シャドウカスケード

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

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

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

These staged reductions in shadow map size are known as cascaded shadow maps (sometimes called “Parallel Split Shadow Maps”). From the Quality window, you can set zero, two or four cascades for a given quality level.

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

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

シャドウディスタンス

Shadows from objects tend to become less noticeable the farther the objects are from the camera; they appear smaller onscreen and also, distant objects are usually not the focus of attention. Unity lets you take advantage of this effect by providing a Shadow Distance property in the Quality window. Objects beyond this distance (from the camera) cast no shadows at all, while the shadows from objects approaching this distance gradually fade out.

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

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

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

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

シャドウパンケーキ

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

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

上のダイアグラムでは、

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

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

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

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

You can tweak the Shadow Near Plane Offset property from the Quality window to avoid this problem. This pulls back the near clip plane. However, setting this value very high eventually introduces shadow acne, because it raises the range that the shadow map needs to cover in the light direction. Alternatively, you can also tesselate the problematic shadow casting triangles. See the bias section in Shadow Overview for more information.

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