Skip to main content

その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. シャドウマップには何が保存されるのか?

答え:

1. 違う
2. そう
3. 違う
4. ライトから見た一番手前のZ値