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 Shadows と Receive Shadows プロパティーを持ち、必要に応じて有効にする必要があります。
Cast Shadows のドロップダウンで On を選択しすると、メッシュの投影を有効にします。Two Sided を選択すると、メッシュのどちらの面にでも投影することができます (そのため、バックフェースカリングは投影目的では無視されます)。Shadows Only は不可視のゲームオブジェクトから投影できます。
指定されたライトの影はシーンの最終的なレンダリング中に決定されます。シーンが Main Camera のビューにレンダリングされるとき、ビュー内の各ピクセル位置はライトの座標システムに変換されます。それから、ライトからのピクセル距離がシャドウマップの対応するピクセルと比較されます。ピクセルがシャドウマップのピクセルよりも離れている場合、おそらく別のオブジェクトによってライトから隠され、それは照射されません。
直接ライトによって照らされる面は時々部分的に影があるように見えることがあります。正確にシャドウマップで指定された距離でなければならないピクセルが、時々ずっと遠くにあるように計算されるためです(シャドウフィルタリング、または、シャドウマップのために低解像度画像を使用した結果)。その結果として、実際には照らされなければならないのに、「シャドウアクネ(Shadow acne)」と言われるピクセルの任意の模様が影に生じます。
シャドウアクネを避けるために、シャドウマップの距離に Bias 値を加え、数値の境目にあるピクセルが確実に比較にとおるようにします。または、シャドウマップにレンダリングする間に、ゲームオブジェクトが法線に沿って少し差し込まれるようにします。これらの値は、影が有効の時に Light Inspector ウィンドウの Bias と Normal Bias プロパティーによって設定されます。
バイアス値をあまり高く設定しないでください。なぜなら、影を投影するオブジェクトの近くにある影の領域は時々誤って照らされることがあるからです。この結果、オブジェクトから離れた影となり、ゲームオブジェクトが空中に浮かんでいるように見えます。
同様に、Normal Bias 値をあまり高く設定すると、ゲームオブジェクトに対し、影が狭すぎてしまいます。
ある場合は、Normal Bias が「ライトブレンディング」と呼ばれ、ライトが近くの形状から投影される領域に漏れてしまう、望まないエフェクトの原因になることがあります。可能なソリューションはゲームオブジェクトのMesh Renderer を開き、 Cast Shadows プロパティーを Two Sided にします。これにより、よりリソース負荷が高くなり、シーンをレンダリングするときにパフォーマンスオーバーヘッドが増加しますが、解決する場合があります。
ライトの Bias 値には、望まないエフェクトが発生しないように微調整が必要な場合があります。一般に、計算するよりも目測で値をとる方が簡単です。