その1
第1章:シャドウマップの考え方
この章の目的
コードを書く前に、なぜ「ライトから見たZ値」を比べると影がわかるのかを理解する。
この章は説明だけ。コード変更はしない。
1. 普通のライト計算だけでは影は出ない
今のライト計算では、だいたい次のことをしている。
面の向きとライト方向を比べる
↓
ライトの方を向いていれば明るい
ライトと逆を向いていれば暗い
これは「その面がライト方向を向いているか」を見ているだけ。
しかし、影を出すには次のことも調べる必要がある。
ライトとその場所の間に、別の物体があるか
手前に別の物体があれば、光はそこで遮られる。
その奥にある場所は影になる。
2. 影とは「ライトから見えない場所」
カメラから床が見えていても、ライトから見えなければ光は届かない。
ライト
\
\
\ 距離3:ドーナツ
\ ■
\
\ 距離7:床
□
この場合、床 □ はカメラからは見えているかもしれない。
でも、ライトから見ると距離3のドーナツ ■ に隠れている。
だから床 □ は影になる。
3. シャドウマップとは何か
シャドウマップは、ライトから見たときの「一番手前のZ値」を保存した画像。
普通の画像は色を保存する。
赤、緑、青、透明度
シャドウマップは色ではなく、奥行きを保存する。
ライトから見て、この場所の一番手前は Z=0.35
ライトから見て、別の場所の一番手前は Z=0.70
つまり、シャドウマップは「ライトから見た奥行きメモ」。
4. どうやって影判定するか
通常描画中に、今描いているピクセルをライト視点に変換する。
例:今描いている床のピクセル
ライト画面上の位置:UV = (0.42, 0.61)
ライト視点Z値:0.70
次に、シャドウマップの同じUV位置を見る。
シャドウマップの UV = (0.42, 0.61)
保存されていたZ値:0.35
比較する。
今のピクセルのZ値 0.70
シャドウマップのZ値 0.35
今のピクセルの方が奥にある。
0.70 > 0.35
つまり、ライトから見ると、手前の 0.35 の位置に別の物体がある。
今描いている 0.70 のピクセルには光が届かない。
だから影。
5. 判定式
今描いているピクセルのライト視点Z値 > シャドウマップのZ値
→ 手前に別の物体がある
→ 光が届かない
→ 影
今描いているピクセルのライト視点Z値 <= シャドウマップのZ値
→ ライトから直接見えている
→ 光が届く
→ 影ではない
6. 要点まとめ
シャドウマップは、ライトから見た一番手前のZ値メモです。
通常描画中に、今描いているピクセルをライト視点に変換します。
そして、そのピクセルのZ値と、シャドウマップに保存されたZ値を比べます。
今描いているピクセルの方が奥なら、手前に別の物体があるということです。
つまり光が遮られているので、そのピクセルは影になります。
この章の確認ポイント
確認問題:
- 影とは、カメラから見えない場所のことか?
- 影とは、ライトから見えない場所のことか?
- シャドウマップには色が保存されるのか?
- シャドウマップには何が保存されるのか?
答え:
1. 違う
2. そう
3. 違う
4. ライトから見た一番手前のZ値
No Comments