シャドウマップを用いた影描画について
シャドウマップを用いた影描画についてのメモ
基本的なことですが、思う所があり、メモしておく。
シャドウマップの大きさ、描画範囲も大事だけど、深度の範囲の考慮も大事。
■ライトカメラ空間に適応する射影行列について
パースペクティブ (透視投影) 射影行列を使う方法と正射影を使う方法がある。
パースペクティブ (透視投影) 射影行列:
ライトの位置に光源を配置した時にできる広がりのある影が描画される。
シャドウマップテクスチャに書き込まれる深度値は、非線形なので、シャドウマップの影判定は、ライトカメラに近いオブジェクトと遠いオブジェクトがある場合、近いオブジェクトの方が精度が良くなる。
正射影行列:
平行光によってできる、広がりのない影が描画される。
シャドウマップテクスチャに書き込まれる深度値は、線形なので、シャドウマップの影判定は、ライトカメラに近いオブジェクトと遠いオブジェクトがある場合、判定精度に変化はない。
■綺麗な影を描画するために必要なことについて
・描画対象のオブジェクトをシャドウマップテクスチャに無駄なく描画する必要がある。
⇒描画対象オブジェクトを包み込むAABBを計算し、計算したAABBの領域を描画可能な射影行列を定義すればよい。
・カメラに近いオブジェクト程、シャドウマップに大きく描画する必要がある。
⇒カスケードシャドウマップ、ライトスペース・パースペクティブ・シャドウマップ(LSPSM)を使用すればよい。個人的には、LSPSMより、カスケードシャドウマップの方が綺麗だと思う。
・シャドウマップテクスチャの深度の範囲について、無駄が無いように描画する必要がある。
⇒ライトカメラ空間におけるnear面、far面を1から1000とした場合に、500から1000の間にしかオブジェクトが存在しないと1から500までの深度の範囲が無駄になってしまう。深度の範囲が無駄になれば、影判定の精度が悪くなる。