2022年7月24日日曜日

Deferred Cascade Shadowmap

前回遅延レンダリングで影ができるようになった。

実はシャドウマップが出来てすぐに遅延レンダリングで試してみていた。
このときは、おっさんメッシュに対して遅延レンダリングをした結果、かなり精度が落ちた影がついてはいた。
全く表示されなかったり、ずれているわけでもないのでこれでうまく行っていて単純に遅延レンダリングにすると、立体から2Dになるので精度が落ちてしまうものなのかと勘違いしていた。

精度を上げる方法をネットで調べた結果、カスケードシャドウマップというものを使えば見栄えが良くなるのではないかと思った。
そこで見つけたのがマイクロソフトのサンプル

これはDirectX11のサンプルなので、12に移植して無謀にもいきなり最初から遅延レンダリングでチャレンジしていた。
そもそもシャドウマップの遅延レンダリングもまともに出来てない状態だったので、カスケードシャドウマップの方はもうめちゃくちゃで全くうまくいかなかった。
幸いサンプルは完全に動作するものだったので、パラメータなどを同じにして移植時に計算が間違っていないか細かく確認していった。
計算結果もほぼ完璧に同じになった状態なのにうまくいかない。
うまくいかない原因は前回の内容で、G-Buffer経由で渡した位置情報では精度が落ちてしまうというものだったんだけど、1週間以上掛けても解決しなかったので遅延レンダリングは一旦諦めた。

そもそもフォワードレンダリングでカスケードシャドウマップが動くのかも確認していなかったので、ちょっと手直しして確かめてみることにした。
これはあっさりうまく行って、やる気が復活。

そこで普通のシャドウマップに戻って遅延レンダリングができるようになったのが前回。
ついにカスケードシャドウマップを遅延レンダリングで試すときが来た。

その前にそもそもシャドウマップにはいろいろ問題がある。
シャドウマップ

この画像は、深度バッファ1024で影プロジェクションのNear、Farを適当に表示される範囲で調整したもの。
表示されるマップの範囲が大きくなると奥のほうが収まらない。その状態で表示すると深度バッファに収まっていない範囲の影がなくなったり、全部影になったりする。影プロジェクションのNear、Farが表示範囲ギリギリに調整されている状態を保っていないと影の精度が悪くなる。
精度が悪いとシャドウアクネが出て、バイアスの値を上げないといけなくなる。上げ過ぎると左の壁の天井の様に隙間ができる。

カスケードシャドウマップ

これがカスケードシャドウマップ。
カスケードレベルは4で、深度バッファは4096×1024。
4回光源から見た深度バッファをレンダリングする。
近くは精度の高い深度バッファを使って、遠くは精度の低い深度バッファ使う。

利用深度バッファ確認

どの深度バッファを利用しているのか色分けするとこんな感じ。
赤が一番手前で、黄緑、青、黄色の順で遠くになる。

カスケードレベル1

ちなみにカスケードレベルを1にして描画した状態がこれ。
なんの考慮もしていないシャドウマップよりかはNear、Farの自動調整がついているので精度が高くなりそう。

0 件のコメント:

コメントを投稿