アンビエントオクルージョンちゃん

コンピュータグラフィックスについて書きますっ

より進んだレイトレーシングのために

こんにちは、アンビエントオクルージョンちゃんです。このポストはレイトレ合宿2アドベントカレンダーの11回目だよ♪

私はレイトレーシングはあんまり詳しくないし、合宿にも参加できないんだけど、みんなのために頑張って記事を書くね。

 

いよいよレイトレ合宿も直前に迫ってきたけど、みんなちゃんとレイ飛ばしてるかな?レンダラは出来たかな?満足のいく仕上がりになっている人も、そうでない人も、今まで何度もレイを飛ばしことがある人も、今回が初めてのレイトレーシングって人も、今回の経験を忘れないでほしいんだ。

そこで、今回はより進んだレイトレーシングを作るために知っておいた方がいい知識、単語を簡単に説明していくよ。

 

基礎知識編

Radiometry

物理ベースのレイトレではRadiometryの用語を頻繁に使います。日本語だと放射測定とか呼ぶよ。

Radiance

Radiometryの用語で、放射輝度と呼びます。単位はW・sr^-1・m^-2・nm^-1だよ。一般に、レイトレーシングにおいて一本一本のレイが運ぶ物理量はこれだよ。

Irradiance

やはり、Radiometry用語で放射照度のことです。単位はW・m^−2・nm^-1。単位波長、単位面積あたりの光のエネルギーだね。なお、同じ単位でRadiosityという用語もありますが、Irradianceは入射、Radiosityは出射について指すようです。

レンダリング方程式

レンダリングのための全てを司る方程式です。あの手この手で様々な定式化が存在します。また、ボリュームレンダリングのための拡張版などもあります。Kajiyaによる1986年の論文"The Rendering Equation"が有名ですね。

 BRDF

Bidirectional Radiance Distribution Functionの略だよ。物体表面における光の入射と出射に関する振る舞いを記述する関数です。BRDF如何で、マットな見ためや金属っぽい見た目、いろんな材質が表現できます。非常に様々なモデルが提案されています。拡張も、BSSRDFなど、いろいろなものがあります。

モンテカルロ法

物理ベースにレンダリングを行うために、モンテカルロ法を用いてレンダリング方程式を解きます。これは確率的な手法なので、レンダリング結果にはノイズがのったりしますが、高次元で一般には解くのが難しい積分も扱うことが出来ます。

確率・統計論

モンテカルロ法をはじめ、レンダリングには確率を扱う状況が頻出します。確率の勉強は必須でしょう。また、それに伴い統計に関する知識も必要になることがあります。

Variance

統計の分散と同じです。レンダリング結果の高周波ノイズは分散が大きいために発生することが多いです。レンダリング技術の進歩とは、一つにはこの分散の減少との戦いであったと言えます。

Bias

こちらは少しわかりにくいのですが、解いている問題の「真値」と「推定値の期待値」の差ということになります。

Unbiasedなアルゴリズム

よくUnbiasedを標榜しているレンダリングアルゴリズムがあります。Unbiasedというのは、Biasが常に0ということです。例えば、パストレーシングはUnbiasedで、フォトンマップはBiased、ということになります。

一般にBiasとVarianceの間にはトレードオフがあり、パストレはVarianceは大きくなりノイズが発生します。フォトンマップはVarianceが小さくなりノイズの少ない、あるいは目立たない画を比較的容易に得ることが出来ます。

Consistentなアルゴリズム

また、レンダリングに関わるパラメータ、例えばサンプル数やフォトンの収集半径といったものを限界まで多くしたり、あるいは小さくしていき、極限を取った際にBiasが0になるとき、そのアルゴリズムをConsistentなアルゴリズムと呼びます。

UnbiasやConsistentといった用語は割と濫用される傾向にありますが、大事なことはアルゴリズムの性質を見極め、シーンに適合した手法を状況に応じて選択することです。Unbiasだから最強!とか、そういうことは一切ありません。

Sampling

モンテカルロ積分においては確率的に発生させたサンプルを使って結果を得ます。この過程、サンプリングはレンダリングにおいて欠かせない要素です。与えらえた確率密度関数からサンプルを効率的に得るための方法が様々に考案されています。

Importance Sampling

モンテカルロ積分において分散を減らすための最重要分野です。非常に奥が深い分野ですが、簡単に言うと、「積分対象の関数の形状になるべく近い確率密度関数から生成されたサンプルを使うことで分散を減らす」ためのテクニックです。

