基礎からはじめる物理ベースレンダリング

  • 16
    いいね
  • 0
    コメント

はじめに

物理ベースレンダリングを勉強しようと資料を探してみると,いきなりレンダリング方程式や BRDF の解説があったり,金属か非金属か,表面は荒いかどうかといった材質の話だったりといった印象でした.極端な話,鏡面反射にクック・トランスの反射モデルを使えばいいよねという感じでした.ところが,資料を見ていくうちに,放射輝度(Radiance),放射照度(Irradiance)や,BRDF と似たような名前で BSDF, BTDF とか様々な用語が出て来るわけです.そこで,光とは何なのか,光の特性はどのようなものか,放射エネルギーに関する基本知識,光が物体表面にぶつかったときに発生する物理現象を必要なものだけ選んでまとめてみました.わかりやすいように図も多く入れたつもりです.今回の目標はレンダリング方程式です.この内容は主にグラフィック関係のプログラマに向けて書いてあります.

物理ベースレンダリング

物理ベースレンダリング(Physicaly-based rendering:PBR)とは物体表面における光の反射や媒質内における散乱などの物理現象、光源からシーンを経てカメラに入射する光の伝搬などを計測して数式でモデル化したものを用いてレンダリングすることです。物理ベースレンダリングに使用されるモデルは様々で、物理現象を詳細に表現したモデルほど現実と見分けがつかないほどの映像を作成することが可能ですが、計算にとても時間がかかります。

物理ベースレンダリングで使用するモデルを理解するために、光に関する物理学の基礎を知る必要があります。

光は電磁波の一種です.電磁波は電場と磁場の変化によって作られる波のことで,光のエネルギーを放出または伝達します.この現象を放射といいます.太陽や電球などの光源から電磁波が発生し,大気中で散乱や吸収されながら直進し,物体表面にぶつかって反射が起こり,私たちの目に届きます.
散乱とは光が微小の粒子にぶつかったときに,直進する方向を変えることです.吸収とは光のエネルギーが物質との相互作用によって,他の形のエネルギー(主に熱エネルギー)に変わることです.

光は媒質によって伝播されます.媒質となる物体を媒体といいます.

光の特性

直進性

光は電磁波の一種なので、障害物がなく均一な物体の中を通る限りは直進します。光の速度は1秒間に30万kmという速さです。

反射性

光は鏡や研磨された金属の表面や白いものの表面で反射します(鏡面反射)。このとき,反射の法則により,完全に平坦な表面上においては、入ってきた光と反射する光の角度が等しくなります(完全反射)。しかし、表面に凹凸がある場合はいろんな方向に反射されます.これを乱反射といいます.

屈折性

光は通り抜ける物体によって速度が変わります。そのため、密度の違う物質の境界では光が折れ曲がって進むように見えます。これを屈折と呼びます。

吸収性

物質には特定の波長の光を吸収する性質があります。たとえば、赤いものは、白色光があたると赤以外の波長の光を吸収して赤を反射させるために人間の目には赤く見えます。また、明るい色ほど吸収せず、逆に黒はすべての光を吸収します。
光が吸収されると多くの場合、そのエネルギーは熱に変わります。変化した量に応じて光の強さは減衰し、光の色はその波長に応じて吸収された光量だけ変化しますが、光線の方向は変わりません。

光のエネルギー

太陽や照明の光が物体の表面に当たると光の特性により、反射されたり、屈折したり、吸収されたりします。光は何度も反射を繰り返して、私たちの眼に色として視覚されます。色は人間の視覚が作りだす心理的な量で、物理的な量のことではないそうです。光のもつ物理的なエネルギーは光学において放射量といいます。ここでは放射分析学の放射量について言及します。

人間の眼は光の波長に応じて感度が異なり、波長の違いは色として知覚されます。人間の眼を通した光の量を測光量といい、測光学(Photometry)の扱いになります。

物体の表面はそれ自身が発光することがあります。この場合は太陽や照明の光が当たって反射していなくても物体の表面から光が放出されます。

光線

光線がある表面に当たると以下のいずれか、もしくは両方が発生します。

  1. 光線が表面で反射し、異なる方向へ進んでいきます。これは反射の法則に従えば反射角は入射角に等しくなります
  2. 光線は表面で速度が変わり、屈折して一方の媒体からもう一方の媒体へと通り抜けます。

つまり、光線はある表面に当たると、反射する方向と屈折する方向の2つに分かれることになります。

tuto-pbr-ray.png

反射や屈折した光は、最終的にいずれかの媒体によって吸収されます。

吸収と散乱

不均質な媒体または半透明な物体を通り抜ける際に、光は吸収されたり、散乱されます。散乱は光が媒体に当たったときに、方向が変わる現象です。方向は媒体の材質に応じて変化します。また、媒体の厚さは吸収や散乱される度合いに大きく影響します。

反射光

物体表面に当たる光線は入射光(Incident light)、その当たる角度は入射角(Angle of Incidence)といいます。また,光線がある表面に当たって反射された光線は反射光(Reflected Light)、その角度は反射角(Angle of Reflection)といいます。

tuto-pbr-incident-reflected.jpg
Wes McDermott「The Comprehensive PBR Guide by Allegorithmic - vol. 1 Light and Matter : The theory of Physically-Based Rendering and Shading」©Allegorithmic

鏡面反射光

