TL

シャドウマッピングの技法

影の輪郭がギザギザに割れる・物体が地面から浮くといった定番の破綻を、深度マップの原理からバイアス・PCF・カスケードの根拠まで押さえて自力で直せるようになります。

応用グラフィックスシャドウマッピングPCFカスケードシャドウマップレンダリング最終更新: 2026-06-21
TL;DR要点だけ先に
  • 1.シャドウマッピングは光源視点で深度だけを描いた深度マップを作り、通常描画時に各画素を光源空間へ変換して「光源から見た最短距離」と比較する。手前に遮蔽物があれば影と判定する2パス手法。
  • 2.深度の量子化と傾いた面のせいでシャドウアクネ(自己遮蔽の縞)が出る。バイアスで奥へずらすと今度は影が縮んで物体が浮くピーターパン化が起きるため、定数+傾き比例(slope-scaled)+法線オフセットで折り合わせる。
  • 3.PCF は複数タップの深度比較を平均して輪郭を柔らかくし、CSM は視錐台を距離帯に分けて近距離ほど高解像度な深度マップを割り当てる。VSM/ESM は深度を統計量・指数で符号化し、比較をフィルタ可能な形に変えてソフト化する。

影を「光源から見た深度の比較」に落とす

影とは、ある点と光源の間に別の物体があって光が届かない状態です。これを画素ごとに判定するのがシャドウマッピングで、発想は隠面消去と同じく「深度を比べる」ことに尽きます。ただし比較する視点はカメラではなく光源です。

処理は2パスに分かれます。第1パスでは、光源をカメラに見立ててシーンを描画しますが、色は要りません。必要なのは「光源から各方向で最も近い遮蔽物までの距離」だけなので、深度バッファだけを埋めます。この深度テクスチャを 深度マップ(シャドウマップ) と呼びます。第2パスの通常描画では、各画素の世界座標を光源の視錐台へ 座標変換 して光源空間の深度を求め、同じ方向に対応する深度マップの格納値と比べます。格納値のほうが手前なら、その画素と光源の間に何かが挟まっている、すなわち影です。

第1パス(シャドウマップ生成):
  視点 = 光源、深度だけを描く
  shadowMap[u,v] = 光源から見た最短深度

第2パス(通常描画):
  各画素 p ごとに:
    光源空間へ変換して (u, v, d_p) を得る
    d_map = shadowMap[u,v]
    if d_p > d_map + bias:  影(遮蔽されている)
    else:                   光が当たる

平行光源(太陽)は方向が一定なので 正射影 の深度マップを1枚使います。点光源は全方向へ光るため、立方体の6面へ描く キューブマップシャドウ か距離を直接格納する方式を採り、スポットライトは画角の狭い透視射影1枚で済みます。以降は説明を単純にするため平行光源を主に扱います。

シャドウアクネとピーターパン ── バイアスの綱引き

素朴に実装すると、光が当たるはずの面全体に縞状の自己遮蔽(シャドウアクネ、shadow acne)が現れます。原因は2つの離散化です。第一に深度マップは有限解像度のテクセルで、1テクセルが受光面の広い領域を代表します。第二に深度値は量子化されています。傾いた面では1テクセル内で本来の深度が連続的に変化するのに、格納されるのは代表点1つの深度です。そのため面上の多くの点で「自分自身の深度がマップ値よりわずかに奥」と誤判定され、自分で自分に影を落とします。

対策は比較時に 深度バイアス を足し、判定を少し甘くすることです。ところがバイアスを大きくしすぎると、今度は本物の接触影まで奥へ逃げ、物体が地面から浮いて見える ピーターパン現象(peter-panning、影が足から離れる)になります。アクネを消すほど浮き、浮きを抑えるほどアクネが出る綱引きが生まれます。

ここで効くのが、面の傾きに比例させる slope-scaled bias(傾き依存バイアス) です。光線に対して面が寝ているほど1テクセルあたりの深度差は大きくなるので、バイアスも法線と光方向のなす角に応じて増やします。正対する面では小さく、斜めの面では大きく、と自動調整され、平坦面での浮きを最小化できます。

法線オフセットという別解

深度をずらす代わりに、比較する位置そのものを面の法線方向へ少しだけ押し出す normal offset bias も有効です。深度軸ではなく受光点を法線方向へ動かすため、テクセル間の深度勾配が急な箇所でアクネを抑えつつ、接触影の位置ずれ(ピーターパン)を深度バイアス単独より小さく保てます。実務では slope-scaled bias と法線オフセットを併用し、定数バイアスは最後の微調整に留めるのが安定します。

もう一つの定番テクニックが フロントフェイスカリングでの深度描画、すなわちシャドウマップ生成時に表面ではなく裏面(back face)の深度を書く方法です。受光する表面と、書き込まれた裏面の深度が厚み分だけ離れるため、自己遮蔽が起こりにくくなります。薄い(two-sided な)ジオメトリでは破綻するので、slope-scaled bias と併用します。

