前提
OpenGLでゲーム開発をしています。
シャドウマッピングを使用して平行光源によって作られる影を描画しようとしているのですが、
深度マップを作成する際に使用する光の位置を(0, 0, 0)光の注視点を(32, -32, -32)とした場合に、
原点から離れた位置では影が表示されなくなります。
光の位置が存在しているので当然の結果だとは思うのですが(射影行列にfarの値を設定するため)、これを解決する方法が検索しても見つかりません(私のした限りでは)
影の作成方法から変更する必要がありますか?
調べて見たところ、シャドウボリュームという技術もあるようですが、こちらを採用した場合でも同様の問題は発生するでしょうか?
試したこと
・プレイヤーの位置から光の位置を計算する
=>影の内容がプレイヤーの位置によって変わるようになってしまった
・描画する内容を分割してそれぞれ異なる光の位置から深度マップを作成、描画
=>分割の境界で影が切れてしまう、負荷が高い
補足情報(FW/ツールのバージョンなど)
OpenGLバージョン : 4.6.0
> 原点から離れた位置では影が表示されなくなります。
> 光の位置が存在しているので当然の結果だとは思うのですが
この辺の話を詳述できませんか?
現象の詳細がよくわかりませんし,「当然」と述べられているということは原因まではわかっているということかと思いますので,それも明記された方が良いのではないかな,と.
私はシャドウマッピングというのをやったことはありませんが……
ググった雰囲気では,ある3次元位置が影になっているかどうかを判定する方法として,
光源から見たデプスマップを用意しておけば「ある3次元点を光源から観測した際の奥行」と「用意しておいたデプスマップの対応箇所の値」とを比較すればわかるよね,っていう話かと見えます.
これが正しいならば,影が表示されない理由は「デプスマップの対応箇所の値」の部分にありそうに思えます.
おそらく,デプスマップをつくる際に考慮されている諸々が不十分なのではないでしょうか?
例えば…
・デプスマップの範囲(視野)が足りてない
・デプスマップをつくる際の near,far の範囲が足りてない
みたいな.
(「シーン」全体をカバーできるように縮小した世界でのデプスマップを作ると解像度的にしょぼすぎてダメ,っていう話なのかな?)
このページの下の方の絵(Fig11とか12)を見た感じ,視野範囲をギリカバーするように範囲定めてやろうぜ的な話が書かれているように見える(文章は読んでないですが)
https://docs.microsoft.com/en-us/windows/win32/dxtecharts/common-techniques-to-improve-shadow-depth-maps
デプスマップの視野についてですが、視野を広くしてしまうと、影の解像度が下がり、光を遮っているオブジェクトの形状と影の形状が違う、といったことになります。逆に解像度を考えて視野を小さくすると影が途中で切れてしまったり、そもそもデプスマップに描画されない、といったことになります。
また、near,farに関しては、nearはプレイヤーの行列と同じ値(1.5)、farはできるだけ大きな値(10000から100000)ほとで試していますが、結果に変化が見られません。
ゲームの仕様上、プレイヤーが移動すれば実質無限にマップが拡大していく
ので、事前に計算するのは現実的ではないとおもいます。
「各フレームにおいて,デプスマップをそのフレームにおけるカメラ視野のレンダリングに必要な範囲を持つ形で1回計算する」という形態を考えた時点で既に解像度不足で使い物にならない,という話でしょうか?
そうであれば… カメラ側の視野(farあたりを)をちょっと諦める(=デプスマップがサポートすべき範囲を縮めることができる)とか…(ダメだな)
あとは,カメラに近い範囲だけを扱う高解像度なやつと,広い範囲を扱う低解像なやつとを用意して LOD 的に用いるとか.
あなたの回答
tips
プレビュー