シャドウマッピング英語: shadow mapping)またはシャドウプロジェクション英語: shadowing projection)は、3次元コンピュータグラフィックスで実現する手法である。1978年にランス・ウィリアムズ英語版が「Casting curved shadows on curved surfaces」という論文で導入し[1]、以降、多くのコンソールやPCゲームでプリレンダリングおよびリアルタイムのシーンで使用されている。

シャドウマッピングを適用したシーン
シャドウマッピング未適用のシーン

影はピクセルが光源から見えるかどうかをテストすることで作成される。各ピクセルを、テクスチャの形で保存されたZバッファまたは光源の視点からのデプス(深度)画像と比較する[2]

影とシャドウマップの原理

編集

光源に視点を置けばすべての物体は光が当たっているように見え、影はそれらの物体の後ろにできる。これがシャドウマップを作成する基本的な原理である。まず光の視点からレンダリングを行い、そこから見える表面の深さを保存する(シャドウマップ)。次に、通常のシーンをレンダリングし、描画する各ピクセルの深さをこの深度マップと比較する。

この手法はシャドウボリューム英語版よりも精度が低い。しかし、シーンの内容にもよるが、シャドウマッピングの方が高速でリアルタイム描画に適していることがある。さらに、シャドウマップは追加のステンシルバッファを必要とせず、エッジの柔らかい影を生成するといった応用もできる。ただしシャドウマップの精度はその解像度に制限される。

アルゴリズムの概要

編集

影の付いたシーンをレンダリングするには、2つの主なステップが必要となる。最初のステップではシャドウマップ自体を生成し、次のステップでそれをシーンに適用する。実装によっては(あるいは光源の数によって)、2回以上の描画パスが必要となる場合がある。

シャドウマップの作成

編集
 
光源の視点からレンダリングしたシーン
 
光源の視点からの深度マップ

最初のステップでは、光源の視点からシーンをレンダリングする。点光源の場合、視点は影を描写する範囲に合わせた透視投影(四角いスポットライトのようなもの)になる。平行光(英語: directional light、例:太陽からの光)の場合、正投影を使用する。

このレンダリング結果から深度バッファが抽出され、深度マップとして保存される。必要なのは深度情報だけであるため、描画時間を節約するために、色バッファの更新を避け、すべての照明とテクスチャ計算を無効にするのが一般的である。この深度マップはグラフィックメモリにテクスチャとして保存されることが多い。

この深度マップは、光源やシーン内の物体に変化があるたびに更新する必要があるが、視点カメラだけが動く場合などでは再利用できる。複数の光がある場合、各光源には別々の深度マップを使用する必要がある。

多くの実装では、シャドウマップの再描画時間を節約するため、シーン内の物体の一部だけをレンダリングする。影が落ちる表面の深度に近い値が深度マップにある場合のZファイティング英語版問題を解決するため、物体を光から遠ざける方向に深度オフセットを適用することもある。あるいは、物体の前面をカリング英語版し、背面だけをシャドウマップにレンダリングすることでも同様の結果を得ることができる。

シーンのシェーディング

編集

次のステップでは、通常のカメラの視点でシーンを描画し、シャドウマップを適用する。物体の座標を光源から見た座標に変換することで、光源の視点で作成しておいたシャドウマップ上のどこに物体が対応するのかが分かる。変換したz座標をシャドウマップのz値と比較(深度テスト)し、影になっているか光に当たっているかのどちらかを判断して物体を描画する。

シャドウマップのリアルタイム実装

編集

リアルタイムシャドウマッピングの主な欠点の一つは、シャドウマップのサイズと深度により影の品質が決まることである。影の品質が低いとエイリアシングや影が途切れるといった問題が現れる。それを改善する単純な方法はシャドウマップのサイズを増やすことだが、メモリ使用量や計算量の増加、ハードウェアの制限により難しいこともある。リアルタイムシャドウマッピングのために広く使用されている手法では、この制限を回避するための工夫が行われている。代表的なものを挙げると、カスケードシャドウマップ[3]、台形シャドウマップ[4]、ライトスペースパースペクティブシャドウマップ[5]、またはパラレルスプリットシャドウマップなどである[6]

また、生成された影は硬いエッジを持つ。現実世界の柔らかい影をエミュレートするために、シャドウマップで複数のルックアップを行う、柔らかいエッジをエミュレートするためのジオメトリを生成する、通常と異なる深度シャドウマップを作成するといった解決策が開発されている。代表的なものに、Percentage Closer Filtering (PCF)[7]、Smoothies[8]、分散シャドウマップ (英語: Variance Shadow maps)[9]などがある。

関連項目

編集

脚注

編集
  1. ^ Lance Williams. Casting curved shadows on curved surfaces. http://cseweb.ucsd.edu/~ravir/274/15/papers/p270-williams.pdf 2020年12月22日閲覧。. 
  2. ^ Akenine-Mo ̈ller, Tomas; Haines, Eric; Hoffman, Naty (2018-08-06) (英語). Real-Time Rendering, Fourth Edition. CRC Press. ISBN 978-1-351-81615-1. https://books.google.com/books?id=0g1mDwAAQBAJ&q=%22shadow+mapping%22+%22z-buffer%22&pg=PA234 
  3. ^ Cascaded shadow maps. NVidia. http://developer.download.nvidia.com/SDK/10.5/opengl/src/cascaded_shadow_maps/doc/cascaded_shadow_maps.pdf 2008年2月14日閲覧。. 
  4. ^ Tobias Martin; Tiow-Seng Tan. Anti-aliasing and Continuity with Trapezoidal Shadow Maps. http://www.comp.nus.edu.sg/~tants/tsm.html 2008年2月14日閲覧。. 
  5. ^ Michael Wimmer; Daniel Scherzer; Werner Purgathofer. Light Space Perspective Shadow Maps. http://www.cg.tuwien.ac.at/research/vr/lispsm/ 2008年2月14日閲覧。. 
  6. ^ Fan Zhang; Hanqiu Sun; Oskari Nyman. “Parallel-Split Shadow Maps on Programmable GPUs”. GPU Gems 3. オリジナルのJanuary 17, 2010時点におけるアーカイブ。. https://web.archive.org/web/20100117072256/http://appsrv.cse.cuhk.edu.hk/~fzhang/pssm_project/ 2008年2月14日閲覧。. 
  7. ^ Shadow Map Antialiasing”. NVidia. 2008年2月14日閲覧。
  8. ^ Eric Chan, Fredo Durand, Marco Corbetta. Rendering Fake Soft Shadows with Smoothies. http://people.csail.mit.edu/ericchan/papers/smoothie/ 2008年2月14日閲覧。. 
  9. ^ Variance Shadow Maps”. 2008年2月14日閲覧。