カメラから遠くにあると、影がちらつく場合があります。詳細については、視錐台についてを参照してください。
影がワールド空間の原点よりもカメラに近い場合は、カメラ相対カリングを有効にします。Unity は、ワールド空間の原点の代わりにカメラを影に関する計算の相対位置として使用し、ちらつきを軽減します。
カメラ相対カリングを有効にするには、次の手順に沿って操作します。
リアルタイムシャドウのレンダリングは、パフォーマンスに大きな影響を与えます。影を投影する可能性のあるゲームオブジェクトは、最初にシャドウマップに描画する必要があります。その後、そのマップを使用して影を受ける可能性のあるオブジェクトを描画します。
ソフトシャドウは、ハードシャドウよりも大きなレンダリングのオーバーヘッドを持っていますが、これは GPU に影響を与えるだけで、CPUに多くの余分な作業は発生させません。
複雑なジオメトリのリアルタイムシャドウのレンダリングに非常にコストがかかる場合は、低 LOD メッシュやプリミティブを使用してシャドウを投影することを検討してください。
これによってリソースが過剰に消費される場合は、キャラクター下のシンプルなメッシュやクアッドに適用されたテクスチャを使用してシャドウを偽造する、またはカスタムシェーダーでぼんやりしたシャドウを作成することができます。
ライトが直接照らすサーフェスに、部分的に影があるように見えることがあります。正確にシャドウマップで指定された距離でなければならないピクセルが、ずっと遠くにあるように計算されてしまう場合があるためです (シャドウフィルタリングやシャドウマップに低解像度画像を使用した結果)。その結果として、実際には照らされるべきピクセルが影になって模様を作る、“シャドウアクネ” と言われる現象が発生します。
シャドウバイアス値を調整することで、シャドウアクネ、影の剥離 (ピーターパンニングとも呼ばれます)、ライト漏れ、セルフシャドウイングなどのシャドウアーティファクトを軽減または除去できます。
ビルトインレンダーパイプラインでは、影が有効になっているときに、Light Inspector ウィンドウの Bias と Normal Bias プロパティでこれらの値を設定することができます。
__バイアス__値を過剰に高い値に設定しないでください。ゲームオブジェクトがキャストする影の周りの領域が誤って照らされる場合があります。その結果、ゲームオブジェクトから離れた影となり、ゲームオブジェクトが地上を飛んでいるような外観になります。
同様に、__法線バイアス__値を過剰に高い値に設定すると、ゲームオブジェクトに対し、影の幅が狭くなりすぎてしまいます。
状況によっては、法線バイアス__がライトにじみと呼ばれる望ましくない効果を引き起こすことがあります。ライトにじみとは、近くのジオメトリから影になるべき領域にライトが漏れる現象です。解決策としては、ゲームオブジェクトの Mesh Renderer を開き、Cast Shadows__ プロパティを Two Sided に変更します。シーンのレンダリング時に多くのリソースを消費し、パフォーマンスのオーバーヘッドヘッドが増加する可能性がありますが、これが有効な対応となる場合があります。
ライトのバイアス値には、望まないエフェクトが発生しないように微調整が必要な場合があります。一般に、計算を試みるよりも目測で適切な値を判断する方が簡単です。
シャドウアクネの回避を強化するために__シャドウパンケーキ__という技術を使用しています。ライト方向に沿ってシャドウマップをレンダリングするときに、使用するライト空間の範囲を縮小するという考え方です。これによって、シャドウマップがより正確になり、シャドウアクネが削減されます。
上のダイアグラムでは、以下を示しています。
影を投影するものを (頂点シェーダーの) 最適化された空間のニアクリップ面に固定します。一般的にこの方法は効果的ですが、ニアクリップ面を横切る非常に大きな三角に関しては、アーティファクトを発生させる場合があります。
この場合、青い三角の頂点の 1 つを最適化されたニアクリップ面の範囲内に置きます。ただし、こうすると、三角形の形状が変化するため、正しくない影を作成してしまう可能性があります。
Quality ウィンドウから Shadow Near Plane Offset プロパティを調整して、この問題を回避できます。これによってニアクリップ面を戻します。ただし、この値を非常に高く設定すると、シャドウアクネが発生します。これは、シャドウマップがライトの向きでカバーする必要がある範囲が増えるためです。または、問題のある影の投影の三角形をテッセレーションすることもできます。
1 つ以上のオブジェクトが影を作らない場合、次の点をチェックする必要があります。
Quality ウィンドウでリアルタイムシャドウが完全に無効になっている場合があります。正しい品質レベルが有効になっており、その設定に対して影がオンに切り替えられていることを確認してください。
シーンのすべてのメッシュレンダラーは、Receive Shadows と Cast Shadows が正しく設定された状態で設定する必要があります。どちらも、デフォルトで有効になっていますが、気づかないうちに無効になっていないかを確認してください。
不透明なオブジェクトのみが影を投影し、影を受けます。そのため、ビルトインの Transparent シェーダーまたは Particle シェーダーを使用するオブジェクトが影を投影する、または影を受けることはありません。通常、フェンス、植生などの “ギャップ” のあるオブジェクトには、代わりに Transparent Cutout シェーダーを使用できます。カスタムシェーダーは pixel-lit であり、ジオメトリレンダーキューを使用する必要があります。
VertexLit シェーダーを使用するオブジェクトは影を受けることができませんが、影を投影することはできます。
ゲームオブジェクトが “Unlit” タイプのシェーダー付きのマテリアルを持つ場合、Unity は影を計算することはできません。Unity は、ライティングをサポートするシェーダーを持つマテリアルの影のみを計算できます。
ビルトインレンダーパイプラインで、フォワードレンダリングパスを使用すると、一部のシェーダーでは最も明るいディレクショナルライトのみが影を投影できます (特に、これは Unity のバージョン 4.x 以降のビルトインシェーダーで発生します)。複数の影を落とすライトを設定する場合は、代わりにディファードシェーディングレンダリングパスを使用する必要があります。fullforwardshadows サーフェスシェーダーディレクティブを使用して “すべての影” をサポートする独自のシェーダーを有効にすることができます。