Diffuse面においてcosΘに比例してレイを飛ばすのもImportance Samplingの一種です。

Multiple Importance Sampling

積分対象の関数の形状に近い密度関数をうまく作れればいいのですが、現実にはそううまくいきません。そこで、複数の密度関数を使って部分ごとに良い密度関数をつかってサンプリングを行い、その結果を最後に統合する、という手法があります。これがMultiple Importance Samplingです。

たとえば、BRDFに基づいたImporance Samplingを行いつつ、光源に基づいたImportance Samplingを行い、結果をMISで統合する、といった例があります。

モンテカルロ法(Quasi-Monte Caro)

疑似乱数ではなく、低違い量列と呼ばれる数列を使ってサンプリングを行うことでモンテカルロ積分を行う、という手法があります。高次元な積分にはなかなか適用しにくいのですが、例えばピクセルサンプリングやアンビエントオクルージョンなどは比較的低次元の積分になるのでQMCを使うと効率的にノイズを減らすことが出来ます。

レンダラ開発編

シーンやメッシュ

レンダリングする対象であるシーンやメッシュの読み込みは結構大変です。しかし個人用レンダラなら何でもいいので、自分の好きな形式を使うのが良いでしょう。

広く使われている形式ならライブラリも充実しています(FBXとか)し、objとかは世の中に無限にローダーが存在します。

空間分割構造

実際にレンダラを作るうえで大事なのは高速なレイトレーシングです。このために、レンダリングするためのシーンを何らかの方法で空間的に分割する、ということが行われます。分割のためのデータ構造は、たとえばKD-TreeやOctreeなど様々なものがありますが、人気なのはやはりBounding Volume Hierarchyでしょう。

Raytracing.jp - material

にもいくつか情報があります。

アーキテクチャ

レンダラ全体の構造を考えるのは大変なものです。とりあえず、出発点としてはRay Tracing from the Ground UpやPhysically Based Renderingを参考にするのが良いと思います。

