個人的なメモ

技術メモがメインです.本ブログはあくまで趣味です.

Physically based rendering(PBR)を理解するための基礎知識

Physically based rendering(PBR)を理解するための基礎知識

PBRとは,物体における光の反射や拡散,光源,シーン,カメラに入射する光などを数式でモデル化してレンダリングする手法. ここでは,他の記事を参考に光の基礎からまとめていきます.

 光の二面性

光は粒子の二面性を持つ.

波として捉える場合は,光は電磁波の一種と考える. 電磁波は電場と地場の変化によって作られる波であり,光のエネルギーを放出または伝達する. この現象を放射と呼ぶ. 真空中を電場と磁場が垂直に絡まり合いながら進行していくものが光である. 電場または磁場の山から山の長さが波長となる. 太陽や電球などの光源から電磁波が発生し,大気中で散乱や吸収されながら進み,物体表面にぶつかって反射が起こる. 光は媒質によって伝搬される.媒質となる物体を媒体と呼ぶ.

f:id:engineerAlex:20200607125631p:plain

光は粒子としての側面も持つ.粒子的な側面を強調すると,光を光子と呼ぶ. 金属に光を当てた時に,金属の表面から電子が飛び出す.この現象を光電効果と呼ぶ. 飛び出した電子を光電子と呼ぶ. 強い光を金属に当てても電子は飛び出さないが,波長の短い光を当てると電子が飛び出す. 当てる光の波長を短くすると,飛び出す電子の数は変わらず,電子のエネルギーが大きくなる. 光を強くしていくと,飛び出す電子の数が増え,電子のエネルギーは変化しない.

この現象は,光を波動として捉えると説明ができず,光を粒子として捉えることで説明できる. つまり,光が粒子として金属に当たり,電子がはじき出されると考えるということである. なお,光電子増倍管は,光電効果を利用して光を検出する.

f:id:engineerAlex:20200607125706p:plain

光の性質

  • 直進性 光を電磁波の一種と捉えると,障害物がなく均一な物体の中を通る限りは直進する. 光の速度は299792458[m/s]である.

  • 反射性 光は金属などの表面で鏡面反射する. この時,反射の法則により完全に平坦な表面上においては,入ってきた光と反射する光の角度が等しくなる(完全反射). 表面に凹凸がある場合は様々な方向に反射される(乱反射).

  • 屈折性 光は通り抜ける物体によって速度が変わる. そのため,密度の違う物質の協会では屈折する.

  • 吸収性 物質には特定の波長の光を吸収する性質がある. 光が吸収されると多くの場合,そのエネルギーは熱に変わる. 変化した量に応じて光の強さは減衰し,光の色はその波長に応じて吸収された光量だけ変化するが,光線の方向は変わらない.

吸収と散乱

吸収とは,光が微小の粒子にぶつかった時に,直進する方向を変えることである. 方向は媒体の材質に応じて変化する.

吸収とは光のエネルギーが物質との相互作用によって,他のエネルギーに変わることである.

光のエネルギー

光のもつ物理的なエネルギーは光学において放射量と呼ぶ.

人間は光の波長に応じて感度が異なり,波長のち外は色として知覚される. 人間の眼を通した光の量を測光量といい,測光学(Photometry)の扱いになる.

光線

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

反射:光線が表面で反射し,異なる方向へ進行する.反射の法則に従えば反射角は入射角に等しくなる.

屈折:光線は表面で速度が代わり,屈折して一方の媒体から別の媒体へと通り抜ける.

反射

入射光と反射光の関係は下記の通り.

f:id:engineerAlex:20200607125729p:plain

鏡面反射

物体表面における反射光を鏡面反射光と呼ぶ. 凹凸のない表面にぶつかると,入射角と反射角は同じになる. 一般的な物体は多少凹凸があるため,反射光は鏡面反射方向に拡散し,反射した光はぼやけて見える. 一方,物体表面が滑らかな場合は収束し,反射した光は鮮明になる.

f:id:engineerAlex:20200607125745p:plain

屈折

光線は表面で速度が代わり,屈折して一方の媒体から別の媒体へと通り抜ける. この際の速度変化の指標が屈折率(Index of refraction:IOR)である. 屈折率の定義は下記の通りである.


n = \dfrac{c}{v} = \sqrt{\dfrac{\epsilon \mu} {\epsilon_0 \mu_0}}

ここで,\mu\epsilonはそれぞれ材質の透磁率[H/m]と誘電率[F/m]である. \mu_0\epsilon_0はそれぞれ真空の透磁率誘電率である.

下記が光の屈折の例.ストローが曲がって見える.

f:id:engineerAlex:20200607125758p:plain

拡散反射光

光線が別の媒体に入り,その媒体内部で散乱や吸収を起こし,元の媒体に出射される光を拡散反射光と呼ぶ.

f:id:engineerAlex:20200607132843p:plain

微小面

光線が物体表面にぶつかって反射する方向は,物体表面の凹凸に依存する. 小さな凹凸を微笑面(microfacet)と呼び,微小面の傾きから物体表面の粗さを計算する. 各微小面は完全鏡面反射すると考えることがある. この考え方では,微小面により光が物体表面に到達する直前や,反射直後に近傍の打ったい表面により遮られる現象が起きる. この現象をローカルオクリュージョンと呼び,ローカルオクリュージョンはセルフシャドウイングと背フルマスキングがある. セルフシャドウイングは光が物体表面に到達するまでの間に物体表面によって遮られる現象である. セルフマスキングは光が物体表面で反射された後に物体表面から遠ざかる間に遮られる現象である.

f:id:engineerAlex:20200607132856p:plain

物体表面に凹凸があるということは,微正面の傾きに変化があるということで,これにより光が拡散する.

f:id:engineerAlex:20200607132910p:plain

放射束

光の基本単位は光子(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}
}

立体角

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

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

これを3次元で考えると,半径{r}の球面上の面積{A}に対応する立体角{\omega}は[tex:{\omega = A/r2}]. 球の面積は[tex:{4\pir2}]のため,球全体の立体角は{4\pi}ステラジアンになる.

放射強度

放射強度(radiant intensity){I}は,単位立体角({\omega})あたりの放射束.

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

放射強度は一定の方向に,どの程度の放射束が放出されているのかを表す.

放射輝度

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

{
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}となる. これはランバートのコサイン則として知られている. よって,この領域における放射照度は次のようになる.

{
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}'
}

双方向反射率分布関数

BSSRDFでは入射する位置と出射する位置を別々に考えた関数. ここで入射する位置と出射する位置が同じだと想定して,BSSRDFを単純化したのが双方向反射率分布関数(bidirectional reflectance distribution function:BRDF).

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,「光の当たり方」の部分はコサイン項で定義する.

反射率

反射率の定義は,物体表面に入射する放射束と反射される放射束の比で表す. 反射率は0~1の値になる.

{
\rho(x) = \dfrac{d\phi_r(x)}{d\phi_i(x)}
}

BSDFから反射率を表す方法は下記ページを参照.

rayspace.xyz

引用/参考

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

academy.substance3d.com

www.an.shimadzu.co.jp