第4話 マイクロポイント

ここまでくればマイクロポイントの実装を推察するのは容易だろう。論文発表時点のピクセルレス・サンプリングは、レイトレーシング型 − 各ピクセルに対してレイを飛ばす(視点座標系) − のに対し、マイクロポイントでは、スキャンライン型 − オブジェクトのスクリーン座標系への投影 − に対して、ピクセルレス・サンプリングの思想が貫かれる。

実装レベルでは、マイクロポリゴンにおける、マイクログリッド→マイクロポリゴン変換をマイクログリッド→マイクロポイント変換に置き換える作業にすぎない。

勿論、オブジェクト→マイクログリッド変換プロセスを省略して、オブジェクト→マイクロポイント変換を実装しても構わない。

 

 現在のマイクロポリゴンの構造体は以下の定義になっている。

        public  struct  MicroPoint

        {

                public  object  next ;

                public  CRenderShader   primitive ;

                public  double  distance_near ;

                public  float   delta_far ;

                public  byte    sampleP ;

                public  byte    sampleN ;

                public  byte    sampleUV ;

                public  byte    alpha ;

        }

rimitiveは、レイトバインディングされたオブジェクトのクラスで、交差判定法線マッピング座標計算など、オブジェクト固有の関数メッソドを持っている。

distance_nearは、視点からオブジェクトまでの最短距離(Z値)、delta_farは、視点からオブジェクトへの最長距離−最短距離の値で距離分散

alphaは、既に説明したようにピクセルサイズに正規化した際の透明度

ampleP,sampleN,sampleUVは、オブジェクトの位置、法線、マッピング座標の分散カウンタを表す。

 

位置、法線、マッピング座標に関しても、距離同様、分散の値を直接持つ実装も検討に値するが、現在の実装では、カウンタだけを持っている。

 

 

 図は、正規化され同次座標変換されたオブジェクトとマイクロポイントの関係を表している。

正規化の結果、マイクロポイントで意味を成すのは、距離情報だけになる。

これは、視線ベクトル上に並んだ線分列として理解することができる。レンダリング・アルゴリズムを多少でも勉強した人であれば、このアルゴリズムが、視線ベクトル上に並ぶサンプル・スパン − ワトキンス・アルゴリズム ―に還元されることに築くはずである。

また、このアルゴリズムを空間分割の視点で議論すると、レイクラシフィケーション(x、y、z、u,v)に類似していることが分かる。xyzを除いた、純粋な意味でのレイクラシフィケーション(u,v)アルゴリズともいえる。

1次レイの議論がサンプル・スパンの評価に還元されるのと同様に、2次レイ以降は、直方体との交差判定に還元される。ここで重要なのは、同次座標系においては、全てのオブジェクトが、たった3方向の法線ベクトルによって定義されることである。とどのつまり、究極のslabアルゴリズムということになる。実際には、視野外の領域も空間分割する必要があるので、ここまで単純ではないが、従来のアルゴリズムと比較して、いかにこの方法が単純かは理解できるであろう。