シャドウマッピング
From Wikipedia, the free encyclopedia


シャドウマッピング(英語: shadow mapping)またはシャドウプロジェクション(英語: shadowing projection)は、影を3次元コンピュータグラフィックスで実現する手法である。1978年にランス・ウィリアムズが「Casting curved shadows on curved surfaces」という論文で導入し[1]、以降、多くのコンソールやPCゲームでプリレンダリングおよびリアルタイムのシーンで使用されている。
影はピクセルが光源から見えるかどうかをテストすることで作成される。各ピクセルを、テクスチャの形で保存されたZバッファまたは光源の視点からのデプス(深度)画像と比較する[2]。
光源に視点を置けばすべての物体は光が当たっているように見え、影はそれらの物体の後ろにできる。これがシャドウマップを作成する基本的な原理である。まず光の視点からレンダリングを行い、そこから見える表面の深さを保存する(シャドウマップ)。次に、通常のシーンをレンダリングし、描画する各ピクセルの深さをこの深度マップと比較する。
この手法はシャドウボリュームよりも精度が低い。しかし、シーンの内容にもよるが、シャドウマッピングの方が高速でリアルタイム描画に適していることがある。さらに、シャドウマップは追加のステンシルバッファを必要とせず、エッジの柔らかい影を生成するといった応用もできる。ただしシャドウマップの精度はその解像度に制限される。
アルゴリズムの概要
影の付いたシーンをレンダリングするには、2つの主なステップが必要となる。最初のステップではシャドウマップ自体を生成し、次のステップでそれをシーンに適用する。実装によっては(あるいは光源の数によって)、2回以上の描画パスが必要となる場合がある。
シャドウマップの作成


最初のステップでは、光源の視点からシーンをレンダリングする。点光源の場合、視点は影を描写する範囲に合わせた透視投影(四角いスポットライトのようなもの)になる。平行光(英語: directional light、例:太陽からの光)の場合、正投影を使用する。
このレンダリング結果から深度バッファが抽出され、深度マップとして保存される。必要なのは深度情報だけであるため、描画時間を節約するために、色バッファの更新を避け、すべての照明とテクスチャ計算を無効にするのが一般的である。この深度マップはグラフィックメモリにテクスチャとして保存されることが多い。
この深度マップは、光源やシーン内の物体に変化があるたびに更新する必要があるが、視点カメラだけが動く場合などでは再利用できる。複数の光がある場合、各光源には別々の深度マップを使用する必要がある。
多くの実装では、シャドウマップの再描画時間を節約するため、シーン内の物体の一部だけをレンダリングする。影が落ちる表面の深度に近い値が深度マップにある場合のZファイティング問題を解決するため、物体を光から遠ざける方向に深度オフセットを適用することもある。あるいは、物体の前面をカリングし、背面だけをシャドウマップにレンダリングすることでも同様の結果を得ることができる。
シーンのシェーディング
次のステップでは、通常のカメラの視点でシーンを描画し、シャドウマップを適用する。物体の座標を光源から見た座標に変換することで、光源の視点で作成しておいたシャドウマップ上のどこに物体が対応するのかが分かる。変換したz座標をシャドウマップのz値と比較(深度テスト)し、影になっているか光に当たっているかのどちらかを判断して物体を描画する。