vgnz93hs
vgnz93hs

RC Tracing - レンダリングの仕組み

RC Tracingのレンダリングの仕組みの解説。
私も光の振る舞いやレンダリングについて完全に理解している訳ではないため、この記事は間違えを含んでいる場合があります。また、ここでのレイトレーシングは私が以前にScratchで作ったものです。
この記事は抽象的な表現を多く含みます。
RC Tracingは光を現実と同じようにライトからレンダリングして画像を生成しています。

特徴

RC Tracingは光源からレンダリングするため、ほとんどのシーンでレイトレーシングよりも処理が重くなります。
しかしながら、現実とより似ている方法でレンダリングを行うため、特に以下のような場面でレイトレーシングよりもリアルにレンダリングできます。

レイトレーシングよりもリアルにレンダリングできることが多い

レイトレーシングに明るさの表現が実用的な理由

レイトレーシングでは、ピクセルの明るさはその物体の光の強度のみで決まります。そのため、カメラと物体の距離を変えてもピクセルの明るさは変わりません。
現実では、カメラと物体の距離をx倍すると象の光の密度は、その光の広がりの一辺の長さが1/x倍となるため、面積は1/(x^2)倍となり、密度はx^2となります。
よって距離が$x$倍になると密度はx^2倍となり、明るくなるように思えますが、物体から放出される光がカメラに入る確率も下がります。
距離をx倍にしたとき、一定の角度がなす面の面積はx^2となります。その中の光の数は論理上は変化しないので、光がカメラに入る確率は距離がx倍になると明るさは1/(x^2)倍となり、先ほどの光が密集することによる変化と掛けると(x^2)(1/x^2)=1となり、明るさが距離に依存しないことが分かります。

レイトレーシングで表現しにくい場面

このように、ほとんどの場合ではレイトレーシングの、物体の明るさをそのまま表現する方法でリアルに表現できますが、例えばレンズで光が屈折しているときなどは同じようにはなりません。
例えば、カメラで見る像の大きさを変えずにレンズで光を集める例です。この例では、よりレンズが光をキャッチすることができますが、象のサイズは変わらないため光の密集による明るさの変化はありません。つまり、各ピクセルはより明るくなります。
しかし、レイトレーシングではピクセルの明るさは物体の明るさに依存するため、光の密集などの要素による影響はほとんどなく、明るさは変化しません。
このように、主に物体の距離を変えてもピクセルの明るさは変わらないことが成立しない場面などにおいて、レイトレーシングはリアルな光を表現することが難しいです。
このような場面で、RC Tracingはレイトレーシングなどのレンダリングエンジンよりもリアルにレンダリングすることができます。

一部のシーンはより速くレンダリングできる

点光源

また、レイトレーシングはカメラから光を測定して行って、最終的に光源に当たると初めて色情報が取得できます。そのため、レイトレーシングでは点光源寄りのシーンはうまくレンダリングすることができません。例えば、プロジェクターがあるようなシーンです。

光の振る舞いをキャッシュ

これはまだRC Tracingには実装していませんが、将来的に予定している機能です。光がオブジェクトに当たったときに、そこまでの光の位置や回転を記録して、キャッシュする方法です。この方法を使うことで例えば艶消しのオブジェクトがあるシーンなどはより効率よくレンダリングできます。
また、シーンに変化がなく、カメラのみが動くアニメーションをレンダリングしたとき、光源からレンダリングすることで光全体をキャッシュでき、レンダリング時間を短縮できます。

被写界深度を再現できる

先ほどのように、光源からシミュレーションするという仕組みの都合上、絞りを作ってレンダリングを行う必要があります。絞りを作るに従って、ピントが合ってないところがぼやける被写界深度を再現することができます。

数値を現実と統一しやすい

レンダリング方法が現実と似ているため、シミュレーションなどの明るさや感度を数値で定めるときに便利です。例えば、レイトレーシングではカメラの絞りの大きさを変化させてもノイズの多さに変化は特にないものの、RC Tracingはカメラと同じように絞りによってノイズが大きく変化します。

仕組み

次に、RC Tracingの仕組みを解説します。

光源から光を出す

光源から光を出すときは、確率によってどの光源から光を出すか、どの位置からどの角度で光を出すかを決める必要があります。確率は各光源の明るさの値の比によって決めます。
位置については、光源の表面からランダムな点を一つ選びますが、角度については角度x, yをランダムに指定する方法だと、指定した角度が上方向とした方向に偏ってしまいます。これを防ぐためにRC Tracing 1.2から、光を立方体の中のランダムな位置に設定し、立方体の中心からの距離が一定以上の場合はもう一度座標を生成しなおします。こうすることで球体の中のランダムな座標を作ることができ、その球体の中心から生成した位置への角度を求めることで、ランダムな角度を求められます。

光を進める

先ほどの角度を元に、光を進めます。RC Tracingでは先ほどの座標から角度を求める際に、角度x, yへの変換は行わずx, y, z座標の割合として角度を保存しました。このままだと中心からの距離が変わってしまうため、x, zを使って中心からの上から見た距離を求め、その距離とyを使って距離を求めてそれで割ることで全体としての距離を統一しました。
光を進めるときは、現在の光の位置x, y, zにこの値を足すことで進めることができます。

カメラ

RC Tracingは光源からレンダリングするという性質上、処理した光がカメラに当たる範囲を指定する必要があります。現実世界でのその「範囲」はカメラの絞りです。
RC Tracingでは、カメラの位置に正方形の面を配置し、ここに当たった光が正方形の中心からの距離が一定の距離の範囲にあるかを判断することで、真円の絞りを作ることができます。
後は当たった光の角度と位置を利用して、センサーに当たるまでを計算することで画像上のピクセルを求めることができます。
あとは、その光の情報をピクセルに追加して画像を生成します。