穴日記

どうだ明るくなったろう

Line Space Gathering for Single Scattering in Large Scenesを読んでちょっと実装しました

さて、私は今学部でいろいろな研究室を回り、論文を読んでは実装するという課題を行っているのですが、初回の課題はSIGGRAPH2010の論文、Line Space Gathering for Single Scattering in Large Scenesを読みました。

この論文はレンダラ系論文で、何らかの媒質中(たとえば埃とか、微小の粒子に満ちた大気とか)を通る光の散乱の高速な計算手法の提案となっています。
ただし、論文手法で扱えるのはまだ、均質な媒質中における単一散乱に留まっています。
従来手法で有名なものとしては、間接照明を高精度、高効率に計算するPhoton Mapping法の拡張、Volumetric Photon Mappingなどがあるそうです。

論文手法の面白いところは、線分同士の近傍探索を高次元空間に変換して候補の限定を高速に行っているところでした。

以下、具体的な手法について簡単にまとめ。

  1. 設定した光源から光線発射
    • まず、光源から光線発射します。このへんは普通のレイトレとかと同じで、別の媒質とぶつかったら適当に反射したり屈折したりします。このとき、たとえば、光源→物体A→無限のかなた、みたいに光線が通った場合、光源→物体Aの光線と、物体A→無限のかなた、みたいにして線分(半直線)の形でどこかに情報を記憶しておきます。
  2. 線分をPlücker coordinatesによって六次元空間内の点に変換
    • Plücker coordinatesという概念があります。これを用いると、ある線分と線分の距離の下界を、六次元空間における平面と点の距離として求めることができます。
    • 散乱光の計算をするとき、視線から発射した視線分の近くを通る、光線から発射した光線分の集合を求めることで実現されます。通常、ある点の近くの点を求める手法としては、空間を分割することによるデータ構造(kd-treeやBSPtreeなど)が用いられます。しかし、線分間の近傍探索となると、線分が空間の大部分にまたがるため、うまく空間分割されたデータ構造が作れません。
    • そこで、六次元空間内の点や平面に変換することで、うまく空間分割されたデータ構造を作る、というのがこの論文のキモになっています。
  3. 設定した視線から視線分発射
    • 上と同様に、レイトレの要領で視線から視線分を発射し、画像の一ピクセル一ピクセルの色を決定していきます。
    • この際、散乱光の計算として、視線分の近くを通る光線分を求めるわけですが、上述したように、視線分をPlücker coordinatesを用いて六次元空間内の超平面に変換し、同じく六次元空間内の点に変換された光線分との距離を計算し、視線分の近くを通る光線分を高速に特定します。

この手法の優れた点としては、Photonを飛ばして保存するのに比べ、Line Segmentを飛ばして保存するため、メモリ効率が良く、GPU化が容易になった、という点らしいです。

今回私は、論文手法をおおむね実装しました。ただし、GPU化とより効率的に空間分割されたデータ構造の生成は行っていません。以下、適当にレンダリングした結果。