PCF ── 硬い輪郭を柔らかくする

深度比較の結果は「影=0/非影=1」の二値なので、そのまま使うと輪郭がテクセル境界でギザギザに階段化します。これを均すのが PCF(Percentage-Closer Filtering) です。要点は、深度値を平均してから比較するのではなく、周辺の複数テクセルそれぞれで比較を行い、その二値結果を平均する 点にあります。深度そのものは非線形で平均に意味がないため、順序が逆だと正しくぼけません。

PCF(3x3 の例):
  影率 = 0
  for 近傍テクセル (u+i, v+j):
    result = (d_p > shadowMap[u+i, v+j] + bias) ? 1 : 0
    影率 += result
  影率 /= タップ数        # 0.0〜1.0 の連続値になる

平均結果は「そのタップのうち何割が遮蔽されていたか」を表す連続値となり、輪郭に幅を持ったやわらかい半影(ペナンブラ)ができます。GPU のハードウェア深度比較サンプラ(比較後にバイリニア補間を行う機能)を使えば、1タップで2×2の比較平均が得られ、少ないタップ数でも滑らかになります。タップ数を増やすほど柔らかくなりますが、コストは線形に増えます。

PCF の半影幅は固定です。現実の影は光源が遠い遮蔽ほど輪郭が硬く、近いほどぼやけます。これを近似する PCSS(Percentage-Closer Soft Shadows) は、まず遮蔽物までの平均距離を推定し、その距離に応じて PCF のカーネル幅を動的に変えることで、接地部は硬く先端はぼやける可変半影を作ります。品質は上がりますが探索コストが増えます。

PCF のタップは深度ではなく比較結果を平均する

初学者が陥りやすいのが「近傍の深度を平均してから1回だけ比較する」実装です。これは前ボケが正しく出ないばかりか、遮蔽物の縁で深度が急変する箇所に偽の中間深度を作り、影が誤った位置に滲みます。あくまで 各タップで比較 → その0/1を平均 の順序を守ることが、PCF が破綻しない条件です。深度テクスチャの フィルタリング を通常色テクスチャと同じ感覚で線形補間してはいけない、と言い換えられます。

カスケードシャドウマップ(CSM)── 解像度を距離で配る

平行光源で広い屋外を1枚の深度マップで覆おうとすると、深刻な解像度不足に陥ります。カメラ間近の影も遠方の影も同じ枚数のテクセルを分け合うため、手前の影の縁が大きなブロック状に割れます(perspective aliasing、遠近による標本化不足)。近くほど画面上で影が大きく映るのに割り当て密度が足りないのが根本原因です。

カスケードシャドウマップ(CSM, Cascaded Shadow Maps) は、カメラの視錐台を距離方向にいくつかの帯(カスケード、通常3〜4段)へ分割し、各帯に専用の深度マップを1枚ずつ割り当て ます。近い帯は狭い範囲を1枚で覆うのでテクセル密度が高く、遠い帯は広い範囲を粗く覆います。結果として、画面上で見た影の解像度が距離によらずほぼ一定になります。

視錐台を距離で分割:
  cascade 0:  near .. 15m    高密度な深度マップ 1 枚
  cascade 1:  15m  .. 50m    中密度
  cascade 2:  50m  .. 200m   低密度

描画時: 画素のカメラ距離でどの帯かを選び、
        その帯の深度マップで影判定する

分割位置は、近距離に密度を寄せる 対数分割 と、等間隔の均等分割を混ぜた実用的な配分がよく使われます。実装上の注意は主に2つです。第一に 帯の境界での不連続。段が切り替わる面で解像度が跳ぶため縫い目が見えることがあり、隣接カスケードを少し重ねてブレンドして隠します。第二に シマー(テクセルスイミング)。カメラが動くとテクセルの世界位置が動き、静止物の影の縁がちらつくので、各カスケードの原点をワールド空間でテクセル単位にスナップして固定します。

試験・面接での定番の勘所

「屋外の影が、近くだけギザギザで遠くは問題ない(あるいはその逆)」の原因を問われたら、答えは深度マップの解像度が距離に対して偏配分されている(perspective aliasing)で、対策は CSM による距離別割り当てです。「影が地面から浮く」はバイアス過大によるピーターパン、「光の当たる面に縞」はバイアス不足によるシャドウアクネ、と正反対の症状を取り違えないことが要点。さらに CSM の副作用としてカスケード境界の縫い目とテクセルスイミングを挙げ、境界ブレンドとテクセルスナップで対処できると強いです。

VSM / ESM ── 比較を「フィルタできる形」に変える

PCF はサンプリング時に多数のタップを踏むためコストがタップ数に比例し、事前のブラー(縮小・ミップマップ)とも相性が良くありません。そこで 深度そのものを、事前にフィルタ(平均・ミップマップ・ブラー)できる別の量へ符号化 し、比較を確率評価やフィルタ可能な演算に置き換える系統があります。

