2012年07月11日

Cascaded Shadow Mapsのテスト その1

前回の続き?です。

屋外などの広い領域でシャドウマッピングを行おうとした場合、シャドウマップの解像度が悪くなってエイリアスなどが表示されやすくなってしまいます。

カメラから近い所にある物体は画像に占める割合が大きくなりますので、解像度を高くしたいですし、カメラから遠くにある物体は画像にしめる割合が小さいので、荒くても問題なくなります。

1枚のシャドウマップに、カメラから近い距離の物体に多くの画素を割り当てるのがPerspective Shadow Mapsで、視錘台を分割して、分割した視錘台にそれぞれ1枚ずつシャドウマップを生成するのがCascaded Shadow Mapsになります[1]。

今回はCasaded Shadow Mapsのテストで、前回のテクスチャアレイに、分割した視錘台のシャドウマップを格納します。

基本的には下記の流れになります。

1. 視錘台を分割する
2. 分割した視錘台の8頂点の座標を求める(近クリップ面の4頂点と遠クリップ面の4頂点)
3. 平行光源を仮定し、視錘台の8頂点がすっぽり入るようなModelViewProjection行列を計算する
4. テクスチャアレイに計算したModelViewProjection行列を使用してシャドウマップのレンダリングを行う
5. 視点からの描画を行い、それぞれのシャドウマップの情報から影かどうかの判定を行う

詳細は参考文献やNVIDIA OpenGL SDKにソースコードがあるので省略します。
2. については、昔の記事と同じやり方で計算するみたいです。

実行結果

一応4.までやってみたのですが、これで合ってるんでしょうか。何か怪しい気がしますね。



視錘台を3分割しています。光源は(-0.6,-0.5,-0.6)ぐらいの平行光源です。
左上が視点から見た深度値、右上が始点から一番近い視錘台のシャドウマップ、左下が二番目、右下が一番遠いシャドウマップになります。

後、確認のために近クリップ面と遠クリップ面を四角で描画しています。ちゃんと視錘台をすっぽり覆うシャドウマップが準備できていると思います。

1枚のシャドウマップで通常通りに生成した場合、右下のシャドウマップより解像度が下がったものになってしまいますので、分割の有効性が分かる気がします。

次はこれらの情報を使って実際に影付けまで試してみたいと思います。

[1] Rouslan Dimitrov: "Cascaded Shadow Maps", NVIDIA Corporation, 2007
posted by シンドラー at 21:26 | Comment(0) | TrackBack(0) | OpenGL & Metasequoia | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント:

認証コード: [必須入力]


※画像の中の文字を半角で入力してください。
※ブログオーナーが承認したコメントのみ表示されます。
この記事へのトラックバックURL
http://blog.seesaa.jp/tb/280387903
※ブログオーナーが承認したトラックバックのみ表示されます。

この記事へのトラックバック