CG の反射モデル メモ

BSSRDF

今のゲームグラフィックが、ゲームグラフィックっぽく感じるのは様々な要因があるが、その中の一つに Microfacet BRDF の存在がありそう。金属以外の全ての物体は僅かながら内部散乱を起こすが、今は無視している。軽量な Microfacet BSSRDF に発展させないと、品質は上がらない。でも、普通のラステライザではたぶんムリ。

SSS

V-Ray などの SSS マテリアルには diffuse color が設定できるが、通常は使わない? 肌の上では Specular か、Sub-Surface color (Scatter color) が見えてくる。顔の上にシールを貼っていたり、ペイントとかしてたら diffuse color っぽい。

IOR

屈折率のことを IOR (Index of Refraction) と呼ぶ。レンダラーによっては、IOR の値を設定して反射を制御する。IOR のパラメータは自動的に Fresnel に変換されて(連動して)、反射として使われる。

水は ior 1.333。下記の式に入れると、0.02 という値が出る。
f0 = ((ior-1)^2)/((ior+1)^2)
これは F0 だと 2%の反射率ということになる。

真空中の光速度 c を媒質中の速度 v で割った値で定義される。n = c / v。水の中などでは光の進む速度は遅くなるため屈折する。 真空中の光の速度を超える速度は出すことはできないため、IOR の値は 1 を下回らない。代表的な数値は、空気:1.0003 。ガラス:1.5。ダイアモンド:2.419など。値が大きい媒質中ほど、光の進み具合は遅くなっている。

IOR の値が分かれば、Snell’s law を使って、屈折の角度も計算することが出来る。コンピュータグラフィイクスで屈折表現する時は、Shell’s law から屈折方向を導く。

IOR の値が分かれば、F0 反射率も計算できる。
f0 = ((ior-1)^2)/((ior+1)^2)

逆に F0 の値を知っていれば、この式で IOR が分かる。
ior = 2/(1-sqrt(f0))-1

Microfacet BRDF

F * G * D
Fresnel * Geometry Function * Normal Distribution Function
(F * G * N ではないのは、N 法線と勘違いされるためだろう)

Fresnel

媒質が異なる(空気->金属, 空気->絶縁体, 空気->水) などに光がぶつかった時に、光の方向と表面の法線に依存して、一部は反射し一部は屈折する。このふるまいが Fresnel。という説明を良く見かけるが、分かったようでいて分かっていなかった Fresnel。

つまり、入射した光の何%が反射するかを考えるもの。屈折は物体内部に入り込む光だが、ラスタライザだと表現することは厳しいので通常モデルだと無視して反射だけを考える。法線に光が垂直に入射した場合 F0 として定義され、F90では反射率1(100%)になる。媒質によもよるが、光と法線の角度が0度から45度では F0 の値に近く、75度を超えたあたりから、急速に反射率1に近づく。そのためエッジ部分がが明るく感じられる。

Gold だと F0 の値は RGB (255, 229, 158) で入力される。ただ、画面上で見たときは “金っぽい色” で表示されるが、画面で見たときの色という視点では見ずに、これは F0 時点で既に R:255, G:229, B:158 の反射率を持っているということを示している。(R:255なので F0 時点で既にRは100%反射するということ)

Normal Distribution Function (NDF)

日本語だと正規分布関数。あるサーフェス点における、ある方向を向く Microfacet がどれくらい集中しているか。NDF はハイライトのサイズと形状を決定する。

Geometry Term

Geometry または、shadowing-masking function と呼ばれる。光と視線の方向から、照らされて見える(影やマスクになっていない)部分を決める。Light と View と Half Vector を変数とする関数。

コメントを残す

メールアドレスが公開されることはありません。