このページではMathJaxによる数式表示を行っています。対応しているブラウザーであれば少し待てば数式が表示されます。
(画面左下にMathJaxのタイプセットステータスが表示されます。)
環境によっては表示が崩れているかもしれません。その際はブラウザーを変更してみてください。

レンダリング方程式 (Rendering Equation) 1

写実的なCGを描画するアルゴリズムは、基本的にここで紹介するレンダリング方程式(別名:光輸送方程式、Light Transport Equation)[Kajiya1986]と呼ばれるものを解いています。このページではレンダリング方程式の基本的な形を紹介します。

基本形のレンダリング方程式

レンダリング方程式
図1. レンダリング方程式
あらゆる方向から入射する光が反射した放射輝度と面の自発光による放射輝度の和によってレンダリング方程式は表される。

真空のシーンにおいて、ある物体表面の点 $ \vx $ を考え、そこから $ \vomega_o $ 方向に出射される放射輝度 $ L_o(\vx, \vomega_o) $ は次の「レンダリング方程式」でモデル化されます。直感的に言うと、ある点を出射する光は、その点自身が光源として出す光と、周囲から入ってきて反射した光の和で表されます。右辺の第一項、第二項がそれぞれに相当します。

\begin{eqnarray} L_o(\vx, \vomega_o) = L_e(\vx, \vomega_o) + \int_{\mathcal{S}^2} f_s(\vx, \vomega_i, \vomega_o) L_i(\vx, \vomega_i) \absb{\vomega_i \! \cdot \vec{n}} d\vomega_i \label{eq:std_LTE} \end{eqnarray}

ここで、$ L_e(\vx, \vomega_o) $ は $ \vx $ が自発光している場合の $ \vomega_o $ 方向への放射輝度を表し、$ L_i(\vx, \vomega_i) $ は $ \vx $ に $ \vomega_i $ 方向「から」入射する放射輝度、$ \vec{n} $ は $ \vx $ における法線ベクトル、$ f_s(\vx, \vomega_i, \vomega_o) $ は、$ \vx $ において $ \vomega_i $ と $ \vomega_o $ に対するBSDFを表しています。BSDF(詳細後述)は、簡単に言うと「ある方向から来た光が別の方向にどれくらい反射するか」を表しています。入射する放射輝度に対してcos(=入射ベクトルと法線の内積)をかけることで微小放射照度が求まり、それにBSDFをかけて入射方向に関して積分することで反射する放射輝度を求める事ができます。

BSDF:Bidirectional Scattering Distribution Function

BSDF
図2. BSDF
BSDFはBRDFとBTDFの合成によって表される。

光が物体に当たると、反射(Reflection)や透過(Transmission)、吸収(Absorption)が起こります。これらの現象が全て衝突点で起こると仮定し、物体表面上での光の振る舞いをモデル化したものにBSDF(Bidirectional Scattering Distribution Function)があります。BSDFは入射した光に対して出射方向が同じ半球内となる、つまり反射を扱うBRDFと、出射方向が異なる半球内となる、透過を扱うBTDFの合成です。BRDFとBTDFのフルスペル、日本語訳はそれぞれBidirectional Reflectance Distribution Function・双方向反射率分布関数とBidirectional Transmittance Distribution Function・双方向透過率分布関数です。BRDF(BTDF)は物体表面上の位置(2次元)と入射方向、出射方向を変数とする6次元関数で、直感的な説明としては、ある点にある方向から入射した光が、どの方向にどの程度反射(透過)されるかを表しています。
上図では、白い線の角度で、ある点に入射した光がある分布を持って反射(透過)する様子を表しています。一方、緑の線の角度で入射した場合には、白とは異なる分布を持ち得ます。当然違う点を考えればまた異なる分布となるかもしれません。上図では説明のため2次元空間内の方向分布(1次元関数)としていますが、実際には3次元空間内での方向分布(2次元関数)となるためBSDFは6次元関数です。

