シャドウマッピングのしくみ

思うところがあってシャドウマップの仕組みについて書いてみようと思いました。シャドウマップを初めて実装した頃はわかりやすい図説がなくて苦労した記憶があります。シャドウマップの解説によくある横から見た図はいまいち概念がわかりにくいので、自分なりにわかりやすく書いてみようと思います。

 

シャドウマップの肝であるプロジェクションマッピング(投影マッピング)のシェーダを書いてみました。左上はライトからの視点です。現実のプロジェクションマッピングと違ってCGではテクスチャーがモデルを突き抜けて行きます。この性質が影を判定するために役に立ちます。

 

左上はライトからの深度マップです。この深度マップをそのまま投影してみます。この時点で影のようなものが落ちているように見えると思います。モデルの裏側や遮蔽されている部分にモデルの表側の深度がそのまま投影されている状態になります。

 

こんどはカメラから見たライトと各ピクセルの距離を描画してみます。深度マップと同じようにカメラに近いほど黒く、遠いほど白くなっています(深さも10メートルぐらいでグラデーションするように深度マップと合わせています)。1枚目の深度マップを投影したものと違い、純粋にライトからの距離を表しています。

※カメラから見たピクセルのワールド座標を光源視点の空間へ変換して、光源からのZ座標(距離)を測るといった計算をしています。

 

上の2枚を比較して1枚目が2枚目より暗い部分が影になります。暗いということはライトに近い表側の深度が描かれているということで遮蔽されているか裏側の部分だということが分かると思います。

このように実際のプロセスを順々に見せていけば理解しやすいかなと思いました。もうだいぶ昔ですがシャドウマップの仕組みを理解した時は感動しました。考えた人は頭いいですね。

 

開発環境:VIsual Studio Express 2008, XNA 3.1

広告

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト /  変更 )

Google フォト

Google アカウントを使ってコメントしています。 ログアウト /  変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト /  変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト /  変更 )

%s と連携中