質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
OpenGL

OpenGLは、プラットフォームから独立した、デスクトップやワークステーション、モバイルサービスで使用可能な映像処理用のAPIです。

Q&A

0回答

425閲覧

OpenGLでシャドウマッピングを使用した平行光源の影をシーン全体で描画する方法

Rei_312

総合スコア24

OpenGL

OpenGLは、プラットフォームから独立した、デスクトップやワークステーション、モバイルサービスで使用可能な映像処理用のAPIです。

0グッド

0クリップ

投稿2022/04/25 08:14

編集2022/04/26 08:57

前提

OpenGLでゲーム開発をしています。
シャドウマッピングを使用して平行光源によって作られる影を描画しようとしているのですが、
深度マップを作成する際に使用する光の位置を(0, 0, 0)光の注視点を(32, -32, -32)とした場合に、
原点から離れた位置では影が表示されなくなります。

光の位置が存在しているので当然の結果だとは思うのですが(射影行列にfarの値を設定するため)、これを解決する方法が検索しても見つかりません(私のした限りでは)
影の作成方法から変更する必要がありますか?
調べて見たところ、シャドウボリュームという技術もあるようですが、こちらを採用した場合でも同様の問題は発生するでしょうか?

試したこと

・プレイヤーの位置から光の位置を計算する
=>影の内容がプレイヤーの位置によって変わるようになってしまった
・描画する内容を分割してそれぞれ異なる光の位置から深度マップを作成、描画
=>分割の境界で影が切れてしまう、負荷が高い

補足情報(FW/ツールのバージョンなど)

OpenGLバージョン : 4.6.0

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

fana

2022/04/26 05:37 編集

> 原点から離れた位置では影が表示されなくなります。 > 光の位置が存在しているので当然の結果だとは思うのですが この辺の話を詳述できませんか? 現象の詳細がよくわかりませんし,「当然」と述べられているということは原因まではわかっているということかと思いますので,それも明記された方が良いのではないかな,と. 私はシャドウマッピングというのをやったことはありませんが…… ググった雰囲気では,ある3次元位置が影になっているかどうかを判定する方法として, 光源から見たデプスマップを用意しておけば「ある3次元点を光源から観測した際の奥行」と「用意しておいたデプスマップの対応箇所の値」とを比較すればわかるよね,っていう話かと見えます. これが正しいならば,影が表示されない理由は「デプスマップの対応箇所の値」の部分にありそうに思えます. おそらく,デプスマップをつくる際に考慮されている諸々が不十分なのではないでしょうか? 例えば… ・デプスマップの範囲(視野)が足りてない ・デプスマップをつくる際の near,far の範囲が足りてない みたいな.
fana

2022/04/26 06:03 編集

(「シーン」全体をカバーできるように縮小した世界でのデプスマップを作ると解像度的にしょぼすぎてダメ,っていう話なのかな?) このページの下の方の絵(Fig11とか12)を見た感じ,視野範囲をギリカバーするように範囲定めてやろうぜ的な話が書かれているように見える(文章は読んでないですが) https://docs.microsoft.com/en-us/windows/win32/dxtecharts/common-techniques-to-improve-shadow-depth-maps
Rei_312

2022/04/26 09:06

デプスマップの視野についてですが、視野を広くしてしまうと、影の解像度が下がり、光を遮っているオブジェクトの形状と影の形状が違う、といったことになります。逆に解像度を考えて視野を小さくすると影が途中で切れてしまったり、そもそもデプスマップに描画されない、といったことになります。 また、near,farに関しては、nearはプレイヤーの行列と同じ値(1.5)、farはできるだけ大きな値(10000から100000)ほとで試していますが、結果に変化が見られません。 ゲームの仕様上、プレイヤーが移動すれば実質無限にマップが拡大していく
Rei_312

2022/04/26 09:07

ので、事前に計算するのは現実的ではないとおもいます。
fana

2022/04/26 09:28 編集

「各フレームにおいて,デプスマップをそのフレームにおけるカメラ視野のレンダリングに必要な範囲を持つ形で1回計算する」という形態を考えた時点で既に解像度不足で使い物にならない,という話でしょうか? そうであれば… カメラ側の視野(farあたりを)をちょっと諦める(=デプスマップがサポートすべき範囲を縮めることができる)とか…(ダメだな) あとは,カメラに近い範囲だけを扱う高解像度なやつと,広い範囲を扱う低解像なやつとを用意して LOD 的に用いるとか.
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問