TOP > PROGRAM

Realistic Ray Tracing 勉強メモ(2)

1 はじめに

 前回は2章を読みました。今回は3章の”A Simple Ray Tracer”を読んでまとめてみます。

2 シンプルなレイトレーサー

2.1 シングルサンプルのレイトレーサー

 正射影カメラを用いて,球と三角形を使用した単純な画像を生成します。サイズは500×500ピクセルで\((i, j)\)で番号付けし,\((0, 0)\)から\((499, 499)\)が有効範囲になります。
 各ピクセルに対してレイを生成します。レイは\({\mathbf r} = {\mathbf o} + t {\mathbf d}\)なので,

\begin{eqnarray} {\mathbf o} &=& (i, j, 0) \\ {\mathbf d} &=& (0, 0, -1) \end{eqnarray}

として生成する。\({\mathbf d}\)が負のz方向になっているのは左手座標系を避けるため(つまり,右手座標系を使いたいから)と記載があります。
 オブジェクトのデータは次の通り

* 球  
    位置:(250, 250, -1000)
    半径:150
* 三角形
    (300, 600, -800), 
    (0,   100, -100),
    (450,  20, 1000)

 球に当たったら,ピクセルを青く塗る。三角形に当たったらピクセルを赤く塗る。どちらにも当たらなかったらダークグレイで塗る。この条件で,実行すると次の画像のようになります。

実行結果
図 1: 実行結果

2.2 マルチサンプリング

 シングルサンプルのレイトレーサーが出来ましたが,ジャギーが発生します。ピクセルごとに複数のサンプルをとり,それらを平均したカラーを返すことによってエイリアシングを減らすことができます。

2.2.1 サンプリング手法

 ピクセル内の平均カラーの推定を実際に計算するためには,ピクセル上の”uniform”な点をもってくるためのアルゴリズムが必要になります。典型的なアルゴリズムは\((x, y) \in [0, 1] \times [0, 1]\)のサンプルをもってきて,\((i -0.5, j -0.5)\)にランダムなオフセット\((x, y)\)を加算するというものです。ランダムサンプリングが持つ問題は,不運な場合に,与えられたサンプルの集合が単位四方内を一緒にまとめられてしまう可能性があるということです。全体を推定するために小さな領域内のサンプルを多く使用するため,ピクセルの平均カラーの推定が不正確になる可能性があります。    むしろ単位四方についてより均一に分布するサンプルを持ちたいです。本での手法はクランピングを避けるために単位四方内の均一グリッドの頂点としてサンプルを選択すると書いてあります。画像全体についてサンプルパターンを1度生成すればいいので,結果として計算を減らすことができるという追加のメリットがあるそうです。もちろん欠点もあります。サンプル間のサンプルの相関の結果としてエイリアシングが発生します。レギュラーサンプリングとランダムサンプリングの方向の良い点を持つことを試みるサンプリングスキームが数多く存在します。本では,jittered sampling, multi-jittered sampling, Poisson-disk samplingなどを紹介しています。

2.3 フィルタリング手法

 ボックスフィルタリングとして知られるピクセル領域についてに均一にカラーを平均化することによって画像品質を向上できます。ボックスフィルタはピクセルの中心をポイントサンプリングするよりもより良い画像を生み出すことが可能です。次のサンプリング関数によりデモンストレーションした結果が本に掲載されていますが,白黒印刷のせいで全くよくわかりません。

\begin{eqnarray} L(x, y) = \frac{1}{2} \left( 1 + \sin \left( \frac{x^2 + y^2}{100} \right) \right) \end{eqnarray}   フィルタの適用法は次のように,\([0, 1]\)を\([-1, 1]\)に変換するような関数\(f\)をかますことによって均一サンプルを歪める操作を行います。

\begin{eqnarray} x = f(x) \\ y = f(y) \end{eqnarray}

3 おわりに

 実装コードを,Githubにまとめておきました。
 今回はサンプリングについて理解を深めました。このあたり,自分ではあんまり試したことなったのですが,ある程度どういう効果が得られるか分かったので,今後のレイトレーサー開発で効果的で使えそうなものは積極的に使おうと思います。