画像入出力(HDR

LDRな普通の画像の入出力については世の中に無数に方法があるので問題ないでしょう。問題はHDR画像の入出力です。物理ベースなレイトレの結果は物理的な値であり、非常にレンジの広いものになるためHDR画像を取り扱えたほうが良いでしょう。

といっても、HDR画像のフォーマットはそんなに多くなく、.hdrか.exr形式を使うことになるでしょう。前者はフォーマットの解説が日本語でも英語でも多々あるので自分で簡単に実装できます。後者はOpenEXRを使うのが良いでしょう。

Depth of Field

被写界深度のことです。レンズのボケを再現でき、これを入れると一気にレンダリング結果が写真っぽくなるのでお勧めのエフェクトです。実装はそんなに難しくないので調べてみると良いでしょう。

Motion Blur

モーションブラーのことです。ダイナミックな絵を作ることが出来、これを入れると一気にレンダリング結果が良くなります。実装も、ただ絵を出すだけなら簡単です。

Post Process

あとは、その他CG分野におけるあらゆるポストプロセスを使えばどんどんリッチな絵になるでしょう。

レンダリングアルゴリズム

基本的にサーフェスレンダリングのための有名手法を挙げました。ボリュームレンダリングはまた今度。

パストレーシング

具体的なレンダリングアルゴリズムの一つです。レンダリング方程式に対して直接的にモンテカルロ積分を適用することで導出されます。映画業界では広く使われており、ArnoldやCorona Rendererはこのアルゴリズムを使っています。

パストレーシングはカメラ側からレイを飛ばし、各点での反射方向をサンプリングしていくことでカメラから光源までのパスをサンプリングします。また、各点からExplicitに光源をサンプリングすることで効率的にノイズを減らす、といった拡張が一般に知られています。

ライトトレーシング

ライトトレーシングでは光源側からレイを飛ばしてカメラまでのパスをサンプリングします。

双方向パストレーシング

カメラ側と光源側の両方からレイを飛ばし、その結果を組み合わせることで単一のアルゴリズムではサンプリングしにくいパスも効率的にサンプリングする、というアルゴリズムです。組み合わせる際にMultple Importance Samplingを使います。

Metropolis Light Transport

Metrpolis-Hastings法という、任意の関数を確率密度関数としてサンプルを生成する手法があります。これを応用したレンダリングアルゴリズムです。Markov Chaing Monte Carloという領域に属する手法で、あるサンプルを元に次々にサンプルを生成することで任意関数に対する効率的なサンプリングを実現します。

フォトンマッピング

光源から発射したフォトンをシーン内に保存、カメラ側からレイを飛ばしてフォトン収集してレンダリング、という2パスのアルゴリズムです。ピクセル間でフォトン情報を共有することでノイズが目立たない画像を比較的容易に得ることができます。

また、スペキュラが関係するシーンに強いのも特徴で、SDS("スペキュラ"ー"ディフューズ"-"スペキュラ")と呼ばれるパスも効率的に扱うことが出来ます。

プログレッシブフォトンマッピング

従来のフォトンマッピングフォトンを保存しておくためのメモリがしばしば大きくなるという問題がありました。そこで、逐次的にフォトンマッピングを行い結果を改善することで固定のメモリ量で大量のフォトンレンダリングに使用することができるようになりました。それがこのプログレッシブフォトンマッピングです。東大の蜂須賀先生が開発しました。

ラジオシティ

レンダリング対象のシーンをパッチに分割し、パッチ間の光輸送をフォームファクタマトリックスとして計算、さらに光源を与えることで各パッチにおけるラジオシティを求める方法です。一度ラジオシティを計算してしまえば、カメラ位置が変わっても高速に結果を変更できるため建築分野では昔からよく使われているようです。

ただし、アルゴリズムの性質上Diffuse(Lambertian BRDF)なパッチ以外を扱うのが大変という欠点もあります。

インスタントラジオシティ

フォトンマッピングに近い方法です。光源からフォトンを発射し、シーンに保存します。このフォトンをVirtual Point Lightという点光源とみなし、レンダリング時にはこの点光源からの影響を求めます。Reflective Shadow Mapsのようなリアルタイム手法への拡張も盛んです。この手法は大量の点光源からの影響を効率的に計算する必要がありり、そのための手法がライトカットです。これは、VPLを木構造にして一定数のVPLからの影響をまとめて計算することで計算の効率化を図るものです。

Energy Redistribution Path Tracing

基本的にはMetropolis Light Transportなのですが、この手法は短めのMCMCチェインを大量に発生させることでパストレーシングっぽい要素もとりいれています。

Population Monte Carlo Rendering

Population Monte Carloと呼ばれるモンテカルロ積分のための方法をレンダリングに応用したものです。

 Vertex Connection and Merging (Unified Pathspace Sampling)

最近はやりの手法です。これは、双方向パストレーシングによってサンプリングされたパスとフォトンマッピングによってサンプリングされたパスを統合してレンダリングするという手法です。これらのパスは、物理的に同じ(とみなしていい)パスでも数学的には別の測度による確率密度関数からサンプリングされるため、従来のMultiple Imporntace Samplingフレームワークを直接適用できませんでした。そこで、今回の新しい手法では頂点を増やしたりマージしたりしてMISします。

基本的に、両者のいいとこどりを出来るため効率が良いです。

アルゴリズムごとの比較

一般に、双方向パストレーシングのようなパストレーシング系の手法はBRDFに基づいた効率的なImportance Samplingを行えるため、Glossyな物体に対して効率が良いと知られています。一方、スペキュラの絡むSDSパスのような、複雑なコースティクスに対しては弱いです。

それに対し、純粋なフォトンマッピング系はコースティクスの描画には強いのですが、カメラ側のレイについてBRDFの知識を使えないためHighly Glossyな物体に対しては弱いといわれています。

また、Metropolis Light Transport系の、MCMCレンダリングアルゴリズムは上二つでは扱いにくい遮蔽の多い難しいシーンもかなりうまく対処できる一方、全体的に癖がありサンプルのスタックなどの問題やパラメータチューニングが直感的でないといった問題もあります。

新しく提案される手法は、大抵上記のアルゴリズムをうまく組み合わせる、といったものが多く、たとえばGlossyにも強いフォトンマッピングを作るためにカメラ側からパストレーシングして各点でフォトンを収集する、といった手法もあります。(VCMとは違う)

 

いずれにせよVCM(UPS)の登場により、双方向パストレーシングとフォトンマッピングは統一されました。また、Multiplex Metropolis Light Transportという新しい手法によってMLTと双方向パストレーシングも統合されました。今後はますますアルゴリズム同士が統合されていき、よりロバストな手法が生まれることでしょう。

まとめ♪

みんなレイトレがんばってね♪