- display

- home -> lab -> ray tracing {
 参考文献  1.最適化  2.交点  3.標本化 4.ブラー,  5.ソリッド  6.イメージ  }
   |
- 3.標本化 { イントロ, シングル, マルチ, サンプリング,  フィルタリング, }



-lab 03 : レイトレーシング プログラミング 3 サンプリング -  

 
 今回はレイトレーシングでのサンプリング、つまり”3Dのシーンをどのように2Dの画像に写し取るか”に関してです。
前回までのクラスを使って、簡単なレイトレーシングプログラムを作ります。最初は1ピクセルで1つのレイを飛ばす”シングルサンプル レイトレイサー” 、次に1ピクセルで複数にレイを飛ばす”マルチサンプル レイトレイサー”です。

 



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

 今までのクラスを使い、簡単なレイトレーシングプログラムを作ります。縦横各ピクセル数を500個(0〜499)の500×500の画像として、各ピクセルから次のようなレイを飛ばします。
r = o + td
o
= (i,j,0),
d
= (0,0,-1),
視線方向が-zなのは、右手の座標系にするためです。+zの場合左手系になってしまいます。

 次にオブジェクトを
中心点
半径
( 250, 250, -1000 )
150
3角形
頂点
( 300, 600, -800 ),
( 0, 100, -1000 ),
( 450, 20, -1000 )
としてます。オブジェクトをリストに入れ、レイに当たるようして最近傍のオブジェクトを判定します。 

  もし球に当たれば”青”、3角形に当たれば”赤”、どちらにも当たらなければ暗いグレーとします。画像は次のようになるはずです。

シングルサンプル レイトレイサーでレンダリングした画像(左下の頂点を原点としています)

 



マルチサンプリング
 

 
 さきほどのシングルサンプル レイトレイサーは処理が早くリアルタイムなソフトに向いています。しかし、画質は良くありません、これではエイリアシングと呼ばれるギザギザのエッジ(エイリアシング)ができてしまいます。

エイリアシング
1ピクセルにつき1点しかサンプリングしていないので、その点でサンプリングされたオブジェクトの色のみでピクセルが塗りつぶされてしまう。(ピクセル内の別な部分に他のオブジェクトがあったとしても)

拡大画像

理想としてはピクセルにつき1つのレイで色を決めるではなく、ピクセル領域全体の平均値を取るのが望ましいです。

 そこで次にこれを拡張して、マルチサンプル レイトレイサーを作ります。 これは1つのピクセルから複数のレイを飛ばして、その平均値をピクセルの色とするものです。ここでの複数のレイはピクセル上に均一に分布していなくてはいけません。

 ピクセル領域の平均値を求めるために、スクリーン上の2次元座標系をピクセルを中心とする整数格子状に区切って、その中で各ピクセルを通るレイの交点を点で表しました。 
ピクセル(3,1)では
( x, y ) ∈ [ 2.5, 3.5 ] × [ 0.5, 1.5 ]
となる。
これらはモンテ・カルロ積分として知られています。モンテ・カルロ積分は積分空間でランダムにサンプリングすることにより、簡単に積分の近似値を求められる方法です。
 

サンプリング





ランダム サンプリング

   
 ピクセル領域から、均一にサンプルを選ぶ方法はいくつかあります。 最初にとても簡単な方法は単純にピクセル領域からランダムに点を選ぶ方法です。 しかしこのランダムサンプリングではサンプリングに偏りが出てしまう恐れがあります。そしてそれを防ぐためにサンプリング数を増やすと、今度は処理が遅くなります。



レギュラー サンプリング

   
 レギュラーサンプリングはその偏りを避ける簡単な方法の一つです。これはピクセルを均一なグリッドで区切り、その交点でサンプリングする方法です。
しかしこのサンプリングではまた別の問題が発生します。
エイリアシングはピクセル間のサンプリングの相互作用によって生じます。レギュラーサンプリングではこのエイリアシングが解消されない場合があるのです。



