現実のカメラはレンズを用いることによって多くの光を取り入れていますが、これによって「焦点」や「ボケ」という概念を持ちます。一般的なカメラは多くのレンズを持っており、これらをシーン中のオブジェクトとしてシミュレートすればより現実感のある画像が得られますが、結構高負荷な計算になってしまいます。ここでは、レンズ群を抽象化し、低負荷かつ説得力のある画像を作り出せるレンズモデルを紹介します。
また、双方向パストレーシング等で重要となる、シーン中の1点目の確率密度を面積測度に関してどうやって求めるかについても解説します。
最も簡単なカメラにピンホールカメラがありますが、理想的なピンホールカメラでは穴の大きさは無限に小さい必要があります。穴が大きい場合にはシャープな画像は得られません。一方で、穴が小さければ小さい程取り入れることのできる光量が減ってしまうため、撮影に時間がかかってしまいます。そこで実用的なカメラでは、レンズを用いて光を集めることによって現実的な撮影時間で明るい画像の撮影を可能としています。また撮影時にしっかりと焦点を合わせることによってシャープな画像も得られます。ただし、画像中に写る物体それぞれはカメラに対して異なる距離を持つため、全てに焦点を合わせることは困難で、基本的にはメインとなる物体に焦点を合わせ、他の物体は距離が異なるほど「ボケ」ます。ある程度までのボケまでなら焦点が合っていると見なせるため、その焦点が合っている奥行き方向の広さを「被写界深度(Depth of Field, DoF)」と呼びます。ただCGにおいてDoFと言うと、レンズによるボケを再現すること全般を呼んでいる気がします。
ボケをCGで再現する場合、シーンを出た光がレンズを通過してセンサーに至る経路をシミュレートする必要があります。身の回りにあるカメラはいずれも複数枚のレンズを用いて、イメージセンサーへと光を導きます。このような複数枚のレンズを通る光を計算するのは複雑で高負荷なため、「薄レンズ(Thin Lens)」近似と呼ばれる単純なレンズモデルを用います。
薄レンズモデルでは、レンズに入射した光は1回だけ屈折します。レンズ内での反射なども考えません。
物体上の1点を出射した光がレンズ上の様々な点を通過し、またある一点に収束するとき、物体上の点を物点(object point)と呼び、再度収束する点を像点(image point)と呼びます。イメージセンサーとレンズを考え、センサー上の全ての点それぞれに関して物点を考えると、その集合となる物体平面(object plane)を得ます。上の図のように、物体平面上の点( $ p_1 $ )を出た光は、レンズ上のどの点を通る場合でもセンサー上の1点( $ p'_1 $ )に収束します。一方で、物体平面から離れた点はセンサー上の1点では収束せず、ある大きさを持ってセンサーに対してぼけた像を写します。これを錯乱円(Circle of Confusion, CoC)と呼びます。錯乱円の大きさは対象が物体平面から離れる程大きくなります。また、レンズの有効口径が大きくなる場合、焦点距離が長くなる場合も大きくなります。
レイトレーシングでDoFを再現する場合には、レンズ上の点とセンサー上の点をランダムに選びます。センサー上の点は仮想的な物体平面上の点に対応づけられるため、レンズ上の点を原点として、物体平面上の対応点に向かうレイを生成し、トレースします。そして何本もレイを飛ばした結果の平均をとることでDoFの効いた画像を生成することができます。もちろん、レンズ、センサー上の点をランダムに選ぶため、モンテカルロ法に従い確率密度で寄与を割る必要があります。
レンズ上の点を選んだ後であれば、センサー上の点がシーン中の1点目に一意に対応づけられるため、多くの実装では、センサー - レンズ間の経路は考えず、レンズ上の1点を経路の端点と考えます。センサー応答関数 $ W_e^j(\vx_1 \RAR \vx_0) $ もレンズに入射する光に関して考えられます。
ここで、$ \vec{n}_0 $ はレンズ面の法線(薄レンズなのでレンズ上のどの点でも光軸方向に一致)、$ p_{A_{lens}}(\vx_0) $ はレンズ上の1点をサンプルする確率密度、$ p_\sigma(\vx_0 \RAR \vx_1) $ は、$ \vx_0 $ から $ \vx_1 $ の方向をサンプルする確率密度です。後者の確率密度の求め方については次節で解説します。$ \vx_0 $ のサンプル範囲を円ではなく、例えば六角形にするとボケ形状も六角形になります。つまり絞り形状によってボケ形状が変化する様も再現可能です。
パストレーシングでDoFを行う場合、センサー上、レンズ上それぞれのランダムな点からシーン中の1点目が一意に決定されます。センサー - レンズ間の経路を隠蔽して考える場合は、センサー上の点をサンプルする確率密度から、シーン中の1点目をサンプルする確率密度を求める必要があります。ライトトレーシングでは光源側からレンズへと至る経路を生成し、寄与を光源上の確率密度から始まり、続く経路の点の確率密度で割ることになりますが、最後の2点はパストレーシングにおけるシーン中の1点目とレンズ上の確率密度に相当します。双方向パストレーシングでは、多重重点的サンプリングのために、これら2つのアルゴリズムによって生成される経路の確率密度を同じ測度に揃える必要があり、ここでも1点目の確率密度を求めておく必要があります。ここでは、センサー上の1点を選ぶ確率密度がシーン中の1点目の確率密度とどのような関係を持つかについて解説します。
\begin{eqnarray*} \d\vomega_i = \frac{\absb{\vomega_{\vx'' \vx} \cdot \vec{n}''}}{\norm{\vx'' - \vx}^2} V \Prta{\vx'' \LRAR \vx} \d A \Prta{\vx''} \end{eqnarray*} 「レンダリング方程式2」でも説明したように、微小立体角と微小面積の関係は上の式のようになっており、この関係より、確率密度が次のように求められます。可視関数は簡単のため省略しました。 \begin{eqnarray*} p_A \Prta{\vx''} = \frac{\absb{\vomega_{\vx \vx''} \cdot \vec{n}''}}{\norm{\vx'' - \vx}^2} p_{\sigma} \Prta{\vx \RAR \vx''} = G \Prta{\vx \LRAR \vx''} p_{\sigma^\perp} \Prta{\vx \RAR \vx''} \end{eqnarray*} ここで、$ p_{\sigma^\perp} $ は投影立体角に関する確率密度で、$ p_{\sigma^\perp} \Prta{\vx \RAR \vx''} = p_{\sigma} \Prta{\vx \RAR \vx''} \;/\; \absb{\vomega_{\vx \vx''} \cdot \vec{n}} $ と表されます。
「センサー上の点 $ \vx_p $ に対応した物体平面上の点 $ \vx'_1 $ へと、レンズ上の点 $ \vx_0 $ から方向をサンプリングする確率密度(投影立体角測度)」が、「実際に物体に衝突する点 $ \vx_1 $ へと、レンズ上の点 $ \vx_0 $ からの方向をサンプリングする確率密度」と等しくなることは明らかです。
この関係は次のように表されます。
\begin{eqnarray*}
p_{\sigma^\perp} \Prta{\vx_0 \RAR \vx'_1}
= \frac{p_A \Prta{\vx'_1}}{G \Prta{\vx'_1 \LRAR \vx_0}}
= p_{\sigma^\perp} \Prta{\vx_0 \RAR \vx_1}
= \frac{p_A \Prta{\vx_1}}{G \Prta{\vx_1 \LRAR \vx_0}}
\end{eqnarray*}
$ p_A \Prta{\vx_1} $ について上の式を変形することで、$ p_A \Prta{\vx'_1} $ との関係がわかりやすくなります。センサー上の点 $ \vx_p $ は物体平面上の点 $ \vx'_1 $ に対応づけられます。(左右対称の凸レンズなら?)倍率 $ d_o \;/\; d_p $ 倍に拡大されるため、同じ1点でも倍率の2乗の逆数として測度は小さくなります。これによってセンサー上の点 $ \vx_p $ の確率密度と、実際の物体上の点 $ \vx_1 $ の確率密度との関係を表す事ができます。
\begin{eqnarray*}
p_A \Prta{\vx_1} = \frac{G \Prta{\vx_1 \LRAR \vx_0}}{G \Prta{\vx'_1 \LRAR \vx_0}} p_A \Prta{\vx'_1}
= \frac{G \Prta{\vx_1 \LRAR \vx_0}}{G \Prta{\vx'_1 \LRAR \vx_0}} \frac{d_p^2}{d_o^2} p_A \Prta{\vx_p}
\end{eqnarray*}
後は、分母分子の幾何項を展開し、変形を進めることで最終的に以下の関係を得ます。
\begin{eqnarray*}
p_A \Prta{\vx_1} &=&
\frac{
\displaystyle
\hphantom{\hspace{4mm}}
\frac{\absb{\vomega_{\vx_0 \vx_1} \cdot \vec{n}_1} \absb{\vomega_{\vx_0 \vx_1} \cdot \vec{n}_0}}{\norm{\vx_1 - \vx_0}^2}
\hphantom{\hspace{4mm}}
}
{
\displaystyle
\frac{\absb{\vomega_{\vx_0 \vx'_1} \cdot \vec{n}'_1} \absb{\vomega_{\vx_0 \vx'_1} \cdot \vec{n}_0}}{\norm{\vx'_1 - \vx_0}^2}
}
\frac{d_p^2}{d_o^2} p_A \Prta{\vx_p} =
\frac{
\displaystyle
\frac{\absb{\vomega_{\vx_0 \vx_1} \cdot \vec{n}_1}}{\norm{\vx_1 - \vx_0}^2}
}
{
\displaystyle
\hphantom{\hspace{3mm}}
\frac{\absb{\vomega_{\vx_0 \vx'_1} \cdot \vec{n}'_1}}{\Prtb{d_o \;/\; \absb{\vomega_{\vx_0 \vx_1} \cdot \vec{n}_0}}^2}
\hphantom{\hspace{3mm}}
}
\frac{d_p^2}{d_o^2} p_A \Prta{\vx_p} \\
&=&
\frac{
\absb{\vomega_{\vx_0 \vx_1} \cdot \vec{n}_1} d_p^2
}
{
\norm{\vx_1 - \vx_0}^2 \absb{\vomega_{\vx_0 \vx_1} \cdot \vec{n}_0}^3
}
p_A \Prta{\vx_p}
\end{eqnarray*}
この式が表していることは、センサーサイズが変わらず( $ = p_A(\vx_p) $ が変わらず)、センサーとレンズの距離 $ d_p $ が近くなれば、画角が広くなるためシーン中の色んな点をサンプルするようになり、$ \vx_1 $ の確率密度の値は小さくなります。また $ \vx_1 $ がレンズから離れる場合、法線が傾きを持つ場合にも小さくなります。(分母のcos成分の3乗をすっきり説明する方法がパッと思い浮かばない...)
なお、この式より方向に関しての確率密度を求めると次のようになります。
\begin{eqnarray*}
p_\sigma (\vx_0 \RAR \vx_1) &=& \frac{p_A(\vx_1) \absb{\vomega_{\vx_0 \vx_1} \cdot \vec{n}_0}}{G(\vx_1 \LRAR \vx_0)} \\
&=& \frac{d_p^2}{\absb{\vomega_{\vx_0 \vx_1} \cdot \vec{n}_0}^3} p_A(\vx_p)
\end{eqnarray*}
注意点として、ピクセルごとにサンプリングを行っている場合は画素数に応じて $ p_A(\vx_p) $ が大きくなります。同じセンサーサイズで画素数が増えると $ p_A(\vx_p) $ は大きくなるので、モンテカルロ積分の推定値は逆に小さくなります。これはピクセルあたり受ける光の量が減るので自然なことです。