知識0からのUnityShader勉強

知識0からのUnityShader勉強

UnityのShaderをメインとして、0から学んでいくブログです。

【UnityShader】Cascade Shadow Maps【1】 #112

Cascade Shadow Mapsとは

カメラに近い位置の影はジャギーが目立って表示されています。
これを解決する手法の1つがCascade Shadow Maps(CSMs)になります。

ジャギーが目立ってしまっている例

奥の立方体は影のジャギーが特に目立たないのに対して、
手前の球は影のジャギーが目立っています。

f:id:soramamenatan:20210829132900p:plain

発生してしまう原因

このジャギーが発生してしまう原因は、シャドウマップの各領域がカメラの透視によって想定よりも拡大されているからになります。

以下の画像を見て頂けるとわかりやすいです。
視錐の遠い方の端は20ピクセルのシャドウマップに対し、
視錐の近い方の端は4ピクセルのシャドウマップになっています。
画面上では、どちらの端も同じサイズで表示されるので、近い方はシャドウマップの解像度が低くなってしまうのでジャギーが発生します。

https://docs.unity3d.com/ja/2019.4/uploads/Main/ShadMapFrustumDiagram.svg

シャドウカスケード - Unity マニュアルより引用

考え方

CSMsの考え方は、以下の手順になります。

  1. 視錐台を複数の視錐台に分割する
  2. 各サブ視錐台の正投影を計算
  3. 各サブ視錐台のシャドウマップをレンダリング
  4. シーンをレンダリング
    1. シャドウマップをバインドしてレンダリングする
    2. 頂点シェーダーで以下のことを行う
      1. 各ライト視錐台のテクスチャ座標を計算
      2. 頂点を変換する
    3. ピクセルシェーダーで以下のことを行う
      1. 適切なシャドウマップを決定する
      2. 必要ならテクスチャ座標を変換
      3. カスケードをサンプリングする

この手順を踏むことにより手前の影は詳細なものを、奥の影は広域にシャドウマッピングすることができます。
この時、シャドウマップの解像度はすべて同じで手前のものほどサイズが小さくなっています。

CSMsでのシャドウマップイメージ

https://docs.microsoft.com/ja-jp/windows/win32/dxtecharts/images/csm-shadow-quality.png

カスケードされたシャドウ マップ - Win32 apps | Microsoft Docs:より引用

ソースコード無しでの実装

オブジェクトの配置

Scene上に以下のオブジェクトを配置します。

  • カメラ
  • ライト
  • カメラから近いオブジェクト(Sphere)
  • カメラから遠いオブジェクト(Cube)
  • Plane

f:id:soramamenatan:20210829135838p:plain

ライトの設定

ジャギーを目立たせやすくするために、ShadowTypeをHardShadowsにします。

f:id:soramamenatan:20210829135822p:plain

影をレンダリングするカメラの距離を伸ばす

Project Settingsを開き、Qualityを選びます。
Shadow Distanceの数値を250にします。
下のShadow CascadesをNo Cascadesにします。

f:id:soramamenatan:20210829135834p:plain

設定後

GameViewに戻ると、手前のオブジェクトの影が荒くなっています。
f:id:soramamenatan:20210829135826p:plain

Cascadeの追加

Project Settingsに戻り、Shadow CascadesをFour Cascadesにします。

f:id:soramamenatan:20210829135817p:plain

Cascade

GameViewに戻ると、手前のオブジェクトの影のジャギーが減っています。

f:id:soramamenatan:20210829135830p:plain


解説

Shadow CascadesをFour Cascadesにしたことにより、
Cascadeを4つにしているので影がジャギーなく描画できています。

各設定の詳細

Shadow Distance

カメラからどのくらい離れたところまで影を計算するかの値になります。

Shadow Cascades

Cascadeを用意する数を決めます。


問題点

Unityの公式に以下のように記載されています。

モバイルプラットホームでは、シャドウカスケードをサポートしていない

ディレクショナルライトのシャドウ - Unity マニュアル

ですので、モバイルの場合は自作する必要があります。


今回は以上となります。
ご視聴ありがとうございました。


参考サイト様

docs.microsoft.com

docs.unity3d.com