Subsurface Light Propagation Volumes

LPV技法を表面下散乱に適用したSSLPV技法についてです。

この論文について

SSLPVは、2011年のHigh Performance Graphicsで、論文として発表されています。
発表された方は、Jesper Børlum,Brian Bunch Christensen,Thomas Kim Kjeldsen,Peter Trier Mikkelsen,Karsten Østergaard Noe,Jens Rimestad,Jesper Mosegaard(敬称略)です。Alexandra Instituteというデンマークにある、公益法人と思われる組織の、CGに関するリサーチを行っている部署から発表された論文です。

Subsurface Scattering(表面下散乱)について

論文の内容に入る前に、Subsurface Scatteringについて少し触れます。Subsurface Scatteringは、物体の表面ではなく、物体の内部に入射した光が、内部で散乱反射をして、それが再び物体の外に出てくる現象を扱ったものです。この現象を強く観測できる代表的なものとして、人間の皮膚や、大理石などがあります。特に人間の皮下散乱に関しては、既にいろいろな実装がされています。GPU Gems3のChapter14に記載されている、直接光をunwrap(アジの開きのように展開)したテクスチャに書き出し、Gaussian フィルターで人間の皮膚に合わせた散乱を適用して、それを再びサンプリングする手法は、Skinシェーダーの一つの手法として広く知られています。ただし、この手法は、unwrapしたUVを作成するのが、コンテンツ製作上の問題になります。現在では、この手法をScreen Spaceのみで行うのが主流と思われます。UE3などに実装されているようです。

SSLPVの特徴

上記に挙げた既存手法は、基本的に隣接するピクセルの色に、フィルターを適用することで、表面下散乱としています。これによる制限として、薄い物体に裏面から入射し、物体内を散乱し、貫通する方向に放出される光をうまく扱えません。あくまで表面を伝達するイメージでの散乱しか扱えないのです。対してSSLPVでは、物体に入射する光と散乱を、voxelとして立体的に表現して計算します。これにより、伝達させる物体の形状に制限がありません。voxelの解像度さえ確保できれば、どんな形状でも入射した光を正しく伝達させることが可能です。

SSLPVの概要

SSLPVは大きく分けて3つのステップに分かれます。

  • RSMを用いたvoxelに対する光源のinjection
  • 物体内の散乱をシミュレートしたvoxel内のlight propergation
  • 上記結果から表面からの放射を算出

Injection

voxelに入射する光はRSM(Reflective Shadow map)技法を用います。光源方向からShadowmapの様に、物体表面の座標と法線、それから物体内部に入射する光束をレンダリングします(なので実際は “Reflective” ではありません)。RSMから入射する光束を計算するときは、光源の強度と、RSMのテクスチャの各ピクセルが保持している、ライトに対する立体角を正しく計算する必要があります(paperのp3に記載されている、この式は他のレンダリング技法でも使える有用な式だと思います)。次に照射光が、屈折して入射する方向と、入射する量を計算します。入射する方向は、スネルの法則から求めます。屈折して入射する光の量はフレネルの法則から求めますが、これをBTDF(bidirectional transmission distribution function)(BRDFの入射版)で表します。これを対応する位置にあるvoxelにvirtual point lightとして加算していきます。実際にはvoxel内での表現はSpherical Harmonicsによって表現されるため、BTDFをSHの係数に落とし込んで、voxel内の格納場所に加算します。

Propagation

propagationの処理は、LPV[Kaplanyan and Dachsbacher, 2010]と同様に行います。propagation用のvoxelとaccumulation用のvoxelを用意して、隣接voxelへの伝播処理と吸収,拡散処理(後述)を行いつつ、accumulation用のvoxelに加算していきます。伝播処理は隣接する6面のvoxelに対して行われます。
オリジナルのLPVと異なるのは、この手法は媒質の中を伝播するということです。この伝播にはRTE(radiative transport equation)と言う式が使われるのですが、これをそのまま今回のvoxel表現には適用できません。voxelの伝播時にこれに変わる処理を行います。

Absorption

媒質内の吸収はBeer’s lawに基づいて計算されます。これは、吸収係数と媒質の厚さ(距離)の指数関数で表現されます、RGBの各吸収係数が媒質の位置によって異なるならば、これを対応するvoexlに格納しておきます。

Scattering

scatteringは処理ステップごとに一定の割合で、隣接するvoxelから、散乱位相関数に基づき、自身のvoxel伝播される光束を積分します。実際にはこの積分を厳密に行うわけではなく、散乱位相関数もSHで表現します。散乱位相関数はHenyey‐Greenstein[Henyey and Greenstein 1941]による近似を利用します。結果的には、propergation処理の前に、SHの各coefficientを散乱位相関数とscattering係数による重み付けをする乗算します。

Rendering

レンダリング時には、媒質の中を伝播した光束から、表面から放射されるradianceを計算します。ここで再びフレネルの式とスネルの法則を適用しますが、直接これらを適用することは出来ません。voxel内では、virtual point lightとして光束が表現されているからです。このvirtual point lightをそのまま点光源として使用すると、さまざまな問題を引き起こします。そのため、このvirtual point lightを、モデルの面に平行な、voxel gridを覆う面からのradiacneに換算します。換算は、SHの係数を平面上で半球に積分します。積分にはSHの係数を用いますが、任意ベクトルを中心とした積分範囲のSH係数の算出には、world空間でz軸が積分範囲の中心だった場合におけるSH係数を、rotationすることで求めます(Spherical Harmonic Lighting: The Gritty Details.[Green 2003])。

考察

この論文は、LPVを知っている人ならば、論文の表題を見ただけで、おおよその見当はついてしまうと思います。ただ、LPV技法そのままで、RSMを反転させただけでは、この品質が出るわけではなく、そこにはちゃんと工夫があったと思います。また、広い空間を扱うわけではないので、非常に現実味のある(実装のチャンスのある)ものだと思います。

6項のDiscussionの表を見る限り、やはり対象とするジオメトリのポリゴン数が多いと、RSMの構築に時間がかかるようです。Injectionのステップはほぼ一定で、問題になるほど時間はかからないようですが、propagationのステップはfig1のサンプルのみなぜか大きく異なります。voxelの解像度が同じ場合ならば、必要な計算量は同じはずですが、空のvoxelをスキップする処理が行われていたら違いが出るかもしれません。propagationの回数によって変化する処理時間はほぼ線形です。シェーディングもポリゴン数の多いfig1が重いようですが、これは通常のレンダリング処理が含まれていると思われるので、voxelからradianceの計算にかかった時間として評価することは出来ないと思います。

レンダリング結果を見ていると、わずか32^3のvoxelで計算されたとは思えないほど破綻の少ないレンダリングになっていると思います。また、サンプルのシーンが、200fps以上で描画できることから、実際のシーンの一部に、この処理を組み込むことも可能かと思われます。必要なvoxel解像度も、対象とするオブジェクトが内包できれば良いわけですから、空間全体に適用するLPVに比べたらはるかにマネージメントしやすいと思います。
ただし、この技法は人間の肌のように、媒質による吸収が強く、貫通も限定的なケースでは、トータルで考えると、既存技法である、Screen space subsurface scatteringのほうが適していると思います。SSLPVで人間の肌による表面下散乱を計算するためには、voxelの密度を高くしないと困難だと思われます。

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中