Normal Distribution function

マクロな視点での”ざらざら”

Lambertの拡散反射モデルは、電磁波レベルでは、これ以上に無い”ざらざら”なモデルなのですが、描画しようとする物体の表面が持つ、(光の波長に対して)マクロな視点での”ざらざら”については一切言及していません。
しかし、現実に我々の周りにありふれているものの多くは、表面に細かい凹凸を持っており、これがシェーディングに大きな影響を与えるようです。

”ざらざら”のモデル化

対象物の幾何的な”ざらざら”を考慮してシェーディングする場合、もっとも単純かつ理想的と考えられるのが、シェーディングしようとしている微小平面(1ピクセル分の平面)を、もっと小さな微小平面(micro-facet)に分割し、その幾何的状態を定義した上で、シェーディングする方法です。これをmicrofacetモデルと呼びます。このモデルでシェーディングするためには、対象物のマクロな幾何形状(ポリゴンやNormalMapなど)に加え、微小平面の幾何的状態について定義する必要があります。

Normal Distribution function

では、一体どの方向に向いたmicro-facet(以下単にfacet)が、どの程度存在するのかを関数で表すこととします。
この関数を、Normal Distribution function(以下NDF)と呼びます。この関数は、facetの面法線のベクトル(m)の関数として表現できます。
NDF_01
これに、ベクトルm周りの微小立体角(dωm)を乗算すると、全半球内で、立体角dωmに収まる方向に向いている、facetの割合になります。
NDF_02
これに、マクロな平面における微小平面の面積(dA)を乗算すると、dA面の中で、立体角dwmに収まる方向に向いている、facetの面積になります。
NDF_03
微小平面dA内にある、facetの総面積は、少なくとも、dA以上となります。従って、上式を積分すると、1以上の値となるはずです。
NDF_04

ここで、視線ベクトル(V)を導入します。マクロな平面における微小平面の法線を(N)とすると、
NDF_05
は、dAをVから見た場合の、見かけ上の面積になります。

一方、dA内のfacetをVから見た場合の、見かけ上の面積は、
NDF_19
となります。

上記の二つは、どちらもマクロな視点では、同じ面をあらわすので、等しくなります。
さらに、視線ベクトルVが、微小平面の法線Nと重なる場合を考えると、
NDF_20
となります。

NDFは基本的に正の値ならば、どのような分布になっても問題ないですが、直上から見た場合の、見かけ上の面積で積分したときに、1になる必要があります。

Phong NDF

facetの分布に異方性が無い場合は、NDFは、微小平面の法線Nと、facetの法線の成す角度(θ)の関数で表すことも出来ます。
ここで、
NDF_08
という分布関数を考えて見ます。facetの法線がNから乖離するに従って0に近づく関数です。
C1、C2は定数です。先の(N.m)に相当する部分は、法線との成す角を使ってあらわすと、cosθとなり、
NDF_09
となります。

この式は、以前の記事で、Phongモデルの正規化を行った際の式と同じです。
計算すると、C1は(C2+2)/2PIとなります。C2はそのまま、SpecularExponentに相当する項となります。
NDF_10

この式は、Phong NDFモデルとして、反射モデルを扱う論文でたびたび出てきます。

完全ランダムなNDFを考えてみる

ここで、facetの法線が、完全に一様に分布している場合を考えてみます。
NDF_11

どのようなベクトルも等しく発生する可能性のあるモデルです。(このモデルは実際に使用するものではありません。単なる余談です。)当然この分布には、異方性はないので、微小平面の法線Nとの成す角θでも表現できると思います。半球上で、微小平面の法線Nの成す角がθの領域を、法線N周りに積分すればいいはずです。
NDF_12

これをNDFとして正規化すると、
NDF_13
となります。

D(θ)の分布は、当然サインカーブに則ったものとなるので、マクロな法線N周りでは、0に近い値となります。
なんとも違和感があるような気もしますが、θ=0とするには、facetの法線ベクトルmがNに完全に一致する必要があるのに対して、その他の値では、N.mの値が一致すれば良いだけなので、ベクトルmの各要素に許される組み合わせは無限大です。このことから考えると、Phong NDFは一見すると、非常に合理的に見えるのですが、実はそうでもないかもしれません。これは、microfacetのモデルをどのように定義するかによって、変わることだと思いますが、現実に則したモデルの場合でも、θ=0周りの分布が低くなるNDFも十分考えられるということだと思います。

Torrance-Sparrow NDF

Torrance-Sparrowの論文では、NDFの関数として、ガウス関数が使用されています。
NDF_14
b, c, は定数で、cを逆数にとれば、ガウス関数となります。
NDF_15
論文中では、C1の値については余り触れられていません。
これは、NDFを正規化をするために必要な項なのですが、この式は積分が困難なようで、簡単に正規化することが出来ないようです。C2は、関数の分散を決める値で、これが平面の”ざらざら”(以下roughness)を決める値として使われます。この関数の分布は、roughnessの値が小さいときは、Phong NDFの曲線によく似た形状をしています。roughnessが大きな値になると、PhongのNDFは、θ=PI/2で0に収束するのに対して、この関数は収束しません。違いといえばそれぐらいで、Phong NDFと同じく、θ=0付近が常に一番大きな値になる分布で、両者は似ています。

Beckmann NDF

Beckmann NDFは、もちろんBeckmann氏が作ったものと思われるのですが、ある本の中に記されたもので、未だ読んだことがありません。
そのため、導出の詳しい経緯は知らないのですが、Cook-Torranceの論文をはじめ、さまざまな論文で広く使われています。
NDF_16
この関数は、半球で積分すると、丁度πになるそうです。したがって、正規化すると、
NDF_17
になります。
このNDFの興味深いところは、roughnessを制御するパラメーターを大きくしていくと、分布の最大値が、θ=0ではなくなっていくところです。また、ガウス関数と異なり、θ=PI/2で0に収束します。
以下にグラフを示します。
beckmannNDF

ちなみに、Phong NDFとBeckman NDFの定数項を換算することも可能で、
NDF_18
とすると、θ=0で、両者の値が一致するようです。(もちろんそれ以外の値は一致しません。各々のNDFのプロファイルになります)

”ざらざら”のモデル化は続く

今回は、NDFについて勉強してみました。ただし、NDFのモデルは、ここに上げたもの以外にもいろいろあるので、まだまだ勉強が必要なようです。また、”ざらざら”の面を考慮するにあたり、もうひとつ重要な要素があります。それは、facetの面同士が、光や視線を遮蔽すことです。こちらは幾何減衰項と呼ばれるものになります。次の機会では、そのあたりを勉強したいと思います。

参照

Microfacet Models for Refraction through Rough Surfaces[EGSR 2007, Walter, et al.]
Mathematica Notebook for “Background: Physics and Math of Shading”[Siggraph 2012]
Beyond a Simple Physically Based Blinn-Phong Model in Real-Time[Siggraph 2012, Yoshiharu Gotanda]
Theory for Off-Specular Reflection From Roughened Surface [Torrance, Sparrow, 1966]
MODELS OF LIGHT REFLECTION FOR COMPUTER SYNTHESIZED PICTURES[Blinn, 1977]
A REFLECTANCE MODEL FOR COMPUTER GRAPHICS[Cook, Torrance, 1981]

コメントを残す

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

WordPress.com ロゴ

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

Twitter 画像

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

Facebook の写真

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

Google+ フォト

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

%s と連携中