Skip to content
Go back

Cascaded Shadow Maps

· Updated:

url

拙訳

Introduction

Cascaded Shadow Maps (CSM)

スクリーン空間のエイリアシング誤差を改善しようとする人気のアプローチがいくつかある。これらは伝統的に視錐台全体に作用する。これらのテクニックはCSMのすべての錐台スライスに適用できるが、品質はそれほど改善せず、アルゴリズムの複雑さを増やすことになるだけだろう。実際、CSMはPerspective Shadow Mapsの離散化であると考えることができる。

Perspective Shadow Maps (PSM)[Stamminger and Drettakis 2002Stamminger, M. and Drettakis, G. 2002. Perspective shadow maps. Proceedings of the 29th annual conference on computer graphics and interactive techniques 557–562. 10.1145/566570.566616. https://www-sop.inria.fr/reves/Basilic/2002/SD02/PerspectiveShadowMaps.pdf.]は視錐台と同じ空間を占めるcoincideようにライト錐台を歪ませる。大まかに言うと、これは現在のカメラの射影後post-perspectiveの空間で標準のシャドウマッピングを適用することで達成される。この手法の欠点は光源の位置やタイプが直観的に変化しないことであり、それ故に、コンピュータゲームにおいてあまり一般的ではない。

Light Space Perspective Shadow Maps (LiPSM)[Wimmer et al. 2004Wimmer, M., Scherzer, D. and Purgathofer, W. 2004. Light space perspective shadow maps. Proceedings of the fifteenth eurographics conference on rendering techniques 143–151. https://diglib.eg.org/server/api/core/bitstreams/fc2f233d-529f-4261-a7e3-a74835553a29/content.]は光源の方向を変更しない方法でライト錐台を歪ませる。この錐台はライト方向に垂直(シャドウマップに平衡)な視線を持つように作られ、カメラ錐台と可能性のあるシャドウキャスタを含むよう適切に大きさが決められる。PSMと比べて、LiPSMには特殊なケースはそれほどないが、シャドウマップテクスチャを完全には使えていない。

Trapezoidal Shadow Maps (TSM) [Martin and Tan 2004Martin, T. and Tan, T.-S. 2004. Anti-aliasing and continuity with trapezoidal shadow maps. Eurographics workshop on rendering. 10.2312/EGWR/EGSR04/153-160. https://www.comp.nus.edu.sg/~tants/tsm.html.]はライトから見えるようなカメラ錐台の境界台形bounding trapezoidを構築する。そのアルゴリズムは他のアプローチと似たように行われる。

Detailed Overview

Shadow-map generation

ある意味で、ライトの錐台は、遮蔽物足り得るモノすべてを捕らえるよう近場が十分に拡張された、カメラ錐台スライスのバウンディングボックスである。木の上に遮蔽物Bがあった場合、そのボックスは適切に拡張されるべきであり、そうでなければ、Bはシャドウをキャストしないだろう。

(図2-1:カメラ錐台スプリット)

アルゴリズムの第一段階ではカメラアイ空間での視錐台のスプリットのZ値を計算する。シャドウマップのピクセルが辺の長さdsdsを持つとする。キャストするシャドウはスクリーンのdpdp分を占める。これは影付けされるオブジェクトの法線と位置に依存する。

dpds=ndzzdscosϕcosθ\frac{dp}{ds} = n \frac{dz}{zds} \frac{\cos\phi}{\cos\theta}

ここで、nnは視錐台のニア距離である。

理論上、スクリーンできっちり同じ誤差を出すには、dp/dsdp/dsは定数となるはずである。加えて、我々はパースペクティブ誤差のみを最小化するので、コサイン依存のファクタも定数として扱うことができ、それはプロジェクション誤差の原因となる。故に以下となる。

dzzds=ρ,ρ=ln(f/n)\frac{dz}{zds} = \rho, \quad \rho = \ln(f / n)

ここで、ρ\rhoの値は制約s[0;1]s \in [0; 1]により強制される。

zzに対して上記の式を解いて離散化することで、以下のようにスプリットポイントが指数関数的に分布するはずである(スプリット数NNは大きいと仮定する)。

zi=n(f/n)i/Nz_i = n (f / n)^{i / N}

ここで、NNはスプリットの総数である。より詳細な導出は[Zhang et al. 2006Zhang, F., Sun, H., Xu, L. and Lun, L. K. 2006. Parallel-split shadow maps for large-scale virtual environments. Proceedings of the 2006 ACM international conference on virtual reality continuum and its applications 311–318. 10.1145/1128923.1128975.]を参照ください。

(図2-2:ビュアーの真上のライトからのライト錐台)

しかし、一般的にNNは1や4となるので、この式ではシャドウ解像度が急激に変化することでスプリットポイントが分かってしまう。図2-2はこの不一致discrepancyの理由を示す: 視錐台の外でありライト錐台の中であるエリアは見えないので無駄になっている。ただし、NN \rightarrow \inftyとなるたびにこのエリアは0に近づく。

この効果に対抗するためにiiに線形な項を追加することで、その差異はもはやほとんど分からなくなる。

zi=λn(f/n)i/N+(1λ)(n+(i/N)(fn))z_i = \lambda n (f / n)^{i / N} + (1 - \lambda)(n + (i / N)(f - n))

ここで、λ\lambdaは補正の強さを制御する。

zzでのスプリットが分かった後は、スクリーンの視野角とアスペクト比から現在の錐台スライスの角の点を計算する。詳細は[Fernandes 2011Fernandes, A. R. 2011. View Frustum Culling. Lighthouse3d.com. https://web.archive.org/web/20150513073723/http://www.lighthouse3d.com/tutorials/view-frustum-culling/.]を参照のこと。

その間に、ライトのモデルビュー行列M\boldsymbol{M}がライト方向を向くようにセットされ、汎用正射影行列PPが単位行列にセットされる。その後、カメラ錐台スライスの各角の点p\boldsymbol{p}がライト同次空間でph=PMp\boldsymbol{p}_h = \boldsymbol{P}\boldsymbol{M}\boldsymbol{p}に射影される。各方向における最小値mim_iと最大値MiM_iはライト錐台(ボックス)と並行となるバウンディングボックスを形成し、これから、しっかり一致するcoincideように汎用ライト錐台を構築するスケーリングやオフセットを決定する。実際に、これはzzでは最良の精度を、xxyyではできるだけ緩みの少ない精度を得ることを確実にし、クロップ行列CCを構築することで達成される。最後に、ライトの射影行列PPP=CPzP = CP_zに修正される。ここで、PzP_zはニア面とファー面にmzm_zMzM_zを持つ直交行列であり、CCは以下の行列である。

C=(Sx00Ox0Sy0Oy00100001),Sx=2MxmxSy=2MymyOx=0.5(Mx+mx)SxOy=0.5(My+my)SyC = \left( \begin{array}{c} S_x & 0 & 0 & O_x \\ 0 & S_y & 0 & O_y \\ 0 & 0 & 1 & 0 \\ 0 & 0 & 0 & 1 \end{array} \right), \quad \begin{array}{rcl} S_x & = & \frac{2}{M_x - m_x} \\ S_y & = & \frac{2}{M_y - m_y} \\ O_x & = & -0.5 (M_x + m_x) S_x \\ O_y & = & -0.5 (M_y + m_y) S_y \end{array}

ライトの錐台が錐台スライスときっちり一致するようにすることができるが、これはPerspective Shadow Mapsのようにライトの方向やタイプを変更することに注意する。

また、シーンは錐台スライスiiごとに錐台カリングされ、モデルビューと射影の行列として(CPfM)i(CP_fM)_ iを用いてすべてが深度レイヤにレンダリングされる。そして、すべての錐台パーティションに対して手続き全体が繰り返される。

Final scene rendering

前のステップで生成されたシャドウマップ1N1 \dots Nは、このステップではオブジェクトが影の中にいるかどうかを決定するのに使われる。レンダリングされたピクセルごとに、そのZ値が以前に計算したN個のZ範囲と比較される。以降、ii番目の範囲に含まれるとする。ピクセルシェーダはこの値を射影後の空間で受け取ることに注意する。

そして、フラグメントの位置は、カメラのモデルビュー逆行列Mc1Mc^{-1}を用いてワールド空間に変換される。その後、スライスiiのライトの行列で乗算される。この変換は複合的な行列(CPfM)iMc1(CP_fM)_ i Mc^{-1}に捕捉される。最後に、射影された点が[1;1][-1; 1]から[0;1][0; 1]に線形にスケールされる。この変換の後、フラグメントのXY位置はii番目の深度マップのテクスチャ座標であり、Z座標はライトからパーティクルへの距離を示す。ルックアップを行うことで、同じ方向におけるライトからもっとも近い遮蔽物への距離が分かる。これら2つの値を比較することで、フラグメントが影の中にあるかが分かる。

Code Overview

Results

Conclusion

References