数学的には、BSDFは入射する放射照度に対して出射される放射輝度の比として、次のように表されます。

\begin{eqnarray*} f_s \Prta{\vx, \vomega'\!, \vomega} = \frac{dL_r \Prta{\vx, \vomega}}{dE_i \Prta{\vx, \vomega'}} = \frac{dL_r \Prta{\vx, \vomega}}{L_i \Prta{\vx, \vomega'} \absb{\vomega' \!\! \cdot \vec{n}} d\vomega'} \end{eqnarray*}

$ dE_i \Prta{\vx, \vomega'} $ は入射方向 $ \vomega' $ に対する微小放射照度であり、$ L_i \Prta{\vx, \vomega'} \absb{\vomega' \!\! \cdot \vec{n}} d\vomega' $ として書き換える事ができます。$ \vec{n} $ は点 $ \vx $ における法線ベクトルを表します。なぜ、入射する放射輝度ではなく放射「照度」なのかと疑問を持つかもしれません。物体表面の微小面積に降り注ぐエネルギーは同じ輝度でも光を当てる角度によって変化します。BSDFでは、物体の反射特性のみで反射/透過特性を表現したいために入射に関しては放射照度となっています。また、そのためにBSDFの単位は $ \Brk{\mathrm{sr}^{-1}} $ となります。

理想拡散反射のBRDF
(a) (理想)拡散反射
理想鏡面反射のBRDF
(b) (理想)鏡面反射
光沢反射のBRDF
(c) 光沢反射
図3. BRDFの分類
BRDFは拡散反射、鏡面反射、光沢反射の3つに大別される。

BRDFはその反射特性から3つに大別することができ、あらゆる方向におおよそ等しく反射する拡散反射(Diffuse Reflection)、正反射方向にのみ反射する鏡面反射(Specular Reflection)、そして正反射方向を中心としてある程度の広がりを持って反射する光沢反射(Glossy Reflection)に分けられます。拡散反射は非常にざらざらした物体表面によく見られ、全ての方向に完全に等しく反射する場合には理想拡散反射、ランバート反射と呼ばれます。鏡面反射は逆に綺麗に磨かれた滑らかな表面で起こります。透過に関してもこのような特性の分類が可能です。

例として、受けたエネルギーを30%完全拡散反射するBSDFは次の式で表されます。完全拡散ですので出射方向に依存しません。

\begin{equation*} f_s (\vx, \vomega', \vomega) = \frac{0.3}{\pi} \end{equation*}

ここで疑問が生じるかもしれません。半球内のあらゆる方向に等しく反射するのなら分母は半球の立体角 $ 2\pi $ になると考える人も多いでしょう。$ \pi $ になる理由は,BSDFがあくまで入射する放射照度に対する「放射輝度」で表されているからです。放射輝度はある点からある方向に出るエネルギー量ですが、cos項によって割られているため、同じエネルギー量であっても出射方向によって放射輝度は変化します。そのため、エネルギーに関する反射率(今回の場合30%)を求める場合には、BSDFにcos項を乗じてから積分します。

\begin{equation*} \int_0^{2\pi} \!\!\! \int_0^{\frac{\pi}{2}} \frac{0.3}{\pi} \cos{\theta} \sin{\theta} d\theta d\phi = 0.3 \end{equation*}

BRDFの相反性

BRDFには「ヘルムホルツの相反性(Reciprocity)」という重要な性質があります。(BTDFには無い!)これは以下の式で表されます。 \begin{eqnarray*} f_r \Prta{\vx, \vomega'\!, \vomega} = f_r \Prta{\vx, \vomega, \vomega'} \end{eqnarray*} つまり、入射方向と出射方向を入れ替えても同じBRDFの値が得られることを意味しています。また、この都合上BSDFでは入射方向を実際の光の向きとは逆向きに定義します。ここで勘違いしてはならないのが、例えば100の光が80で反射される入射、出射方向の組み合わせがあったとして、逆方向から80の光を入れて100が反射されるわけではないことです。当然ですが。この場合は逆方向から80の光が入ると64の光が反射されます。

透過時の放射輝度の変化
図4. 透過時の放射輝度の変化
屈折によって光がより狭い立体角へと集中するため放射輝度に変化が生じる。

また、相反性に関してもうひとつ注意すべき事は、BTDFには相反性が成り立たないということです。上図のように屈折率の高い物質に光が半球上の全方向から入射することを考えた場合、それらの光は界面を挟んで反対側では半球よりも小さな範囲へと透過します。そのため明らかに光の密度、つまり放射輝度に変化が生じている事がわかります。これより透過の場合には入射方向、出射方向を入れ替えても相反性が成り立たないことがわかると思います。
ただし、放射輝度を屈折率の二乗で割ったもの($ L \, / \, \eta^2 $, basic radianceなどと呼ばれる)を考えればBTDFも相反性を持ちます。

BSDFのエネルギー保存則

物理的に有効な物体表面は受けた光エネルギー以上のエネルギーを反射・透過することはできないというエネルギー保存則を満たすため、次の式を満たします。 \begin{eqnarray*} \int_{\mathcal{S}^2} f_s \Prta{\vx, \vomega'\!, \vomega} \absb{\vomega \cdot \vec{n}} d\vomega \leq 1 \hspace{5mm}\mbox{for all $ \vomega' \! \in \mathcal{S}^2 $} \end{eqnarray*}

発展的なレンダリング方程式

放射輝度(radiance)」で説明したように、真空中では放射輝度は距離を進めても不変という性質がありました。そのため入射放射輝度 $ L_i(\vx, \vomega_i) $ も結局シーン中の物体表面を出射した輝度 $ L_o $ と考える事ができます。それを踏まえて\eqref{eq:std_LTE}を書き換えると以下の式になります。

\begin{eqnarray} L_o(\vx, \vomega_o) = L_e(\vx, \vomega_o) + \int_{\mathcal{S}^2} f_s(\vx, \vomega_i, \vomega_o) L_o(\raycast(\vx, \vomega_i), -\vomega_i) \absb{\vomega_i \! \cdot \vec{n}} d\vomega_i \label{eq:var_LTE} \end{eqnarray}

ここで、$ \raycast \Prta{\vx, \vomega_i} $ は $ \vx $ から $ \vomega_i $ の方向に見つかる最も近い点を得るレイキャスト関数です。この変形によってレンダリング方程式がシーン中の点と点との関係で表されることがわかります。ただ、式\eqref{eq:std_LTE}, \eqref{eq:var_LTE}はあくまで微小立体角=方向に関する積分として定義されていますが、これをシーン中の点と点との明示的な接続としての定式化を行う事もできます。それについては「レンダリング方程式(Rendering Equation) 2」で解説します。またレンダリング方程式では $ L_e $ は既知であるものの、積分内の $ L_o $ は直接評価できない未知の関数であるため、このままではモンテカルロ法を適用することができません。これを解決するための定式化についても同ページで解説します。

このレンダリング方程式は、真空を仮定しているため、光が物体表面だけで反射や透過などの散乱現象を起こします。表面以外の空間中での散乱までも考慮した「ボリュームレンダリング方程式」はまた別のページで解説します。

参考文献

  • [Jensen2002] Henrik Wann Jensen(著), 苗村 健(訳) - "フォトンマッピング―実写に迫るコンピュータグラフィックス", 2002, オーム社
  • [Kajiya1986] James T. Kajiya - "THE RENDERING EQUATION", 1986
  • [Veach1998] Eric Veach, Leonidas J. Guibas - "ROBUST MONTE CARLO METHODS FOR LIGHT TRANSPORT SIMULATION", 1998

Today : 00000012 Total : 00056677
Copyright © 2017 shocker.