シャドウマッピングのソースを表示
←
シャドウマッピング
ナビゲーションに移動
検索に移動
あなたには「このページの編集」を行う権限がありません。理由は以下の通りです:
この操作は、次のグループに属する利用者のみが実行できます:
登録利用者
。
このページのソースの閲覧やコピーができます。
[[Image:7fin.png|thumbnail|right|シャドウマッピングを適用したシーン]] [[Image:3noshadow.png|thumbnail|right|シャドウマッピング未適用のシーン]] '''シャドウマッピング'''({{Lang-en|shadow mapping}})または'''シャドウプロジェクション'''({{Lang-en|shadowing projection}})は、[[影]]を[[3次元コンピュータグラフィックス]]で実現する手法である。1978年に{{仮リンク|ランス・ウィリアムズ|en|Lance Williams (graphics researcher)}}が「Casting curved shadows on curved surfaces」という論文で導入し<ref> {{cite journal | title = Casting curved shadows on curved surfaces | author1=Lance Williams | url = http://cseweb.ucsd.edu/~ravir/274/15/papers/p270-williams.pdf | access-date = 2020-12-22 }} </ref>、以降、多くの[[コンシューマーゲーム|コンソール]]やPCゲームでプリレンダリングおよびリアルタイムのシーンで使用されている。 影は[[ピクセル]]が光源から見えるかどうかをテストすることで作成される。各ピクセルを、[[テクスチャ]]の形で保存された[[Zバッファ]]または光源の視点からのデプス(深度)画像と比較する<ref>{{Cite book|last1=Akenine-Mo ̈ller|first1=Tomas|url=https://books.google.com/books?id=0g1mDwAAQBAJ&q=%22shadow+mapping%22+%22z-buffer%22&pg=PA234|title=Real-Time Rendering, Fourth Edition|last2=Haines|first2=Eric|last3=Hoffman|first3=Naty|date=2018-08-06|publisher=CRC Press|isbn=978-1-351-81615-1|language=en}}</ref>。 == 影とシャドウマップの原理 == 光源に視点を置けばすべての物体は光が当たっているように見え、影はそれらの物体の後ろにできる。これがシャドウマップを作成する基本的な原理である。まず光の視点からレンダリングを行い、そこから見える表面の深さを保存する(シャドウマップ)。次に、通常のシーンをレンダリングし、描画する各ピクセルの深さをこの深度マップと比較する。 この手法は{{仮リンク|シャドウボリューム|en|Shadow volume}}よりも精度が低い。しかし、シーンの内容にもよるが、シャドウマッピングの方が高速でリアルタイム描画に適していることがある。さらに、シャドウマップは追加の[[ステンシルバッファ]]を必要とせず、エッジの柔らかい影を生成するといった応用もできる。ただしシャドウマップの精度はその解像度に制限される。 == アルゴリズムの概要 == 影の付いたシーンをレンダリングするには、2つの主なステップが必要となる。最初のステップではシャドウマップ自体を生成し、次のステップでそれをシーンに適用する。実装によっては(あるいは光源の数によって)、2回以上の描画パスが必要となる場合がある。 === シャドウマップの作成 === [[Image:1light.png|thumb|right|150px|光源の視点からレンダリングしたシーン]] [[Image:2shadowmap.png|thumb|right|150px|光源の視点からの深度マップ]] 最初のステップでは、光源の視点からシーンをレンダリングする。点光源の場合、視点は影を描写する範囲に合わせた[[透視投影]](四角いスポットライトのようなもの)になる。平行光({{Lang-en|directional light}}、例:[[太陽]]からの光)の場合、[[正投影]]を使用する。 このレンダリング結果から深度バッファが抽出され、深度マップとして保存される。必要なのは深度情報だけであるため、描画時間を節約するために、色バッファの更新を避け、すべての照明とテクスチャ計算を無効にするのが一般的である。この[[深度マップ]]はグラフィックメモリにテクスチャとして保存されることが多い。 この深度マップは、光源やシーン内の物体に変化があるたびに更新する必要があるが、視点カメラだけが動く場合などでは再利用できる。複数の光がある場合、各光源には別々の深度マップを使用する必要がある。 多くの実装では、シャドウマップの再描画時間を節約するため、シーン内の物体の一部だけをレンダリングする。影が落ちる表面の深度に近い値が深度マップにある場合の{{仮リンク|Zファイティング|en|Z-fighting}}問題を解決するため、物体を光から遠ざける方向に深度オフセットを適用することもある。あるいは、物体の前面を{{仮リンク|カリング|en|Culling (computer graphics)}}し、背面だけをシャドウマップにレンダリングすることでも同様の結果を得ることができる。 === シーンのシェーディング === 次のステップでは、通常の[[透視投影|カメラ]]の視点でシーンを描画し、シャドウマップを適用する。物体の座標を光源から見た座標に変換することで、光源の視点で作成しておいたシャドウマップ上のどこに物体が対応するのかが分かる。変換したz座標をシャドウマップのz値と比較(深度テスト)し、影になっているか光に当たっているかのどちらかを判断して物体を描画する。 <!-- ==== ライト空間座標 ==== [[Image:4overmap.png|thumb|right|150px|シーンに投影された深度マップの可視化]] 深度マップに対してワールド座標をテストするには、それを光源から見た座標に変換する必要がある。これは[[行列の乗算|行列の乗法]]によって実現できる。物体の位置は[[座標変換]]で画面座標に写されるが、ライト空間内で見たオブジェクトの位置を示すためにも別の座標が必要となる。 ワールド座標を光源視点座標に変換するために使用する行列は、最初のステップでシャドウマップをレンダリングするために使用されたものと同じである([[OpenGL]]ではモデルビュー変換行列と射影行列の積)。これにより、''射影除算''(''3D投影''を参照)によって''正規化デバイス座標''となる前の{{仮リンク|同次座標|en|Homogeneous coordinates}}が算出される。''正規化デバイス座標''とは、''x''、''y''、''z''の各要素が(視点から見える場合)-1から1の間に収まる座標である。多くの実装(OpenGLや[[Direct3D]]など)では追加の''scale and bias''行列乗算を行い、-1から1の値を深度マップ(テクスチャマップ)のルックアップに適した0~1の値にマッピングする必要がある。このスケーリングは射影除算の前に行うことができ、次の行列と前の変換計算を掛け合わせることで簡単に前の変換計算に折り込むことができる。 <math> \begin{bmatrix} 0.5 & 0 & 0 & 0.5 \\ 0 & 0.5 & 0 & 0.5 \\ 0 & 0 & 0.5 & 0.5 \\ 0 & 0 & 0 & 1 \end{bmatrix} </math> シェーダーや他のGPU拡張で行われる場合、この変換は頂点レベルで通常は適用される。生成された値は頂点間で補間され、フラグメントレベルに渡される。 --> == シャドウマップのリアルタイム実装 == リアルタイムシャドウマッピングの主な欠点の一つは、シャドウマップのサイズと深度により影の品質が決まることである。影の品質が低いと[[折り返し雑音|エイリアシング]]や影が途切れるといった問題が現れる。それを改善する単純な方法はシャドウマップのサイズを増やすことだが、メモリ使用量や計算量の増加、ハードウェアの制限により難しいこともある。リアルタイムシャドウマッピングのために広く使用されている手法では、この制限を回避するための工夫が行われている。代表的なものを挙げると、カスケードシャドウマップ<ref> {{Cite journal|title=Cascaded shadow maps|url=http://developer.download.nvidia.com/SDK/10.5/opengl/src/cascaded_shadow_maps/doc/cascaded_shadow_maps.pdf|publisher=[[NVidia]]|access-date=2008-02-14}} </ref>、台形シャドウマップ<ref> {{cite journal | title = Anti-aliasing and Continuity with Trapezoidal Shadow Maps |author1=Tobias Martin |author2=Tiow-Seng Tan | url = http://www.comp.nus.edu.sg/~tants/tsm.html | access-date = 2008-02-14 }} </ref>、ライトスペースパースペクティブシャドウマップ<ref> {{cite journal | title = Light Space Perspective Shadow Maps |author1=Michael Wimmer |author2=Daniel Scherzer |author3=Werner Purgathofer | url = http://www.cg.tuwien.ac.at/research/vr/lispsm/ | access-date = 2008-02-14 }} </ref>、またはパラレルスプリットシャドウマップなどである<ref> {{cite journal|author1=Fan Zhang|author2=Hanqiu Sun|author3=Oskari Nyman|title=Parallel-Split Shadow Maps on Programmable GPUs|url=https://developer.nvidia.com/gpugems/gpugems3/part-ii-light-and-shadows/chapter-10-parallel-split-shadow-maps-programmable-gpus|url-status=dead|journal=GPU Gems 3|archive-url=https://web.archive.org/web/20100117072256/http://appsrv.cse.cuhk.edu.hk/~fzhang/pssm_project/|archive-date=January 17, 2010|access-date=2008-02-14}}</ref>。 また、生成された影は硬いエッジを持つ。現実世界の[[本影|柔らかい影]]をエミュレートするために、シャドウマップで複数のルックアップを行う、柔らかいエッジをエミュレートするためのジオメトリを生成する、通常と異なる深度シャドウマップを作成するといった解決策が開発されている。代表的なものに、Percentage Closer Filtering (PCF)<ref> {{cite web|url=https://developer.nvidia.com/gpugems/GPUGems/gpugems_ch11.html|title=Shadow Map Antialiasing|publisher=[[NVidia]]|access-date=2008-02-14}}</ref>、Smoothies<ref> {{cite journal | title = Rendering Fake Soft Shadows with Smoothies | author = Eric Chan, Fredo Durand, [[Marco Corbetta]] | url = http://people.csail.mit.edu/ericchan/papers/smoothie/ | access-date = 2008-02-14 }} </ref>、分散シャドウマップ ({{Lang-en|Variance Shadow maps}})<ref> {{cite web | title = Variance Shadow Maps |author1=William Donnelly |author2=Andrew Lauritzen | url = http://www.punkuser.net/vsm/ | access-date = 2008-02-14 }}</ref>などがある。 == 関連項目 == * {{仮リンク|シャドウボリューム|en|Shadow volume}} * {{仮リンク|レイキャスト|en|Ray casting}} [[レイトレーシング]]で使われる、より低速な手法 * [[フォトンマッピング]] さらに遅いが現実的な照明レンダリングを実現できる * [[ラジオシティ]] == 脚注 == {{Reflist}} {{3Dレンダリング}} {{DEFAULTSORT:しやとうまつひんく}} [[Category:コンピュータグラフィックス]] [[Category:3DCG]]
このページで使用されているテンプレート:
テンプレート:3Dレンダリング
(
ソースを閲覧
)
テンプレート:Cite book
(
ソースを閲覧
)
テンプレート:Cite journal
(
ソースを閲覧
)
テンプレート:Cite web
(
ソースを閲覧
)
テンプレート:Lang-en
(
ソースを閲覧
)
テンプレート:Reflist
(
ソースを閲覧
)
テンプレート:仮リンク
(
ソースを閲覧
)
シャドウマッピング
に戻る。
ナビゲーション メニュー
個人用ツール
ログイン
名前空間
ページ
議論
日本語
表示
閲覧
ソースを閲覧
履歴表示
その他
検索
案内
メインページ
最近の更新
おまかせ表示
MediaWiki についてのヘルプ
特別ページ
ツール
リンク元
関連ページの更新状況
ページ情報