VSM(Variance Shadow Maps, 分散シャドウマップ) は、深度 d に加えてその二乗 d^2 も格納します。この2つを平均すると領域内の深度の平均と分散が得られ、チェビシェフの不等式を使って「受光点がその領域で遮蔽されている確率の上界」を推定します。深度と二乗深度はどちらも線形にフィルタしてよい量なので、通常のバイリニア補間・ミップマップ・ガウスぼかしをそのまま適用でき、1タップで柔らかい影が得られます。弱点は ライトブリード(light bleeding) で、明暗差の大きい遮蔽が重なる領域で分散の上界がゆるみ、暗くあるべき所に光が漏れます。

ESM(Exponential Shadow Maps, 指数シャドウマップ) は、深度を指数関数 exp(c * d) の形で格納します。指数の急増を利用して「遮蔽されていれば比率が急落する」性質から遮蔽度を連続値で近似し、これもフィルタ可能な量なのでブラーやミップマップと両立します。VSM よりライトブリードを抑えやすい一方、係数 c が小さいと接触影の付近で影が甘くなり、大きいと数値がオーバーフローしやすいトレードオフがあります。

手法格納する量ソフト化の仕組み主な弱点
標準+PCF深度 d近傍タップの比較結果を平均タップ数に比例したコスト、事前ブラー不可
VSM深度 d と二乗深度 d^2平均と分散からチェビシェフで遮蔽確率を上界推定ライトブリード(光漏れ)
ESM指数深度 exp(c*d)指数比で遮蔽度を連続近似、線形フィルタ可能係数 c の調整依存、オーバーフロー

これらは影をあらかじめブラーしたテクスチャとして扱えるため、遮蔽の縁で一定幅のソフトシャドウを安価に量産 する用途に向きます。反面、確率・指数による近似ゆえの漏れや甘さがあり、接地部の硬い影が重要な場面では PCF/PCSS 系のほうが正確です。多くのエンジンは、主要な平行光源に CSM+PCF を据え、必要に応じて VSM/ESM 系を補助的に使い分けます。影パスをどの描画方式(フォワード/ディファード)のどこに差し込むかは、前方レンダリングと遅延レンダリング の設計と併せて決めます。

まとめ

  • シャドウマッピング は、光源視点で深度だけを描いた深度マップを作り、通常描画時に各画素を光源空間へ変換して深度を比較する2パス手法。格納値のほうが手前なら影と判定する。
  • シャドウアクネとピーターパンはバイアスの表裏。深度の量子化と面の傾きで自己遮蔽の縞が出るので奥へずらすが、ずらしすぎると接触影が浮く。slope-scaled bias+法線オフセットで折り合わせ、定数バイアスは微調整に留める。
  • PCF は近傍の比較結果(0/1)を平均して半影を作る。深度そのものの平均ではない順序が要。可変半影が要るなら PCSS。
  • CSM は視錐台を距離帯へ分け、近距離ほど高密度な深度マップを割り当てて perspective aliasing を解く。境界ブレンドとテクセルスナップで縫い目とシマーを抑える。
  • VSM/ESM は深度を二乗・指数へ符号化し、比較をフィルタ可能な形に変えてブラーやミップマップで安価にソフト化する。代償はライトブリードや係数依存の甘さ。

グラフィックス Article

シャドウマッピングの技法を実務で読む

TL;DRは入口です。実際に選ぶ・使う段階では、何を解決するか、何と比較するか、導入後にどこで詰まるかまで見る必要があります。

解決すること

グラフィックス

比較で見る軸

難易度: advanced / カテゴリ: グラフィックス / タグ数: 6

導入後に効く点

深度の量子化と傾いた面のせいでシャドウアクネ(自己遮蔽の縞)が出る。バイアスで奥へずらすと今度は影が縮んで物体が浮くピーターパン化が起きるため、定数+傾き比例(slope-scaled)+法線オフセットで折り合わせる。

先に潰すリスク

用語だけ覚えても、設計・実装・運用でどこに効くかを確認しないと判断を誤る。

数字・仕様の読み方
難易度
advanced
カテゴリ
グラフィックス
タグ数
6

判断チェックリスト

  • 自社の用途が「グラフィックス / シャドウマッピング」に近いか確認する。
  • 強みである「シャドウマッピングは光源視点で深度だけを描いた深度マップを作り、通常描画時に各画素を光源空間へ変換して「光源から見た最短距離」と比較する。手前に遮蔽物があれば影と判定する2パス手法。」が本当に評価軸になるか確認する。
  • 注意点の「用語だけ覚えても、設計・実装・運用でどこに効くかを確認しないと判断を誤る。」を運用で吸収できるか確認する。
  • 公開値や仕様値は、対象プラン・対象機種・対象リージョンまで確認する。
  • 既存システム、ID、ネットワーク、監視、バックアップとの接続方法を先に洗い出す。
  • 小さく試してから、本番移行、権限設計、障害時手順、コスト監視を決める。

次に確認する観点

グラフィックスシャドウマッピングPCFカスケードシャドウマップグラフィックスシャドウマッピング