nルーク サンプリング

 
 もっと良い分布が得られる方法の一つは、nルークサンプリングです。
これはn×nのチェス板でn個のルークを、お互いが攻撃できないように配置するのと同じような方法で点を決めます。 チェスでのルークは将棋の飛車と同じ動きをします。
nルークサンプリングのやり方としては、

まずn個の点を対角線上に配置します。
そしてそれぞれを縦に重ならないように横に平行移動していく、それだけです。

欠点としては、サンプリング点が対角線上に並んでしまう可能性があるということです。


ジッタード サンプリング

 
 サンプリングで一般的な方法として、”ジッタード” 又は層化サンプリング
 層化サンプリングは、ピクセル領域をさらに単位正方形で分けていき、そのそれぞれの背方形でランダムに点を決める方法です。

 例外としてはサンプリング領域の次元が高い場合、この方法は有効ではなくなります。


マルチ ジッタード サンプリング
 
ジッタとnルークを合わせると、さらに良い均一な分布が得られます。


ポアソン ディスク サンプリング
 
 他にもポアソンディスクサンプリングという方法があり、
サンプル点がその他のそれぞれのサンプル点のある領域内に入らないように点を選んで生きます。 


・フィルタリング

 ピクセル領域で均一なサンプル点が得られたところで、今度はそのそれぞれの点のレイによって決まった色で、ピクセルの色を決定しなくてはいけません。

 単純にそれぞれの色の平均値を取る方法を”ボックスフィルタリング”といいます。
ボックスフィルタリング(重なり合いなし)
 
 ここではエイリアシングが現れる3Dの画像をわざわざ作る代わりに、次の関数を使った2Dの画像を使います。
 
L( x, y ) = 1/2( 1 + sin((x^2+y^2)/100) )
 
  この関数を使って作った画像はシングルサンプリングでは次のようになります。 (原点は左下の頂点)

 この関数は原点からの距離を使ったsin波で明るさを決めています。 しかし距離の2乗になっているので、sin波は原点から遠いほど波長がどんどん短くなります。
つまり本当はそのようなsin波の縞模様は原点からの1つだけのはずです。

しかしのこの絵は縞模様が無数に等間隔に表示されています。
これは 、シングルサンプリングは1ピクセル1サンプリングしか行わないので、本来あるべき絵が得られず、連続して見ると間違った絵になってしまうからです。

結果、干渉縞のようになってしまいます。

(サイズ2分の1)


 ボックスフィルタリングではピクセル領域のどの位置のサンプリングも同等の価値になってしまっています。しかし実際には、びくセル領域で中心に近ければ近いほど、そのピクセルにおける価値(重要度?)は高いはずです。つまり”ピクセルの中心とその外周の近くに2つの異なる色が同じ量存在していた場合、どちらの色が重要か”といった具合にです。この重要度を加味したフィルタリングに”テントフィルター”と”キュービックフィルター(cubic spline filter)” があります。
テントフィルタリング(重なり合いなし)
  
 
 このフィルタリングには2つの方法があります。1つはそれぞれのサンプリング点に重要度に従って重みをつける方法です。もう1つはサンプリング点を重要度に従い不均一にする方法です。この方法ではピクセルの中心に近ければ近いほどサンプリング点は寄り集まります。テントフィルタは各点の重みが線形に増減します。

 重要度に従ってサンプリング点を不均一にするには、ワーピング関数を使います。

重なり合いのある、ワーピング関数の例

これまでは1つのピクセル単位でサンプリングしていたが、
ここではサンプリング領域を広めて周囲のピクセルの一部もサンプリングしている。


重なり合いのある、テントフィルタリング
 
 これにより、均一な分布を不均一な分布に変えることができます。

 
- home -> lab -> ray tracing {
 参考文献  1.最適化  2.交点  3.標本化 4.ブラー,  5.ソリッド  6.イメージ  }
   |
- 3.標本化 { イントロ, シングル, マルチ, サンプリング,  フィルタリング, }