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

Unity のライトは、ゲームオブジェクトからその他の部分や、または、近くにあるゲームオブジェクトへと を落とすことができます。影によってシーンにある程度の奥行やリアル感が加わります。なぜなら、影は、それなしでは平坦に見えるゲームオブジェクトに縮尺やオブジェクト位置を与えるからです。

オブジェクトが影を落しているシーン
オブジェクトが影を落しているシーン

影はどのように作用するか

単純なケースとして、1つのライトソースがあるだけの単純なシーンをイメージしてください。光線は、光源から直線的に移動し、やがてシーン内にあるオブジェクトにぶつかります。光線がオブジェクトにぶつかると、さらにその先へ進んで何かを照らすことはできません (光線は最初のオブジェクトにあたって跳ね返り、通過しません)。ゲームオブジェクトから投げられた影は、単に、光線が到達できないために照らされていない領域です。

別の見方として、光と同じ位置にカメラがあるのをイメージしてください。そうすると、影の部分は、カメラでは見ることのできない領域と同じになります。

同じシーンの光の視点
同じシーンの“光の視点”

実際、これがまさに、Unity がライトからの影の位置を決定する方法です。ライトは、カメラがその視点から内部的にシーンを「レンダリング」するのと同じ原理を使用しています。カメラで使用されるデプスバッファシステムは、ライトに最も近い面をトレースします。見通しのきく表面が照明を受けて明るくなりますが、他のすべては影となり暗くなります。この場合のデプスマップは Shadow Map (詳細は Wikipedia Pageを参照してください) として知られています。

影を有効にする

Inspector の Shadow Type プロパティーを使って個々のライトに対する影を有効にし定義します。

プロパティー 機能
Shadow Type Hard Shadows を選ぶと、エッジのくっきりしたシャドウを生成します。Hard shadows は Soft Shadows に比べて特に現実的なわけではありませんが、処理が少なく多くの場合で許容できます。Soft shadows は、シャドウマップからギザギザのエイリアシングを減少させる傾向もあります。
Strength シャドウの濃さを決定します。一般に、ライトは大気によって拡散され、他のゲームオブジェクトに反射します。そのため通常は、シャドウの Strength を最高に設定することはありません。
Resolution 前出のシャドウマップの「カメラ」のレンダリング解像度を設定します。シャドウのエッジがとてもはっきり見える場合は、この値を上げるとよい場合があります。
Bias シャドウの位置と鮮明さの微調整を行います。詳しくは後述の シャドウマップと Bias プロパティー を参照してください。
Normal Bias シャドウの位置と鮮明さの微調整を行います。詳しくは後述の シャドウマップと Bias プロパティー を参照してください。
Shadow Near Plane シャドウをレンダリングするときに、ニアクリップ面の値を選択できます。ライトとの距離がこの距離より短いオブジェクトはシャドウを作りません。

シーンの各 メッシュレンダラーCast ShadowsReceive Shadows プロパティーを持ち、必要に応じて有効にする必要があります。

Cast Shadows のドロップダウンで On を選択しすると、メッシュの投影を有効にします。Two Sided を選択すると、メッシュのどちらの面にでも投影することができます (そのため、バックフェースカリングは投影目的では無視されます)。Shadows Only は不可視のゲームオブジェクトから投影できます。

シャドウマッピングと Bias プロパティー

指定されたライトの影はシーンの最終的なレンダリング中に決定されます。シーンが Main Camera のビューにレンダリングされるとき、ビュー内の各ピクセル位置はライトの座標システムに変換されます。それから、ライトからのピクセル距離がシャドウマップの対応するピクセルと比較されます。ピクセルがシャドウマップのピクセルよりも離れている場合、おそらく別のオブジェクトによってライトから隠され、それは照射されません。

正常な影
正常な影

直接ライトによって照らされる面は時々部分的に影があるように見えることがあります。正確にシャドウマップで指定された距離でなければならないピクセルが、時々ずっと遠くにあるように計算されるためです(シャドウフィルタリング、または、シャドウマップのために低解像度画像を使用した結果)。その結果として、実際には照らされなければならないのに、「シャドウアクネ(Shadow acne)」と言われるピクセルの任意の模様が影に生じます。

アーティファクトの形状をした誤った影を落とすシャドウアクネ
アーティファクトの形状をした誤った影を落とすシャドウアクネ

シャドウアクネを避けるために、シャドウマップの距離に Bias 値を加え、数値の境目にあるピクセルが確実に比較にとおるようにします。または、シャドウマップにレンダリングする間に、ゲームオブジェクトが法線に沿って少し差し込まれるようにします。これらの値は、影が有効の時に Light Inspector ウィンドウの BiasNormal Bias プロパティーによって設定されます。

バイアス値をあまり高く設定しないでください。なぜなら、影を投影するオブジェクトの近くにある影の領域は時々誤って照らされることがあるからです。この結果、オブジェクトから離れた影となり、ゲームオブジェクトが空中に浮かんでいるように見えます。

あまりにも Bias 値を高くすると、影がオブジェクトから「離れている」ように見えます
あまりにも Bias 値を高くすると、影がオブジェクトから「離れている」ように見えます

同様に、Normal Bias 値をあまり高く設定すると、ゲームオブジェクトに対し、影が狭すぎてしまいます。

Normal Bias 値を高くし過ぎると、シャドウの幅がとても狭くなります
Normal Bias 値を高くし過ぎると、シャドウの幅がとても狭くなります

ある場合は、Normal Bias が「ライトブレンディング」と呼ばれ、ライトが近くの形状から投影される領域に漏れてしまう、望まないエフェクトの原因になることがあります。可能なソリューションはゲームオブジェクトのMesh Renderer を開き、 Cast Shadows プロパティーを Two Sided にします。これにより、よりリソース負荷が高くなり、シーンをレンダリングするときにパフォーマンスオーバーヘッドが増加しますが、解決する場合があります。

ライトの Bias 値には、望まないエフェクトが発生しないように微調整が必要な場合があります。一般に、計算するよりも目測で値をとる方が簡単です。

さらに、シャドウアクネを避けるために、シャドウパンケーキ ( ディレクショナルライトのシャドウ: シャドウパンケーキ を参照) という技術を使用します。一般的に、この方法は効果的です。しかし、とても大きな三角形には、視覚的なアーティファクトが発生します。

プロパティーの Shadow Near Plane Offset 値が低いと、シャドウに穴が開いたように見えます
プロパティーの Shadow Near Plane Offset 値が低いと、シャドウに穴が開いたように見えます

プロパティーの Shadow Near Plane Offset 値を適切に調整すると、この問題は解決されます。この値をあまり高く設定すると、シャドウアクネが発生します。

正常なシャドウ
正常なシャドウ
ディレクショナルライトの影