NVIDIA から公開されている ReSTIR アルゴリズムを実装してみました。限定的なところまでしかやっていないのですが、収束が速いことは確認できました。
ReSTIR
ReSTIR アルゴリズムは 2020 年に NVIDIA から発表されているものです。その論文は以下のアドレスから読むことができます。
多数の光源をレイトレーシングの過程で扱いつつ、1度に1回のレイを飛ばす程度での処理内容にとどめているためリアルタイムでの動作が可能であり、さらにはノイズが少なく、後段に位置するデノイザの負担を減らす、ということが可能なアルゴリズムとなっています。
完全に理解できているわけではないのですが、概要としては以下のような流れで実現しているのではないかと思います。
- RIS: Resampled Importance Sampling
- WRS: Weighted Reservoir Sampling
- 時間的、および、空間的な Reservoir の再利用
Reservoir と呼ぶデータを保持する領域にそれまでの結果を格納しつつ、時間的に近く、空間的に近くあるところは、積極的に再活用してノイズを減らすということをしているようです。Reservoir には、光源から照らされている情報が集約されているので、それらを活用することで1度に多数のライト情報を扱ったのと同等、という感じになるのかなと思います。
今回実装したものについて
実装してみたものは、とりあえず全マテリアルは Lambert として、処理したものになっています。また光源も点光源のみに限定して、シーン内に適当においたものです。
Reservoir の再利用なしにした状態で、単なる累積による結果加算としても割ときれいな絵が速く収束して表示されるのですが、収束するにつれて光の加減が変わってくる、ということも確認できました。以下の図は Frame 0 と、収束後の状態 (Spatial Reuse なし) でのものです。動いていないのでなかなかわかりませんが、キューブの白く光の当たっている部分の領域が少し小さくなるように収束していきます。
これが Spatial Reuse 有効にすると、そのような動きを見せることなく、ノイズが減る方向での収束過程として感じられたと思います。
その他
私がこれらを実装していたときには、 Twitter を見ているとちょうどブームがあったのか、数名の方が同時に実装を行っていました。それを見ながら進めていたのもありますが、それぞれの動きを見ていると、やはり収束が速いのは共通しているなと思いました。
また、2022年の GW あたりには、 GRIS (Generalized Resampled Importance Sampling) というものが発表されて、うごくサンプルリポジトリも公開されました。こちらの内容もとても興味深いですね。
参考
- https://zin-box.blogspot.com/2020/12/resampled-importance-sampling-weighted.html
- RIS について、日本語のテキストとして参考にしました
- https://github.com/shocker-0x15/GfxExp
- ReSTIR の実装が含まれており、部分的に日本語での記載があります。
- https://twitter.com/yknishidate/status/1524292707170275328
- Twitter より。
コメント