Unity はリアルタイムの影をレンダリングするためにシャドウマッピングと呼ばれる技術を使用しています。
シャドウマッピングにはシャドウマップと呼ばれるテクスチャを使用します。シャドウマップは深度テクスチャに似ています。ライトは、カメラが深度テクスチャを生成するのと同様の方法でシャドウマップを生成します。ライトと同じ場所にあるカメラを想像すると、カメラが見ることができないシーンの領域は、ライトからの光線が届かないシーンの領域と同じです。したがって、それらは影になります。
Unity は、光線がサーフェスをヒットするまでに移動する距離の情報をシャドウマップに入力します。それから、シャドウマップをサンプリングしてライトがヒットするゲームオブジェクトのリアルタイムの影を計算します。
シャドウマッピングの詳細については、シャドウマッピングに関するウィキペディアのページ を参照してください。
シャドウマップの解像度を計算するために、Unity は以下を行います。
ライトが照射できる画面の領域を決定します。ディレクショナルライトに関しては、画面全体を照らすことができますが、スポットライトやポイントライトに関しては、その領域はライトの広がりの形状 (ポイントライトの球形、やスポットライトの円錐形) が画面上へ投影されたものです。投影された形状は、画面上にピクセル単位の特定の幅と高さを持ちます。この 2 つの値の大きい方が、ライトのピクセルサイズです。
以下の計算を実行し、結果を最大サイズに固定します。
ライトタイプ | 計算式 | 最大解像度 (ピクセル) |
---|---|---|
Directional | NextPowerOfTwo (ピクセルサイズ * 影の品質の乗数 * 3.0) | Shadow Resolution が Very High の場合、または GPU に 512MB 以上の RAM がある場合は4096 x 4096、それ以外の場合は 2048 x 2048。 |
Spot Lights | NextPowerOfTwo (ピクセルサイズ * 影の品質の乗数 * 2.0) | GPU に 512MB 以上の RAM がある場合は 2048 x 2048、それ以外の場合は 1024 x 1024。 |
Point Lights | NextPowerOfTwo (ピクセルサイズ * 影の品質の乗数 * 1.0) | GPU に 512MB 以上の RAM がある場合は 1024 x 1024、それ以外の場合は 512 x 512。 |
ポイントライトは、他のタイプよりもサイズの限界が低く設定されています。なぜなら、キューブマップを影に使用するからです。つまり、この解像度でキューブマップの 6 面がいっぺんにビデオメモリに保持されなければならないからです。描画するのにも非常に負荷がかかります。影を投影する可能性のあるものを、キューブマップ 6 面全てに描画する場合があるからです。
ビルトインレンダーパイプラインでは、Light.shadowCustomResolution プロパティを 0 より大きい値に設定することで、ライトのシャドウマップの解像度を設定できます。この値が 0 より大きい場合、Unity はすべてのライトタイプに対して以下の計算を行います。
NextPowerOfTwo (shadowCustomResolution)
次に、上の表が示すライトのタイプとハードウェアに基づいて、最大の解像度を固定します。
shadowCustomResolution
プロパティはビルトインレンダーパイプラインでのみサポートされています。HD レンダーパイプライン (HDRP) やユニバーサルレンダーパイプライン (URP) ではサポートされません。
Did you find this page useful? Please give it a rating:
Thanks for rating this page!
What kind of problem would you like to report?
Thanks for letting us know! This page has been marked for review based on your feedback.
If you have time, you can provide more information to help us fix the problem faster.
Provide more information
You've told us this page needs code samples. If you'd like to help us further, you could provide a code sample, or tell us about what kind of code sample you'd like to see:
You've told us there are code samples on this page which don't work. If you know how to fix it, or have something better we could use instead, please let us know:
You've told us there is information missing from this page. Please tell us more about what's missing:
You've told us there is incorrect information on this page. If you know what we should change to make it correct, please tell us:
You've told us this page has unclear or confusing information. Please tell us more about what you found unclear or confusing, or let us know how we could make it clearer:
You've told us there is a spelling or grammar error on this page. Please tell us what's wrong:
You've told us this page has a problem. Please tell us more about what's wrong:
Thank you for helping to make the Unity documentation better!
Your feedback has been submitted as a ticket for our documentation team to review.
We are not able to reply to every ticket submitted.