パストレーシングについて調べてる

前に入門記事を書いてそこから色々調べたりしてたのでその備忘録として

アルゴリズムについて

カメラから出たレイをたどりながら光線のシミュレーションを行う単純なアルゴリズムをレイトレーシングと言って、それを確率的な計算によってオブジェクトの数に依らない計算量で計算できるように改良したものをパストレーシングと呼ぶらしい(正確な定義はよくわからなかったがアルゴリズムの差から名前が違うみたい)。

アルゴリズムの詳細については次とかを見るとよさそう。

パストレーシングアルゴリズムの初出は"The rendering equation (J. Kajiya, 1986)“か?

bidirectional, NEE, metropolis light transport, photon mappingあたりは実装してみたいがお勉強が先かも。

NEE (Next Event Estimation)

悩みとして、memoRANDOMさんのサイトに載ってる通りに、3点のレンダリング方程式をベースにしたNEEを実装してみたけど寄与が小さすぎて全然効果がなかった。単に実装を間違えているだけか?

また、調べているとshadow rayを蓄積したあと反射を行い、そっちで同じ光源に向けてexplicitなrayが飛んだとしたら無視するみたいなアルゴリズムでNEEを計算しているサイトも見かけたけど、それは何か違いがあるのだろうかと思った。NEEの正しいアルゴリズムがよくわからない。(というか、本当はちゃんと平均とかを計算してどういうアルゴリズムなら正しい結果が得られるかは手で確認すべきかなと思う)

Stratified Sampling

層化サンプリングによってサンプルの座標がいい感じに均等にばらけるようにとるといいらしい。これってどれくらいの改善になるのだろうか、気になる。

GPU

どうせならGPU使った計算もしたい。GPUでレイトレーシングやるみたいな話は調べると色々出てくる。

疑問としてロシアンルーレットとかの実装だと分岐が入る(というかレイごとの計算回数が見積もれない)わけだけどその辺はどうするのだろうか。調べた感じだと1レイ1スレッドにするのが普通っぽかったのと、ロシアンルーレットのときにどうするかみたいな話は出てこなかったので、計算を打ち切る代わりに寄与を0にするみたいな感じで並列処理を止めないように作っているのかもしれない。

そもそもシェーダー言語とかCUDAとかにパストレーシングアルゴリズムをナイーブに突っ込んでるのとかよく見るんだけど本当にそんなんでいいの?という気持ちになったりならんかったりする。

Unity

Unity(のComputeShaderなんか)を使うとGPUを使った計算が簡単にできる。要は単にHLSL(これはWindowsだから?)とのintegrationがUnityに用意されているというだけのことだけど、Unityは普通に解説も多いしGPUを使ったレイトレーシングの入門にはいいかもしれない。

例えば次のような画像が割と簡単に出せる。

WebGL

人間に見せるUIとしてWebGLにして吐くのは結構ありかもしれないと思っていた。WebGLはRustを使っても吐けるみたいだった(けど中身は普通にshader言語書いてたのでRustで書けるとは言わない気もする)。

実際にWebGLでやってる例とかもあって面白かったのでなおさら。