物体表面に当たって反射された光は鏡面反射光と呼びます。物体の表面は材質によって磨かれてツルツルしていたり,凸凹していてざらざらしていたりします.表面が粗く凹凸のある表面に光線がぶつかると,反射する方向も変わってきます.完全に平坦で凸凹のない表面にぶつかると,反射した光線の角度と入射角は同じになります(反射の法則).鏡面反射は光の方向が変わりますが,光の強さは変わりません.表面が粗くなればなるほど、ハイライトはより大きく、より不鮮明になります。表面がなめらかになればなるほど、ハイライトは引き締まり、鮮明になります。

tuto-pbr-reflection.jpg
Wes McDermott「The Comprehensive PBR Guide by Allegorithmic - vol. 1 Light and Matter : The theory of Physically-Based Rendering and Shading」©Allegorithmic

拡散反射光

光線はある媒体からもうひとつの媒体へと通り抜けると同時に、その物体の内部で何度も散乱されます。そして光線は、最初にそれが通過したのとおおよそ同じ場所から元の媒質に向かって屈折します。最終的に入射した光はそこからさまざまな方向に向かって出射されるようになります。これを拡散反射と呼びます。つまり、拡散反射光とは屈折した光のことになります。

tuto-pbr-diffuse-specular.jpg
Wes McDermott「The Comprehensive PBR Guide by Allegorithmic - vol. 1 Light and Matter : The theory of Physically-Based Rendering and Shading」©Allegorithmic

微小面

光線が物体表面にぶつかって反射する方向は,物体表面の凹凸に依存します.粗い物体表面を拡大して見てみると,そこには肉眼では確認できないほど小さな凹凸が見られます.物体表面が微小面(microfacet)と呼ばれる小さい面が集まっているものとして考え,微小面の傾きによって物体表面の粗さをシミュレートします.各微小面は完全鏡面反射すると想定します.微小面により光が物体表面に到達する直前や,光が物体表面で反射した直後に,反射点の近傍の物体表面によって遮られるという現象が起きます.この現象をローカルオクリュージョンといいます.ローカルオクリュージョンには,セルフシャドウイングとセルフマスキングがあります.セルフシャドウイングは光が物体表面に到達するまでの間に物体表面によって遮られる現象のことで,セルフマスキングは光が物体表面で反射された後に物体表面から遠ざかる間に遮られる現象のことです.

tuto-pbr-local-occlusion.jpg
Wes McDermott「The Comprehensive PBR Guide by Allegorithmic - vol. 1 Light and Matter : The theory of Physically-Based Rendering and Shading」©Allegorithmic

光の向きと視線の向きのちょうど中間の方向にその面法線を持つ微小面は目視できる光を反射します.しかし,ローカルオクリュージョンによって遮断される光も存在します.微小面レベルの表面の凹凸さが光の拡散の原因になります.例えば,ぼやけた反射は光線の散乱によるものです.

tuto-pbr-microfacet.jpg
Wes McDermott「The Comprehensive PBR Guide by Allegorithmic - vol. 1 Light and Matter : The theory of Physically-Based Rendering and Shading」©Allegorithmic

記号一覧

ここで利用する記号と意味の表です.

