こんにちは、ともくんのゲーム作り部屋にようこそ!
このページでは、
「Unityで影はどうやって表示されているの?」
「影の設定にはどんな項目があるの?」
というお悩みの方に向けた内容となっています。
Unityでオブジェクトに影を表示させる場合、現実と同じでLight(ライト)でオブジェクトに光を当てる必要があります。
ゲームシーン内でライトからの光がオブジェクトに当たり、そして光が当たらない場所に対して影が作られるように計算されています。
この影を表示させる技術はシャドウマッピングと呼ばれ、シャドウマップというテクスチャを使ってリアルタイムで影が表示されるように処理しています。
そこで、このページでは、Unityの3Dで影が表示される基本的な仕組みと、影を設定する項目についてまとめていきます。
3Dオブジェクトに影が表示される基本的な仕組み
まずは、Unityで影が表示される基本的な仕組みについて紹介していきます。
Light(ライト)でオブジェクトに光を当てる
影を表示するためには、Light(ライト)オブジェクトで光を当てる必要があります。
Lightオブジェクトとは、ゲームシーン内に光源を設置することができるオブジェクトで、太陽と同じような光や懐中電灯のようなスポットの光などを作り出すことができます。
そして、このLightオブジェクトから照らされた光が、ゲームオブジェクトに当たることで、その反対側に影が表示されるようになります。

なお、Lightオブジェクトに関しては、以下の記事でもう少し詳しく解説していますので、参考にしてみてください。
シャドウマッピングで影が表示される
Unityでは、シャドウマッピングという技術を使うことで、リアルタイムに影を表示させることをしています。
このシャドウマッピングとは、Lightオブジェクトによる光源の位置からそれぞれの場所(ピクセル)までの距離を「シャドウマップ」というテクスチャに記録しておき、このシャドウマップを参照しながら影を表示するという技術です。
実際に影が表示される際は、シャドウマップを使って、光源から見た際にゲームオブジェクトによって隠れている領域を判断して、隠れている場合には影を表示させるという処理を行っています。

シャドウマッピングという手法を使うことで、リアルタイムで影を容易に実装することができますが、シャドウマップの解像度次第で影の品質が低くなってしまうことがあります。
リアルタイムで影を表示させる際の設定項目
Unityでは、影を表示する際にシャドウマッピングという技術が使われていることが分かりましたが、ここからは実際にリアルタイムで影を表示する際の設定項目についてまとめていきます。
影の表示は、光源であるLightオブジェクトに紐づくLightコンポーネントで基本的な設定を行うことができます。

Shadow Type:影の種類

Shadow Typeは、表示する影の種類を決めている項目で、「No Shadows」「Hard Shadows」「Soft Shadows」の3つから選択することができます。
「Hard Shadows」は、エッジ部分がギザギザとした影になることがありますが、その分処理の負担が少なく済むというメリットがあります。
一方で「Soft Shadows」は、アンチエイリアシングが行われるため、Hard Shadowsよりもやわらかくエッジを少しぼかした影になりますが、その分負荷も大きくなります。



Resolution:シャドウマップの解像度

Resolutionは、シャドウマッピングにおけるシャドウマップの解像度を設定している項目で、以下の4つから選択することができます。
解像度が低いと、ギザギザとした影(ジャギー)が発生することがあるため、その場合はこのResolutionの項目を変更しましょう。
ただし、解像度が上がるとその分処理負荷も上がることになるため、注意しておく必要があります。




なお、このResolutionの項目は、LightのTypeを「Spot」「Point」のどちらかにした場合のみ表示されます。

Strength:影の濃さ

Strengthは、表示される影の濃さを設定する項目です。
0~1までの値を設定することができ、数字が小さくなればなるほど、表示される影が薄くなっていきます。



Bias:シャドウアクネを防ぐバイアス調整

Bias(バイアス)とは、影を表示した際に縞模様のシャドウアクネと呼ばれる現象の発生を防ぐための項目です。
シャドウアクネは、シャドウマップの解像度が低いことで、本来影になるべきでは無い部分に影が表示されることで発生します。
そして、このシャドウアクネの発生を減少させるために、Biasを使って影の位置をずらしてあげることで解消していきます。
Biasの項目では、
の2つから選択することができます。


またBias値の設定には、上記のように「Depth Bias」「Normal Bias」の2つがあります。
「Depth Bias」は、シャドウマップの深度(光源からの距離)に対して位置をずらす項目で、0~10までの値を設定でき、数値が大きくなればなるほどオブジェクトから影が離れていくことになります。


一方で「Normal Bias」は、法線方向に対して位置をずらす項目で、Depth Biasと同様に0~10までの値を設定でき、数値が大きくなればなるほど影が細くなっていきます。


Near Plane:影を表示させるLightとオブジェクトの距離を設定

Near Planeは、光源とゲームオブジェクトの距離が、設定した距離よりも短い場合に、影を表示させないという項目です。
このNear Planeは、0.1~10までの間の数値を設定することができ、光源に近いオブジェクトの影を表示させないことができます。



Soft Shadows Quality:Soft Shadowsの度合いを設定

Soft Shadows Qualityは、Shadow Typeを「Soft Shadows」にした場合にのみ表示される項目で、どの程度アンチエイリアシングをかけてエッジをぼかすかを設定することができ、以下の4つから選択することができます。



高品質になればなるほど、よりやわらかくぼかされた影が表示されますが、その分ゲーム内の負荷も大きくなります。
Custom Shadow Layers:影を表示させたいLight(ライト)レイヤー

Custom Shadow Layersは、Lightオブジェクトを使って影を表示させたいレイヤーを選択する項目です。
項目にチェックを入れると、Lightレイヤーを選択することができるので、選択したレイヤーのみに影を表示させることができます。
例えば、Custom Shadow Layersで「Light Layer1」だけに表示させるとします。

そして、キューブオブジェクトのMesh Rendererの「Rendering Layer Mask」を「Default,Light Layer 1」、球体オブジェクトのMesh Rendererの「Rendering Layer Mask」を「Default」だけにします。


すると、Rendering Layer Maskで「Light Layer 1」を設定しているキューブのオブジェクトの影だけが表示されるようになります。

Max Distance:カメラから表示する影までの距離

Max Distanceは、カメラからどのくらい離れた距離の影を表示させるかを設定する項目です。
このMax Distanceの値を上げれば上げるほど、より遠くのオブジェクトまで影を表示させることができますが、その分ゲーム内の負荷は大きくなります。



Max Distanceの設定は、Lightコンポーネントではなく、レンダーパイプラインのアセット設定から行うことができます。
まとめ
このページでは、Unityで影を表示させる仕組みと、その設定項目についてまとめていきましたが、いかがでしたでしょうか?
Unityで影を表示させる場合は、Lightオブジェクトで光源を設置してゲームオブジェクトに光を当てます。
そして、光源の位置からの距離をシャドウマップという深度テクスチャを使って記録しておくことで、リアルタイムに影を表示させる処理を行っています。
この影を表示させる基本的な設定は、Lightコンポーネントで行うことができ、影の種類や品質、また表示距離なども設定することができます。
最後までお読みいただきまして、ありがとうございました!
コメント