このページはレイトレ合宿2!!のアドベントカレンダー3週目の記事として制作しました。
みなさんこんにちは!shockerです。私がレイトレに手をつけ始めた頃に気になったこととして、「レイが光源にヒットした時に、関数の返り値として適当な定数の放射輝度を返している実装が多いけど、この場合の総出力って??」「逆に出力をユーザーが与えたときの放射輝度は?」というのがありました。このページでは光源の出力と放射輝度の関係について解説してみます。重積分がでてきますが、大したことはないはずです。というか物理ベースなレイトレをやる以上積分は絶対に避けられない概念ですね。
それではよろしくお願いします。
レイトレーシングで光源にレイがヒットした場合、光源の出力と配光分布(光源から出る光の強さの方向的な分布)に対応した放射輝度を計算・取得する必要があります。写実的なレンダリングにおいては現実と同じシーン設定(物体の反射率や光源のワット数など)を与えて結果を得ることを目指すと思いますが、その際に必要となるかもしれません。このページではいくつかの光源タイプの出力と放射輝度の関係について解説します。
多くの身近な光源は基本的には面光源と言えるでしょう。蛍光灯は放電のプロセスを経て蛍光物質がある面積を持って光ります。あなたが今見ている液晶ディスプレイも面積を持った光源です。
面光源の出力(ワット数) $ P $ は放射輝度 $ L_e(\vx, \vomega) $ を方向成分で積分、さらに光源面全体にわたって位置に関しても積分することで求まります。 具体的には次の式で表されます。 \begin{equation} P = \int_{\mathcal{M}_L} \int_{\mathcal{H}^2} L_e(\vx, \vomega) \absb{\vomega \! \cdot \vec{n}} \d\vomega \d A(\vx) \label{eq:Watt_integral} \end{equation} ここで、積分領域 $ \mathcal{M}_L $ は光源の面積、$ \mathcal{H}^2 $ は光源上の各点 $ \vx $ における半球の立体角、$ \vec{n} $ は $ \vx $ における法線を表しています。cos項(内積)は「放射輝度」や「レンダリング方程式1」で解説したように、放射輝度を実際の放射束量に変換するために必要です。
それでは式 $ \eqref{eq:Watt_integral} $ を使って実践的に所望の出力、配向分布を持つ光源を考えてみましょう。光源の出力を $ 100 [\mathrm{W}] $、形状は $ 10 [\mathrm{cm}] \times 5 [\mathrm{cm}] $ の長方形、簡単のために各点における光の放出量は一様とし、配光分布は面の垂直方向に強めに出るcos分布としましょう。これより放射輝度 $ L_e $ は次のように表されます。
\begin{equation*}
L_e(\vx, \vomega) = k \cos{\theta}
\end{equation*}
この放射輝度を式 $ \eqref{eq:Watt_integral} $ に従って積分すれば $ 100 [\mathrm{W}] $ になるはずですが、配光分布だけを表したものを積分しても目的の出力にはならないので、係数 $ k $ によって調整します。
それでは解いてみます。
\begin{eqnarray*}
100 &=& \int_{0}^{0.1} \int_{0}^{0.05} \int_{0}^{2\pi} \int_{0}^{\frac{\pi}{2}}
k \cos{\theta} \cos{\theta} \sin{\theta} \d\theta \d\phi \d u \d v \\
&=& 0.01\pi k \int_{0}^{\frac{\pi}{2}} \cos^2{\theta} \sin{\theta} \d\theta \\
&=& 0.01\pi k \int_0^1 t^2 \d t = \frac{0.01 \pi}{3} k
\end{eqnarray*}
ここで、$ u $, $ v $ は2つで光源面上の2次元の位置を表しています。2つのcosはそれぞれ配光分布としてのcosと放射輝度を放射束量に変換するcos、sinは立体角に関する積分のヤコビアンですね。これより正規化係数の $ k $ が求まるので、与えられた特性の光源における放射輝度の分布は次式で表されることがわかります。
\begin{equation*}
L_e(\vx, \vomega) = \frac{30000}{\pi} \cos{\theta}
\end{equation*}
なお、光源の出力というのは消費電力では無く光のエネルギーとしてのワット数を表しています(異様に強い光源かもしれませんね...)。レイトレーシングでは、レイが光源にヒットしたときの放射輝度としてこの値を取得すれば良いわけです。RGBレンダリングならばこれが三要素あることになります。まぁRGBは人間の視覚の応答特性も含んでしまっているため単位 $ [\mathrm{W}] $ っていうのはおかしくなりますが、そのあたりはここで説明するには深すぎるので別のページに書きます...
もしかするとCGの世界、特にリアルタイムCGでは最もよく使われるかもしれない点光源についてです。最も単純な光源に見える一方、実は結構曲者で、光輸送を計算する場合には慎重に扱う必要があります。なぜなら点光源は面積を持たない、無限に小さい光源だからです。放射輝度の定義には分母に微小面積が含まれていますが、これでは点光源から出る放射輝度は無限大の値を持ってしまいます。しかし実はこれは自然なことです。点光源を非常に小さい球状光源として考えてみましょう。
半径 $ r[\mathrm{m}] $、出力 $ P[\mathrm{W}] $ の球状光源を考え、簡単のために各点における光の放出量(=放射発散度)は一定とします。この光源上の点 $ \vx $ における放射発散度 $ M $ は次の式で表されます。
\begin{equation*}
M(\vx) = \frac{P}{4\pi r^2}
\end{equation*}
この式は、放射発散度が球の表面積に反比例することを表しており、半径を無限小に近づければ( $ r \to 0 $ )、放射発散度が無限に近づいていくため放射輝度も当然無限へと発散します。
「では光輸送の計算ではどうやって無限の量を扱っているのか?」「そもそも無限に小さくなくとも球状光源が小さければ小さいほど放射輝度の値が大きくなっていって照らされる空間が明るくなるんじゃない?」という疑問が生じるかもしれません。その疑問に対する答えはレンダリング方程式を見ればわかります。「レンダリング方程式2」の3点形式のレンダリング方程式で考えてみましょう。点光源による反射光 $ L_r $ は次の式で表されます。
\begin{equation*}
L_r(\vx \RAR \vx') = \int_{\mathcal{M}_L} f_s(\vx'' \RAR \vx \RAR \vx') L_e(\vx'' \RAR \vx) G(\vx'' \! \LRAR \vx) \d A(\vx'')
\end{equation*}
ここでは点光源からの寄与だけを考えたいので積分区間は全物体表面 $ \mathcal{M} $ ではなく、光源面 $ \mathcal{M}_L $ に絞っています。ここが重要で、点光源の積分区間における大きさ $ \mathcal{M}_L $ はその表面積です。問題の $ L_e \Prta{\vx'' \RAR \vx}$ が分母に持つ、放射輝度が無限大になってしまう要因 $ r^2 $ は積分区間中での有効な範囲とキャンセルされます。結果として点光源による反射光 $ L_r $ は次の式で表されることになります。
\begin{equation*}
L_r(\vx \RAR \vx') = f_s(\vx'' \RAR \vx \RAR \vx') \frac{P}{4\pi} \frac{\absb{\vomega_{\vx'' \vx} \cdot \vec{n}}}{\norm{\vx'' - \vx}^2}
\end{equation*}
全方位に等しく光を放出する場合を考えていますが、そうでない場合も無限大を発生させる要素は必ずキャンセルされるはずです。また、基本形のレンダリング方程式で考えた場合も、点光源が半球上に占める立体角の大きさが $ r^2 $ に比例することになるので同様にキャンセルされます。球状光源がいくら大きさを変えようとも出力が同じなら照らされる空間の明るさもそう変わらないはずです(その場合でも明るさが変わるのは単に光の分布が変わったからです)。
平行光源は太陽光のような強い指向性を持った光源を表現するために使われます。太陽自体は面光源(厳密にはボリューメトリックな光源です)ですが、地球と太陽では約150,000,000kmも離れているため、地球の端から端まで行っても降り注ぐ太陽光の角度は0.005度も変わりません。平行光源に関して出力を考えることはあまり意味を持ちません。何故なら平行光源は非常に遠いところ(というか無限)にあるという仮定の下、対象とする場のあらゆる箇所において同じ強さの光が降り注ぐためです。要するに対象とする場の広さ次第でエネルギー量が変わってしまう訳です。もちろん影/陰となる箇所には光は届きませんが、遮蔽物の無い箇所には同じ量の光が届きます。
レイトレーシングでは平行光源の強さのパラメターとして放射輝度を直接与えたり、光が到来する方向に垂直な面に対する放射照度(発散度)で与えることが多いような気がします。
なお「平行光源」と言った場合、ここで言っている太陽のような光源ではなく、単に指向性が非常に強い有限の大きさを持った光源(現実にそんな光源あるのか知りませんが...)のことを指すことがあるかもしれません。その場合には面光源と同じく出力を考えることにも意味があります。
環境光源は上で説明した平行光源を一般化したような概念です。平行光源と同じく、光源が無限遠にあるという仮定を用います。ただし、あらゆる方向から光が到来します。また無限遠という仮定を用いているため、対象とする場のあらゆる箇所において、遮蔽が無い限り同じ量の光が入射します。光源が無限遠にあれば、位置の違いは無視できるためです。環境光源も平行光源と同様に、具体的な出力を考えることはないでしょう。環境光源の光の分布は半球もしくは全球上で定義され、分布を画像で与えることも多く、そのことをIBL(Image Based Lighting)と呼びます。通常の8bit/256階調の画像では現実の光の強弱を表すにはあまりに分解能が足りないため、HDR(High Dynamic Range)画像が使用されます。ちなみにHDR画像のフォーマットにはOpenEXR(.exr)やRadiance HDR(.hdr)といったものがあります。
レイトレーシングでは、長方形の画像の横軸を方位角 $ \phi $、縦軸を天頂角 $ \theta $ とみなした経度緯度画像(Longitude-Latitude Image)や、立方体内側6面に画像を貼付けて環境光を表現するキューブマップがIBLの画像の与え方としてよく使用されます。環境光源、特にIBLによるライティングはレンダリング画像に圧倒的なリアリティを与えられるのでおすすめです。室内の写真によるIBLもよく見られます。この場合光源が無限遠とみなせるという仮定はほとんど破綻していますが、それでもかなり説得力のある画像が生成できます。