スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

シャドウマップについて

さてさて影について触れてみましょう

影を作るにはいろいろな方法がありますが一般的に使われているのは「まる影」「ステンシル」「シャドウマッピング」だと思います。
呼び名はいろいろあるそうですが・・



ここでいろいろな種類の影の説明がのっていますので興味のある方は見てみるといいです。

いろいろ試していると次のことがわかってきます。
・足元に落ちるまる影だけってのは流石に寂しい気がする。
・ステンシルは輪郭を作る影だけになってしまう。
・パースを効かせていないシャドウMAPは狭い空間意外では実用性が低い。
・パースペクティブシャドウマップ(PSMやLiSPSM)やカスケードシャドウマップは点光源が使えない。
・全方位キューブシャドウマップは点光源を扱えるがキューブマップの特性上カメラの射影行列が固定されるため光源位置を管理しないといけない。


シャドウマップの仕組みについて軽く触れます。

ほんと軽くなのでこの説明でわかる人は多分100人に一人です。

今書こうとしている物体の1点が「最後に書かれている点だ」とわかるならシャドウマップなんていらないんです。
↑の意味が分かればとりあえず一回全部書き込んでみたデータを元に二回目で影を付ける必要性が見えてきます。
そのデータを絵に持たせてやろう!ってのがシャドウマップです。
cube7.jpg
実際には「光からみた画像を描写する。その際に色の変わりに深度(点までの距離情報)を色情報として画像に預ける作業」を行います。

そして二度目の書き出す際にその情報を使うのですが、

・↑で説明したデータを画像からもってくる
・しかしながら光源からみた画像にはAとBが重なるためにBの情報が深度となっていることに注意
・この深度情報をCとする
・光源からAを見る
・深度を計算してDとする(注)
・CとDを比較してもし一緒なら影にはならない、違えば影になる


↑のことを行うとシャドウマップが実装できるわけだ。
深度の書き込みは以前ブログで紹介した深度を0~1に納める状態をそのまま書き込めばOK
よって
return (UV.z / UV.w);といった感じ。

深度の比較には逆に(注)の場所で得られたW値をUV.z(これは画像から得られた値)にかけることでUV.zに戻してやる。また比較の際は少し誤差がでるので下駄を履かせて調整すると上手くいくと思う。(←これを知らなくて苦労しました)

変換時混乱したら昔の記事も参考にしてください。


ねよっと。



コメントの投稿

非公開コメント

プロフィール

あしゅ

Author:あしゅ
ぷぃぷぃ日常。
いつのまにか雑記ブログに。

カテゴリ
最新記事
検索フォーム
最新コメント
リンク
このブログをリンクに追加する
ブロとも申請フォーム

この人とブロともになる

カウンター
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。