Unity の Standard Assets の投影シャドウ(Shadow Blob Projector)の仕様

この記事について

  • 今更感もありますが, Unity の Standard Assets 内の投影シャドウ (Shadow Blob Projector), 別名:丸影 に関する記事です.
  • やや技術的な内容になりますので, 対象はプログラマか 技術に興味があるデザイナーさんになります.

説明

  • Unity の Standard Assets に投影シャドウ (Shadow Blob Projector)というのがあります.
  • これについてリアルタイムのデプスシャドウよりも軽そうという理由で使おうとしている場合には, この投影シャドウの仕様について知っておいた方が良いです.
  • 投影シャドウについては「投影シャドウの投射範囲内において, 投影シャドウを受ける側のメッシュ(Unity 用語でのレンダラー)が半透明パスで再び描画される」というのが仕様です.
  • そうすることで, 画面中のピクセルで投影シャドウを受けるメッシュの部分を後から黒く塗っている感じになります.
    • ここで具体例としてキャラクターが投影シャドウを使って地形に影を落としているとして, そのキャラクターが 10 体いるとします.
    • このとき 10 個の投影シャドウがあり, それぞれ影が落ちている地形のメッシュが追加で描画しますので 結果として地形が追加で 10 回描画されることになります(汗)
    • なので場合によっては, 純粋にデプスシャドウを使った方が処理が軽いこともあります.
  • また投影シャドウではデプスシャドウと違ってライトから見たデプスを作っているわけではなく, プロジェクタとそれを受けるメッシュの 1 対 1 の関係しか見ないので下図のように貫通します.


  • あと一応補足しておくと, Unity の投影シャドウについては別に Unity 側の実装が悪いとかそういうことではなくて, 投影シャドウの技術の仕様上そうなっています.

実験

  • では,「投影シャドウの投射範囲内において, 投影シャドウを受ける側のメッシュ(Unity 用語でのレンダラー)が半透明パスで再び描画される」件について以下で実験していきます.
シーン構成
  • ※ 今回のテストシーンは実験用にシンプルにしているので, 非常に見た目がみすぼらしいですがご了承下さいw
  • まず下図はテストシーンで, 以下のように構成になっています.
    • 地形 :「緑色の平面」と「それに埋まっている灰色の直方体」
    • キャラ0 : 赤のカプセル, それの投影シャドウは「緑色の平面」と「それに埋まっている灰色の直方体」に落ちています.
    • キャラ1 : 黄色のカプセル, それの投影シャドウは「緑色の平面」にだけ落ちています.


投影シャドウなし
  • この場合, バッチ数は 4 個です.
    • 不透明描画パス : 「緑色の平面」「灰色の直方体」「赤カプセル」「黄カプセル」


赤カプセルの投影シャドウだけあり
  • バッチ数は 6 個です.
    • 不透明描画パス : 「緑色の平面」「灰色の直方体」「赤カプセル」「黄カプセル」
    • 半透明描画パス : 「緑色の平面」「灰色の直方体」


赤カプセルの投影シャドウあり, 黄カプセルの投影シャドウあり
  • バッチ数は 7 個です.
    • 不透明描画パス : 「緑色の平面」「灰色の直方体」「赤のカプセル」「黄カプセル」
    • 半透明描画パス : 「灰色の直方体」「緑色の平面」「緑色の平面」

  • 下図はフレームデバッガで確認した結果です.
  • 不透明描画パスについては Render.OpaqueGeometry での 4 回がそれに該当します.
  • そして, 投影シャドウを受けるメッシュのための描画は Render.TransparentGeometry にあって, 中で「緑色の平面」が 2 回と「灰色の直方体」が1 回描画されていることがわかります.


まとめ

  • 上の実験を通じて, 投影シャドウについては「投影シャドウの投射範囲内にある, 投影シャドウを受けるメッシュ(Unity 用語でのレンダラー)が半透明パスで再び描画される」というのが確認できました.
  • (こういうことはあんまりないかもしれませんが) 処理が軽そうという理由でシーン中で投影シャドウを多用するのはちょっと気をつけた方がいいかもしれません.

参考情報