記号 説明
$x$ 位置
$x'$ 入射光の位置
$\vec{n}$ xにおける法線(常に正規化されている)
$\vec{\omega}$ 方向(表面から離れる方向)
$\vec{\omega}'$ 放射輝度(radiance)の入射方向(表面から離れる方向)
$d\vec{\omega}$ 立体角の微分
$(\theta,\phi)$ 極座標系における方向
$L$ 放射輝度
$L(x,\vec{\omega})$ 位置xにおける$\vec{\omega}$方向の放射輝度
$L(x,\vec{\omega}')$ 位置xに$\vec{\omega}$方向から入射する放射輝度
$L(x' \rightarrow x)$ 位置x'からx方向に出射される放射輝度
$L_{e}$ 放射された(emitted)放射輝度
$L_{r}$ 反射された(reflected)放射輝度
$L_{i}$ 入射する(incident)放射輝度
$\Phi$ 放射束(flux)
$E$ 放射照度(irradiance)
$f_{r}$ 双方向反射率分布関数(BRDF)
$f_{d}$ 拡散(diffuse)BRDF
$f_{s}$ 鏡面(specular)BRDF
$\rho$ 反射率(reflectance)
$\Omega$ 方向を表す半球(hemisphere)
$\eta$ 屈折率(index of refraction)

放射束

光の基本単位は光子(photon)です。放射エネルギー(radiant energy)$ Q $ は、光子の集団としてのエネルギーです。このエネルギーを単位時間あたりで表したものを放射束(Flux)といいます。$ \Phi $ で表記します。

$$
\Phi = \frac{\Delta Q}{\Delta d} = \frac{dQ}{dt}
$$

放射照度(Irradiacne)

放射照度 $ E $ は単位面積あたりの放射束のことです.ある面積 $ A $ に到達する放射束を $ \Phi $ とすると、放射照度 $ E $ は次のようになります。

$$
E = \frac{\Phi}{A}
$$

ある位置 x に入ってくる放射照度は次のようになります。

$$
E(x) = \frac{d \Phi}{dA}
$$

$dA$ は単位面積で,位置 x の法線方向に垂直な微小面の面積のことです.

tuto-pbr-irradiance.png

放射照度は入ってくる放射束のことですが、物体表面から出ていく放射束のことを放射発散度(radiant exitance)と呼び、$ M $ と記述します。また、放射発散度はラジオシティ(radiocity)$ B $ としても知られています。

放射発散度と放射照度では、あらゆる方向に放射される、もしくはあらゆる方向から到達する光になります.

立体角

立体角(solid angle)は、方向と光線の角度的な「大きさ」を表します。立体角の単位はステラジアン(sr)です.立体角は平面角を3次元に拡張したものと考えることができます.平面角 $\theta$ は,円上に張られた弧の長さ $l$ を円の半径 $r$ で割ったものです.

$$
\theta = \frac{l}{r}
$$

tuto-pbr-radian.png

これを3次元で考えると,半径 $r$ の球面上の面積 $A$ に対応する立体角 $\omega$ は $\omega = A/r^2$ です.球の面積は $4 \pi r^2$ ですから,球全体の立体角は $4 \pi$ ステラジアンになります.

tuto-pbr-solid-angle.png

この方向と大きさは、球面座標($ \theta, \phi $)を用いて表現することができます。ここで,点< $r,\theta,\phi$ >における微小表面積を考えてみます.

tuto-pbr-solid-angle-polar.png

極角 $\theta$ における円(点< $r,\theta, \phi$ >を通る x-y 平面に平行な円:図の赤い円)の半径は $r\sin\theta$ ですので,この円上の方位角方向の微小弧長 a は $r \sin \theta d\phi$ となります.そして,極角方向の微小弧長 b は $r d\theta$ となります.

tuto-pbr-solid-angle-area.png

最終的に球面上の点< $r,\theta,\phi$ >における微小表面積は次のようになります.

\begin{align}
dA &= ab \\
&= r \sin \theta d\phi \times r d \theta \\
&= r^2 \sin \theta d\theta d\phi
\end{align}

半径 $r$ の球面上の面積 $A$ に対する立体角 $\omega$ は,$\omega = A/r^2$ でしたので,微小立体角は次のようになります.

\begin{align}
d\vec{\omega} &= \frac{dA}{r^2} \\
&= \frac{r^2 \sin \theta d\theta d\phi}{r^2} \\
&= \sin \theta d \theta d \phi
\end{align}

放射強度

放射強度(radiant intensity)$ I $ は、単位立体角($ \omega $)あたりの放射束です。

$$
I(\vec{\omega}) = \frac{d \Phi}{d \vec{\omega}}
$$

放射強度は一定の方向に、どの程度の放射束が放出されているのかを表します。同じ 100W の電球でも、笠をつけて一定方向に光を集中させることによって、強い放射強度を得ることができます。

放射輝度

放射輝度(radiance)$ L $ は、単位立体角あたり、単位投影面積あたりの放射束のことです。単位投影面積 $\cos\theta dA$ とは,光が進む方向に直交する面へ単位面積を投影したもので,放射輝度はこの単位投影面積で放射強度を割った値になります.

tuto-pbr-radiance.png

$$
L(x,\vec{\omega}) = \frac{d^2 \Phi}{\cos \theta dA d \vec{\omega}}
$$

物体表面における入射してくる放射輝度がわかっていれば、半球面上のすべての方向 $\Omega$ と物体表面の領域 $A$ で積分することにより、放射束を計算することができます。

$$
\Phi = \int_{A} \int_{\Omega} L(x,\vec{\omega}')(\vec{\omega}' \cdot \vec{n}) d \vec{\omega}' dx
$$

放射照度と放射輝度の関係

ある領域 $A$ を通過する放射束 $\Phi$ があるとすると,ある領域の放射照度 $E$ は $\Phi/A$ となります.また同じ位置で,同じ放射束が通過する $\vec{\omega}$ 方向と直交する面の領域を考えると,この領域の面積 $A_{\omega}$ は $A \cos\theta$ となります.これはランバートのコサイン則として知られています.

tuto-pbr-lambert-cosine-law.png

よって,この領域における放射照度は次のようになります.

$$
E_{\vec{\omega}} = \frac{\Phi}{A_{\vec{\omega}}} = \frac{\Phi}{A \cos\theta}
$$

これに放射照度の関係を入れると次のようになります.

$$
E = E_{\vec{\omega}} \cos\theta
$$

点 x における放射照度は,半球面上のあらゆる方向から入射した放射輝度を足し合わせたものと考えられます.放射照度と放射輝度との関係により,放射輝度に入射角の余弦($ \cos\theta $)を掛けることで放射照度に変換することができます.入射角の余弦は,法線ベクトルと入射方向の単位ベクトルとの内積 $ \vec{\omega}' \cdot \vec{n} $ で求められ,一般的にコサイン項と呼ばれています.これらをまとめると次のようになります.

$$
E(x) = \int_{\Omega} L_{i}(x,\vec{\omega}') (\vec{\omega}' \cdot \vec{n}) d\vec{\omega}'
$$

双方向散乱面反射率分布関数

光線が物質にぶつかると、物質の内部にも光の一部が入っていきます.そして,物体内部でも反射を繰り返したのちに,光が入射した位置とは違う場所から物体外部に向かって出射していきます.このような光の現象を表面化散乱(subsurface scattering)と呼びます.これは皮膚などの半透明(translucent)な材質でよく起こる現象です.この散乱は、双方向散乱面反射率分布関数(bidirectional scattering surface reflectance distribution function:BSSRDF)で表すことができます.

tuto-pbr-bssrdf.png

BSSRDF $S$ は、位置 $x$ において $\vec{\omega}$ 方向に反射された放射輝度の微分 $dL_{r}$ を,位置 $x'$ に方向 $\vec{\omega}$ から入射する放射束の微分 $d\Phi_{i}$ で表せます.

$$
S(x,\vec{\omega},x',\vec{\omega}') = \frac{dL_{r}(x,\vec{\omega})}{d\Phi_{i}(x',\vec{\omega}')}
$$

双方向反射率分布関数

BSSRDF では表面化散乱を考慮するために,入射する位置と出射する位置が異なっていました.そこで,入射する位置と出射する位置が同じだと想定して,BSSRDF を単純化したのが双方向反射率分布関数(bidirectional reflectance distribution function:BRDF)です.

tuto-pbr-brdf.png

BRDF $f_{r}$ は,反射される放射輝度と放射照度の関係を以下のように定義しています.

$$
f_{r}(x,\vec{\omega}',\vec{\omega}) = \frac{dL_{r}(x,\vec{\omega})}{dE_{i}(x,\vec{\omega}')} = \frac{dL_{r}(x,\vec{\omega})}{L_{i}(x,\vec{\omega}')(\vec{\omega}' \cdot \vec{n}) d \vec{\omega}'}
$$

BRDF は,点 $x$ に $\vec{\omega}'$ 方向から入射した光のどれだけが,$\vec{\omega}$ 方向に反射されるかを表す割合です.一般的に反射の特徴は,「物体表面の材質」と「光の当たり方」の2つで決まってきます.「物体表面の材質」の部分は BRDF,「光の当たり方」の部分はコサイン項で定義します.

物体表面上のある位置に入射する放射輝度がわかっていれば,それがあらゆる方向に反射していく放射輝度を計算することができます.これは,入射する放射輝度 $L_{i}$ を積分することによって求められます.

$$
L_{r}(x,\vec{\omega}) = \int_{\Omega}f_{r}(x,\vec{\omega}',\vec{\omega})dE(x,\vec{\omega}') = \int_{\Omega}f_{r}(x,\vec{\omega}',\vec{\omega})L_{i}(x,\vec{\omega}')(\vec{\omega}' \cdot \vec{n}) d \vec{\omega}
$$

BRDF の物理的に重要な性質が2つあります.

相反性

光が進む方向に依存しないというヘルムホルツ(Helmholtz)の相反性(reciprocity)の法則を満たしている必要があります.

$$
f_{r}(x,\vec{\omega}',\vec{\omega}) = f_{r}(x,\vec{\omega},\vec{\omega}')
$$

エネルギー保存則

物体表面は,それが受けた以上の光を反射することはできず,以下の式を満たさなければなりません.

$$
\int_{\Omega} f_{r}(x,\vec{\omega}',\vec{\omega})(\vec{\omega}' \cdot \vec{n}) d \vec{\omega}' \leq 1, \forall \vec{\omega}
$$

反射率

物体表面で反射される光の量を,入射する放射束と反射される放射束の比で表し,これを物体表面の反射率(reflectance)$ \rho $ といいます.

$$
\rho(x) = \frac{d\Phi_{r}(x)}{d\Phi_{i}(x)} = \frac{\int_{\Omega} \int_{\Omega} f_{r}(x,\vec{\omega}',\vec{\omega}) L_{i}(x,\vec{\omega}') (\vec{\omega}' \cdot \vec{n}) d\vec{\omega}' (\vec{\omega}' \cdot \vec{n}) d\vec{\omega}}{\int_{\Omega} L_{i}(x,\vec{\omega}') (\vec{\omega}' \cdot \vec{n}) d\vec{\omega}}
$$

物理法則に基づく場合,この値は0~1の範囲でなければなりません.

BRDF と反射モデル

BRDF は光のエネルギーを用いて厳密に定義する物理量です.このBRDFを用いて実際に反射される放射輝度を計算できるようにしたものが反射モデルです.BRDFが放射照度と放射輝度の比と定義されていること,放射照度が法線と光源方向のなす角の余弦に依存していることから,反射される放射輝度は BRDF に余弦項 $\cos\theta$ を掛けたもので,この形が一般的な反射モデルです.
光反射の過程は物理的に複雑で,物体表面の反射特性を詳細にモデル化した反射モデルほど数学的に複雑で,パラメータ(例えばランバードモデルならば拡散反射率)も多くなります.

正規化 BRDF

BRDFの性質であるエネルギー保存則は,ある位置 $x$ において放出される放射輝度が入射される放射輝度(放射照度)を超えてはいけないことでした.BRDFに基づいた反射モデルよりも以前によく使われていたランバート反射モデルやフォン反射モデルなどはエネルギー保存則を満たしていません.そこで,それらの反射モデルを正規化することで,エネルギー保存則を満たし,BRDF に基づいた反射モデルとして使用することができます.

例えば,BRDFに基づいていないランバード反射モデルは次のようになっています($\rho_{d}$ は拡散反射率).

$$
L_{lambert} = \rho_{d} \cos\theta
$$

これを BRDF とコサイン項に分けると BRDF は $\rho_{d}$ となります.エネルギー保存則を考慮すると次の式を満たさなければなりません.

$$
\int_{\Omega} \rho_{d} \cos\theta d\vec{\omega} \leq 1
$$

$\cos\theta$ の半球積分は $\pi$ なので(詳細は拡散反射のところで説明),拡散反射率 $\rho_{d}$ を 1 とすると,結果は $\pi$ となり明らかに 1 を超えてしまいます.そこで,拡散反射率を $\pi$ で割ることでエネルギー保存則を満たすことになります.

$$
\int_{\Omega} \frac{\rho_{d}}{\pi} \cos\theta d\vec{\omega} \leq 1
$$

つまり,エネルギー保存則を満たしたランバート反射の BRDF は $\frac{\rho_{d}}{\pi}$ となり,この BRDF は正規化されていることになります.

拡散反射

物体表面に光がぶつかると,光の一部は屈折して物体の中に入っていきます.物体の中に進んだ光は散乱を繰り返して,物体表面に放出されます.放出されるときの方向は不規則なため,全方向に放出されると考えることもできます.光が入射する位置と出射する位置は異なっており,これが表面化散乱という物理現象を起こしています.表面化散乱を考慮しなければ,入射位置と放出位置を同じと想定することで,拡散反射の反射モデルが単純になります.

tuto-pbr-diffuse-brdf.png

ランバート反射(Lambertian diffuse reflection)では入射光の向きにかかわらず,反射輝度はすべての方向に対して一定になります.ランバート反射を引き起こす物体表面をランバート面といいます.

tuto-pbr-lambert-brdf.png

$$
L_{r}(x,\vec{\omega}) = f_{r,d} \int_{\Omega} dE_{i}(x,\vec{\omega}') = f_{r,d}(x) E_{i}(x)
$$

この関係を用いて,ランバート面の拡散反射率 $\rho_{d}$ を求めると,以下のようになります.

\begin{align}
\rho_{d}(x) &= \frac{d\Phi_{r}(x)}{d\Phi_{l}(x)} = \frac{L_{r}(x) dA \int_{\Omega} (\vec{\omega} \cdot \vec{n}) d\vec{\omega}}{E_{i}(x) dA} \\
L_{r}(x) &= f_{r,d} E(x) \\
\rho_{d}(x) &= f_{r,d}(x) \int_{\Omega}(\vec{n} \cdot \vec{\omega}') = \pi f_{r,d}(x)
\end{align}

この $\rho_{d}$ をディフューズアルベド(diffuse albedo),単にアルベドともいいます.

整理すると,ランバート反射の BRDF $f_{r,d}$ は次のようになります.

$$
f_{r,d}(x) = \frac{\rho_{d}(x)}{\pi}
$$

cosΘの半球積分

ランバート反射面ではすべての方向に一様に反射しますので,微小立体角あたりの放射光は $\cos \theta$ に比例します.半球上のすべての方向に反射する光の総量は $\cos \theta$ を積分することで求められ,次のようになります.

$$
\int_{\Omega}(\vec{n} \cdot \vec{\omega}') d\vec{\omega} = \pi
$$

つまり,$\cos\theta$ を半球積分すると $\pi$ になります.この計算は次のようになっています.

法線ベクトルと入射ベクトルの内積はコサイン項と同じです.

$$
(\vec{n} \cdot \vec{\omega}') = \cos \theta
$$

半球の積分は球面座標系の積分に書き直せます.

$$
\int_{\Omega} f(\theta,\phi) d\vec{\omega}' = \int_{0}^{2\pi} \int_{0}^{\pi/2} f(\theta,\phi) \sin\theta d\theta d\phi
$$

整理すると

\begin{align}
\int_{\Omega}(\vec{n} \cdot \vec{\omega}) d\vec{\omega}' &= \int_{0}^{2\pi} \int_{0}^{\frac{\pi}{2}} \cos\theta \sin\theta d\theta d\phi \\
&= \int_{0}^{2\pi} d\phi \int_{0}^{\pi/2} \cos\theta \sin\theta d\theta \\
&= 2\pi \int_{0}^{2\pi} \cos\theta \sin\theta d\theta \\
2倍角の公式:\sin2\theta = 2\sin\theta\cos\theta \\
&= 2\pi \int_{0}^{2\pi} \frac{\sin2\theta}{2} d\theta \\
&= \pi \int_{0}^{2\pi} \sin2\theta d\theta \\
t = 2\theta, \frac{dt}{d\theta} = 2, d\theta = \frac{1}{2}dt \\
&= \pi \int_{0}^{\pi} \sin t \frac{1}{2} dt \\
&= \pi \frac{1}{2} [-\cos t]_ {0}^{\pi} \\
&= \pi \frac{1}{2}(-\cos \pi - (-(\cos 0)) \\
&= \pi \frac{1}{2}(1+1) = \pi \frac{1}{2}(2) \\
&= \pi
\end{align}

鏡面反射

鏡面反射は入射光を鏡面反射方向に反射します.

tuto-pbr-specular-reflection.png

通常,物体表面にはある程度の粗さがあるため,鏡面反射方向だけでなく,鏡面反射方向に若干拡散します.この部分を光沢といいます.

tuto-pbr-glossy-reflection.png

鏡面反射によって反射された放射輝度は次のようになります.

$$
L_{r}(x,\vec{\omega_{s}}) = \rho_{s}(x) L_{i}(x,\vec{\omega}')
$$

完全な鏡面反射における反射方向 $\vec{\omega}_{s}$ は,次のようになります.

$$
\vec{\omega}_{s} = 2(\vec{\omega}' \cdot \vec{n})\vec{n} - \vec{\omega}'
$$

反射と屈折

ガラスのような透過する物体表面に光がぶつかると,反射と屈折の両方が起こります.

tuto-pbr-refraction.png

屈折する方向はスネルの法則で求められ,入射光が反射光と屈折光にどれくらい分配されるかはフレネルの方程式で求められます.

フレネルの方程式

屈折率 $\eta_{1}$ の媒質中の光線が,屈折率 $\eta_{2}$ の物質にぶつかるとき,光の反射量は以下のように計算することができます.

\begin{align}
\rho_{\parallel} &= \frac{\eta_{2} \cos \theta_{1} - \eta_{1} \cos \theta_{2}}{\eta_{2} \cos \theta_{1} + \eta_{1} \cos \theta_{2}} \\
\rho_{\perp} &= \frac{\eta_{1} \cos \theta_{1} - \eta_{2} \cos \theta_{2}}{\eta_{1} \cos \theta_{1} + \eta_{2} \cos \theta_{2}}
\end{align}

フレネルの方程式は偏光された光を対象としています.偏光とは特定の方向に振動している光のことです.普通の光は,あらゆる方向に振動している光が混ざっています.

$\rho_{\parallel}$ は入射面に対して平行な電界を有する光の反射係数(reflection coefficient)であり,$\rho_{\perp}$ は直交するそれになります.

物質ごとの屈折率(index of refracction)は計測されて,書籍やインターネット上で見つけることができます.例えば RefractiveIndex.INFO

偏光されていない光に対しては鏡面反射率(reflectance)は以下のようになります.

$$
F_{r}(\theta) = \frac{1}{2} (\rho_{\parallel}^2 + \rho_{\perp}^2) = \frac{d\Phi_{r}}{d\Phi_{i}}
$$

フレネルの反射係数は Shlick の近似式がよく使われます.

$$
F_{r}(\theta) \approx F_{0} + (1-F_{0})(1-\cos\theta)^5
$$

$F_{0}$ は,垂直入射におけるフレネル反射係数です.

$$
F_{0} = \frac{(\eta_{1} - \eta_{2})^2}{(\eta_{1} + \eta_{2})^2}
$$

屈折

入射角と屈折角の関係は,屈折前の媒質の屈折率 $\eta_{1}$ と,屈折後の媒質の屈折率 $\eta_{2}$ からスネルの法則(Snell's law)を用いて計算することができます.

$$
\eta_{1} \sin\theta_{1} = \eta_{2} \sin\theta_{2}
$$

$\theta_{2}$ は屈折角です.

(法線 $\vec{n}$ の完全に滑らなかな表面に対する)屈折光の方向 $\vec{\omega}_{r}$ は以下のように計算されます.

\vec{\omega}_{r} = -\frac{\eta_{1}}{\eta_{2}}(\vec{\omega}-(\vec{\omega} \cdot \vec{n}) \vec{n}) - \left(\sqrt{1-\left(\frac{\eta_{1}}{\eta_{2}}\right)^2 (1-(\vec{\omega} \cdot \vec{n})^2)}\right) \vec{n}

屈折光が運ぶ光の量は $1-F_{r}$ になります.

様々な BRDF モデル

拡散反射や鏡面反射など各反射に適した BRDF が提唱されています.

tuto-pbr-brdf-models.png
五反田義治「本当のHDR表現へ~アーティストにも知ってほしいリフレクタンスの基礎~」©tri-Ace, 2009

マイクロファセット BRDF

鏡面反射の BRDF としてクック・トランスのマイクロファセット BRDF は物理ベースの BRDF としてよく使われています.
この BRDF は次のように定義されています.

$$
f_{r} = \frac{DGF}{4 \cos\theta_{i} \cos\theta_{r}}
$$

D はマイクロファセット分布関数,G は幾何減衰項,F はフレネルです.

ここでは記号を次のように定義します.

記号 説明
$n$ 法線ベクトル
$l$ ライトベクトル
$v$ 視線ベクトル
$h$ ライトベクトルと視線ベクトルの中間ベクトル
$\alpha$ ラフネスの2乗

これらの記号を使って,先ほどの式を整理すると次のようになります.

$$
f_{r} = \frac{D(h) G(l,v) F(v,h)}{4(n \cdot l)(n \cdot v)}
$$

マイクロファセット分布関数

法線を中心とした半球内の任意の方向を向いた微小面の分布関数です.微小面がどれだけ任意の方向を向いているかを表します.この任意の方向は入射方向の逆ベクトルと,出射方向のベクトルの中間ベクトルが使われます.マイクロファセット分布関数も様々な関数が提唱されていますが,よく使われるものは GGX(Throwbridge-Reiz) です.GGX はエネルギー保存が考慮されているNDF(Normal Distribution Function)です.

$$
D_{GGX}(h) = \frac{\alpha^2}{\pi((n \cdot h)^2(\alpha^2-1)+1)^2}
$$

幾何減衰項

幾何減衰項(Geometry Attenuation Factor)は,微小面によるローカルオクリュージョンでの隠蔽減衰を表したものです.よく使われるのは Smith モデルに,Schlick の近似式を使ったものです.

\begin{align}
k &= \frac{\alpha}{2} \\
G_{Schlick}(v) &= \frac{n \cdot v}{(n \cdot v)(1-k) + k} \\
G_{Smith}(l,v) &= G_{Schlick}(l) G_{Schlick}(v)
\end{align}

フレネル

フレネルは Schlick の近似式を使います.

$$
F_{Schlick}(v,h) = F_{0} + (1-F_{0})(1- v \cdot h)^5
$$

番外

Walterらの論文「Microfacet Models for Refraction through Rough Surface」によればマイクロファセット BRDF は以下のように定義されています.

$$
f_{r} = \frac{DGF}{4 \cos\theta_{i} \cos\theta_{r}}
$$

クック・トランスの論文「A Reflectance Model for Computer Graphics」では BRDF は次のように定義されています.

$$
f_{r} = \frac{DGF}{\pi \cos\theta_{i} \cos\theta_{r}}
$$

クック・トランスの BRDF としてどちらともよく使われているみたいなのでややこしいですが,基本的に Walter らのマイクロファセット BRDF を使うことで問題なさそうです.なんで違うのかと言われるとわかりません.

レンダリング方程式

点 $x$ から $\vec{\omega}$ 方向に出射される(outgoing)放射輝度 $L_{o}$ は,放射される(emitted)放射輝度 $L_{e}$ と,反射される(reflected)放射輝度 $L_{r}$ の和です.

$$
L_{o}(x,\vec{\omega}) = L_{e}(x,\vec{\omega}) + L_{r}(x,\vec{\omega})
$$

点 $x$ における放射照度と,$\vec{\omega}$' 方向にどれだけ反射するかを表す BRDF を用いて,$\vec{\omega}$ 方向に反射される放射輝度 $L_{r}(x,\vec{\omega})$ を書き直すと次のようになります.

$$
L_{o}(x,\vec{\omega}) = L_{e}(x,\vec{\omega}) + \int_{\Omega} f_{r}(x,\vec{\omega}',\vec{\omega}) L_{i}(x,\vec{\omega}') (\vec{\omega}' \cdot \vec{n}) d\vec{\omega}
$$

これがレンダリング方程式です.

tuto-pbr-rendering-equation.png

レンダリング方程式の反射成分を見てみると,BRDF,放射輝度,コサイン項の3つのパラメータで成り立っていることがわかります.

tuto-pbr-rendering-equation-reflection.png

物理ベースレンダリング方程式の例

これまでのまとめで,拡散反射と鏡面反射を考慮したレンダリング方程式を作ってみます.自己放射はしないとします.単純に拡散反射と鏡面反射を足すと次のようになります.

\begin{align}
L_{r}(x,\vec{\omega}') &= f_{d}(x,\vec{\omega}',\vec{\omega}) L_{i}(x,\vec{\omega}') (\vec{\omega}' \cdot \vec{n}) +  f_{s}(x,\vec{\omega}',\vec{\omega}) L_{i}(x,\vec{\omega}') (\vec{\omega}' \cdot \vec{n}) \\
&= (f_{d}(x,\vec{\omega}',\vec{\omega}) + f_{s}(x,\vec{\omega}',\vec{\omega})) L_{i}(x,\vec{\omega}') (\vec{\omega}' \cdot \vec{n})
\end{align}

しかし,これではエネルギー保存則が満たされていません.放射照度のうち鏡面反射される量がどれくらいかは鏡面反射率 $F_{r}$ で表せられ,鏡面反射率はフレネルの方程式から求まります.拡散反射は屈折光で屈折光が運ぶ光の量は $1−Fr$ でした.鏡面反射率 $F_{r}$ を使ってエネルギー保存則を満たすようにすると,次のようになります.

$$
L_{r}(x,\vec{\omega}') = (f_{d}(x,\vec{\omega}',\vec{\omega})(1-F_{r}) + f_{s}(x,\vec{\omega}',\vec{\omega}) F_{r}) L_{i}(x,\vec{\omega}') (\vec{\omega}' \cdot \vec{n})
$$

鏡面反射率を求めるのは簡単ではないので,思い切って拡散反射成分と鏡面反射成分の割合をパラメータ化します.つまり $F_{r} = k$ とし,以下のようにします.

$$
L_{r}(x,\vec{\omega}') = (f_{d}(x,\vec{\omega}',\vec{\omega})(1-k) + f_{s}(x,\vec{\omega}',\vec{\omega}) k) L_{i}(x,\vec{\omega}') (\vec{\omega}' \cdot \vec{n})
$$

この $k$ はメタルネスとかメタリックと呼ばれるパラメータです.金属か非金属かで直感的に操作することができます.
マイクロファセット BRDF にはラフネスという物体表面の粗さを表すパラメータがあります.このメタルネスとラフネスは物理ベースレンダリングにおいて,とても重要なパラメータになっています.アンリアルエンジン4などで扱っている物理ベースのマテリアルには必ずあるパラメータです.

最終的なレンダリング方程式は次のようになります.

$$
L_{r}(x,\vec{\omega}') = \int_{\Omega}(f_{d}(x,\vec{\omega}',\vec{\omega})(1-k) + f_{s}(x,\vec{\omega}',\vec{\omega}) k) L_{i}(x,\vec{\omega}') (\vec{\omega}' \cdot \vec{n}) d\vec{\omega}
$$

最後に

光の基本から始まり,放射照度,放射輝度といった光の物理的なエネルギー,光の反射特性,BRDF,そして,レンダリング方程式と説明してきました.物理ベースレンダリングとは結局のところ,物体の表面に当たった放射エネルギー(放射照度)が,ある方向(カメラや目)に向かって反射する放射エネルギー(放射輝度)を計算するときに,相反性とエネルギー保存則を満たした BRDF の反射モデルを使っていることということになるでしょうか.ただし,この2つの物理的性質を満たしていても,物理的に正しいというわけではありません.

少しでも誰かの参考になれば幸いです.

実装編

物理ベースレンダリングを実装するための解説記事を書きました.興味があれば以下からどうぞ.

基礎からはじめる物理ベースレンダリング(実装編)


参考文献

  • Robert L. Cook, Kenneth E. Torrance「A Reflection Model for Computer Graphics」,1982
  • Bruce Walter, Stephen R. Marschner, Hongsong Li, Kenneth E. Torrance「Microfacet Models for Refraction through Rough Surfaces」,2007
  • Brian Karis「Real Shading in Unreal Engine 4」,2013
  • Wes McDermott「The Comprehensive PBR Guide by Allegorithmic - vol. 1 Light and Matter : The theory of Physically-Based Rendering and Shading」, Web: https://www.allegorithmic.com/pbr-guide
  • Wes McDermott「The Comprehensive PBR Guide by Allegorithmic - vol. 2 Light and Matter : Practical guidelines for creating PBR textures」, Web: https://www.allegorithmic.com/pbr-guide
  • Wes McDermott著,小林信行訳「総合PBRガイド by Allegorithmic - vol. 1 光と物質:物理ベースレンダリングとシェーディングの理論」, 2015,< https://www.slideshare.net/nyaakobayashi/pbr-guide-vol1jp >(2017年6月29日閲覧)
  • Wes McDermott著,小林信行訳「総合PBRガイド by Allegorithmic - vol. 2 光と物質:PBRのテクスチャを作成するための実用的なガイドライン」, 2015,< https://www.slideshare.net/nyaakobayashi/70100srgb180255 >(2017年6月29日閲覧)
  • Henrik Wann Jenson著,苗村健訳「フォトンマッピングー実写に迫るコンピュータグラフィックス」オーム社,2002
  • 倉地紀子「CG Magic:レンダリング」オーム社,2007
  • CG-ARTS協会「コンピュータグラフィックス」CG-ARTS協会,2015
  • CG-ARTS協会「ディジタル画像処理」CG-ARTS協会,2015
  • 「ニュートン別冊「光は電磁波」を実感 光とは何か?」ニュートンプレス,2007
  • Eric Lengyel著,狩野智英訳「ゲームプログラミングのための3Dグラフィックス数学」ボーンデジタル社,2006
  • 西川善司「ゲーム制作者になるための3Dグラフィックス技術」インプレスジャパン,2009
  • 向川康博「反射・散乱の計測とモデル化」『コンピュータビジョン最先端ガイド4』アドコム・メディア,2011,p.121
  • Eugene Hecht著,尾崎義治・朝倉利光訳「ヘクト 光学Ⅰー基礎と幾何光学ー」丸善出版,2010
  • CGWORLD,永田豊志「CG&映像しくみ事典」ワークスコーポレーション,2009
  • JEREMY BIRN著,株式会社Bスプラウト訳「ライティング&レンダリング」ボーンデジタル,2014
  • 山本醍田他「Computer Graphics Gems JP 2015 コンピュータグラフィックス技術の最前線」ボーンデジタル,2015
  • pnlybubbles「物理ベースレンダリング1」< http://qiita.com/pnlybubbles/items/416a3273cd245d1a1c04 >(2017年6月29日閲覧)
  • shikihuiku「物理ベースレンダリング(1)」< https://shikihuiku.wordpress.com/2012/07/03/%E7%89%A9%E7%90%86%E3%83%99%E3%83%BC%E3%82%B9%E3%83%AC%E3%83%B3%E3%83%80%E3%83%AA%E3%83%B3%E3%82%B01/ >(2017年6月29日閲覧)
  • shocker「放射輝度 (Radiance)」< http://rayspace.xyz/CG/contents/radiance.html >(2017年6月29日閲覧)
  • Ushio「レイトレーシングにおける放射輝度って結局何なのか?」< http://qiita.com/Ushio/items/e2752fa10e093a1b4cdd >(2017年7月1日閲覧)
  • holo「物理ベースレンダラedupt解説」< http://www.slideshare.net/h013/edupt-kaisetsu-22852235 >(2017年6月29日閲覧)
  • holo「双方向パストレーシングレンダラedubpt解説」< http://www.slideshare.net/h013/edubpt-v100 >(2017年6月29日閲覧)
  • A.R Khadka「BSDF」< https://anishrkhadkablog.wordpress.com/tag/bsdf/ >(2017年6月30日閲覧)
  • 五反田義治「本当のHDR表現へ~アーティストにも知ってほしいリフレクタンスの基礎~」< http://research.tri-ace.com/Data/BasicOfReflectance.ppt >(2017年7月1日閲覧)
  • 床井浩平「ゲームグラフィックス特論 第6回陰影付け」< http://www.wakayama-u.ac.jp/~tokoi/lecture/gg/ggnote06.pdf >(2017年7月1日閲覧)
  • 床井浩平「ゲームグラフィックス特論 第9回高度な陰影付け」< http://www.wakayama-u.ac.jp/~tokoi/lecture/gg/ggnote09.pdf >(2017年7月1日閲覧)
  • 山口裕也「FINAL FANTASY 零式 HD にみる新しいHDリマスター~GPU最適化編~」