写実的なCGを描画するアルゴリズムは、基本的にここで紹介するレンダリング方程式と呼ばれるものを解いています。このページではレンダリング方程式の基本的な形を紹介します。
図1. レンダリング方程式をモンテカルロレイトレーシングによって解くことで得られる画像 |
真空のシーンにおいて、ある物体表面の点 $ \vx $ を考え、そこから $ \vomega_o $ 方向に出射される放射輝度 $ L_o(\vx, \vomega_o) $ は次の「レンダリング方程式」(別名:光輸送方程式、Light Transport Equation)[Kajiya1986]でモデル化されます。直感的に言うと、ある点を出射する光は、その点自身が光源として出す光と、周囲から入ってきて反射(透過)した光の和で表されます。右辺の第一項、第二項がそれぞれに相当します。
\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をかけてあらゆる入射方向( = 全球の範囲 $ \mathcal{S}^2 $)に関して積分することで出射する放射輝度を求める事ができます。
透過を扱わない場合のレンダリング方程式は、ほぼ同じ形ですが次のように表されます。
\begin{eqnarray*}
L_o(\vx, \vomega_o) = L_e(\vx, \vomega_o) + \int_{\mathcal{H}^2}
f_r(\vx, \vomega_i, \vomega_o) L_i(\vx, \vomega_i)
\absb{\vomega_i \cdot \vec{n}} \d\vomega_i
\end{eqnarray*}
積分範囲が半球を表す $ \mathcal{H}^2 $ ($ \Omega $ もよく使われる)になり、BSDFの代わりに反射だけを扱うBRDF $ f_r $ に文字が置き換わっています。
入射した光が物体内部で散乱を繰り返し、入射位置とは異なる位置から出射するような複雑な反射モデルにBSSRDF (Bidirectional Scattering Surface Reflectance Distribution Function)と呼ばれるものがありますが、上記のレンダリング方程式で取り扱う光輸送の範囲外となります。BRDFはBSSRDFにおいて入射位置と出射位置の距離が十分に小さい場合の近似となります。
「双方向(反射率|透過率|散乱)分布関数 (B(R|T|S)DF)」で解説したように一般的にBSDFは相反性を持ちませんが、basic radianceに関するBSDF (basic BSDF)は相反性を持ちます。basic radianceに関するレンダリング方程式は次の形で表すことができます。 \begin{equation*} L_{b, o}(\vx, \vomega_o) = L_{b, e}(\vx, \vomega_o) + \int_{\mathcal{S}^2} f_{b, s}(\vx, \vomega_i, \vomega_o) L_{b, i}(\vx, \vomega_i) \eta_i^2 \absb{\vomega_i \cdot \vec{n}} \d\vomega_i \end{equation*} ここで $ L_b $ はbasic radianceを、$ f_{b, s} $ はbasic BSDFです。通常のレンダリング方程式とほぼ同じですが、唯一の違いとして入射光 $ L_{b, i} $ が含まれている媒質の屈折率 $ \eta_i $ の二乗が積分に追加されています。また、通常の放射輝度に対するbasic radianceの定義とbasic BSDFの定義を考えればこの式が簡単に元のレンダリング方程式と変形できることがわかると思います。
「放射輝度(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 $ は直接評価できない未知の関数であるため、このままではモンテカルロ法を適用することができません。これを解決するための定式化についても同ページで解説します。
このページで紹介したレンダリング方程式は、真空を仮定しているため、光が物体表面だけで反射や透過などの散乱現象を起こします。表面以外の空間中での散乱までも考慮した「ボリュームレンダリング方程式」はまた別のページで解説します。