kugi's notebook

やったこと、思ったことなどつらつらと書きます

蛍光現象のレンダリング

はじめに

こちらの記事は レイトレ合宿8アドベントカレンダー8週目の記事です。

今回は蛍光現象とそのレンダリング手法について書きたいと思います。

蛍光現象

みなさんは蛍光現象をご存知でしょうか? 遊園地の入場チェックで手にスタンプをされたことのある方やブラックライトで照らすことで浮かび上がるアートなどを見たことがある方もいらっしゃるかもしれません。

蛍光現象とは、蛍光分子がある特定の波長の光を吸収して、その吸収したエネルギーによって別の波長の光を放出する現象のことです。

例えばこちらのTRICKマーカーの水性インクにも蛍光分子が含まれています。

先日購入したTRICKマーカー

それぞれのインクの蛍光分子が、UV LEDの光(紫外線)を吸収して、赤、緑、青と異なる波長の光を放ちます。

室内照明環境下だと見えないが、
ブラックライトを照射すると文字が浮かび上がってくる

蛍光分子にはこのように、吸収する光の波長領域を表す励起スペクトル(Excitaion Spectrum)と放出する光の波長領域を表す蛍光スペクトル(Emission Spectrum)を持ちます。

点線:励起スペクトル、実線:蛍光スペクトル

グラフは蛍光顕微鏡などで用いられる蛍光色素であるAlexa Fluor®抗体の蛍光特性です。

蛍光スペクトルビューアーを使うと選択した蛍光色素の励起スペクトル、蛍光スペクトルを確認でき、励起光を指定して蛍光現象のシミュレーションをグラフ上で行うことができるのでおすすめです。

蛍光現象のさらに詳しい説明は下記を参照してください。

蛍光の基本原理 | Thermo Fisher Scientific - JP

その他の蛍光の例

実は蛍光現象は身近なところにも応用されています。 紫外線を吸収して青白い光を発光させてより服の白さを目立たせるため、洗剤などに使われているようです。

花王 | 製品Q&A | 【成分・働き】蛍光増白剤とは?

また、医学の分野では蛍光色素で細胞を染色して観察する蛍光顕微鏡なども使われています。

蛍光現象と蓄光の違い

蛍光現象と似たものとして、蓄光があります。

フォトルミネセンス(Photoluminescence)という括りでは、蓄光も光を吸収し、そのエネルギーによって光を再放出する過程です。 蓄光の場合は発光の寿命が長く、物質への光照射をやめてからも発光し続けます。

詳しい違いとしては光を吸収した蛍光分子の励起状態が異なるようです。

ヤブロンスキー図
Wikipedia より引用

蛍光 - Wikipedia

ちょうど先日立ち寄った100円ショップに蓄光材質のものが売っていたので買ってみました。

蓄光材質
室内照明で照らしている状態から、照明を消すと発光する

冒頭のTRICKマーカーによる蛍光の場合は暗所でUV LEDライトを用いて照らしていましたが、今回の場合は何も照らしていない状態で発光し続けています。

また、iPhoneのLEDライトで照らした場合とUV LEDライトで照らした場合で比較してみたところUV LEDの方が明るく発光しました。 購入した蓄光素材の詳細な励起特性についてはわかりませんが、より短波長領域の光を吸収するようでした。

蛍光現象の2つの特性

蛍光現象には以下の2つの特性があります。

  • 出射スペクトルと蛍光スペクトルの関係
  • トークスの法則

出射スペクトルと蛍光スペクトルの関係

出射スペクトルは蛍光として放出される光の各波長での強度を表したものです。

また、蛍光分子が蛍光特性として持つ蛍光スペクトルは励起スペクトルにおけるピークでの波長を励起光(吸収する光)とした時の出射スペクトルです。下図の場合、励起光1がピークでの励起光になります。

蛍光スペクトルと出射スペクトル

図のように、異なる波長の励起光が蛍光分子に与えられたとしても、放出される出射スペクトルは蛍光スペクトルの相似形になるという特性があります。

トークスの法則

トークスの法則

トークスの法則は蛍光として放出される光のエネルギーは、吸収されるエネルギーよりも低く、励起光の波長より長波長領域の光になるという法則です。

図の蛍光分子の場合、紫外線(UV LEDライトの光)を吸収して、可視光領域の光が放出されます。UV LEDライトで照らしてヒトの目によって観測できるようになるのはこのためです。

蛍光現象のレンダリング

さて、前置きが長くなってしまいましたが、 ここからは蛍光現象のレンダリング手法について紹介します。

スペクトラルレンダリング

特性からもわかるように、蛍光現象は光の波長に依存した光学現象です。波長依存性の高い光学現象をレンダリングするためには、一般的なRGBレンダリングではなく、波長ごとの値を考慮したスペクトラルレンダリングが必要です。

スペクトラルレンダリングとRGBレンダリング

RGBレンダリングではあらかじめ現実の光のスペクトルを等色関数を用いてRGBに変換し、そのRGBを用いて照明計算を行います。 それに対し、スペクトラルレンダリングでは光のスペクトルからサンプリングされた値を用いて照明計算を行った結果をRGBに変換するため、物理的に正しい光のシミュレーションを行うことができます。

スペクトラルレンダリングについては、shockerさんのページやPenguinさんのレイトレアドベントカレンダー2021の記事がとても参考になります。

スペクトラルレンダリング - Computer Graphics - memoRANDOM

スペクトルレンダリング - Qiita

多重重点的サンプリングを用いた手法

Yamamotoらの手法では、蛍光現象の2つの特性に基づいて、スペクトル強度 I_i(\lambda)の励起光に対する蛍光のスペクトル強度I_o(\lambda)を以下のようにモデル化しています。

  •  I_i(\lambda): 励起光のスペクトル強度
  •  I_o(\lambda): 蛍光のスペクトル強度
  •  E(\lambda): 励起スペクトル
  •  F(\lambda): 蛍光スペクトル
  •  K: 励起に関する係数
  •  \eta: 蛍光の強度を表す係数(  \eta = 2.0 \times 10^{-2} と設定)
 \displaystyle
I_o(\lambda) = KF(\lambda)
 \displaystyle
K = \eta \int_\Lambda E(\lambda)I_i(\lambda) d\lambda

 K における積分モンテカルロ積分を用いて、以下のように計算します。

  •  p(\lambda_j): 波長 \lambda_j がサンプリングされる確率
 \displaystyle
K = \eta \frac{1}{N}\sum_{j = 1}^{N} \frac{E(\lambda_j)I_i(\lambda_j)}{p(\lambda_j)} \Delta \lambda

また、波長をサンプリングする際、光源と蛍光分子の特性に基づいて波長を確率的にサンプリングしています。

  •  p_F(\lambda): 蛍光分子の蛍光スペクトルを考慮したPDF(確率密度関数)
  •  k_{F_t}: 各波長における蛍光スペクトルの値の総和
  •  w_{F_t}: 蛍光分子を含有した物体の面積とを k_{F_t}考慮した重み
 \displaystyle
p_F(\lambda) = \sum_{i = 1}^{N_\lambda} w_{F_t} \frac{F_i(\lambda)}{k_{F_i}}
 \displaystyle
k_{F_t} = \int_{\Lambda} F_i(\lambda) d\lambda

光源のスペクトルを考慮したPDF  p_L(\lambda)についても p_F(\lambda)同様に計算します。

そして最終的に、蛍光スペクトルに対する重み w_Fと光源に対する重み w_Lで重み付けしたPDF  p_{FL}(\lambda)を用いて波長を多重重点的サンプリング(Multiple Importance Sampling)します。

 \displaystyle
p_{FL}(\lambda) = w_F p_F(\lambda) + w_L p_L(\lambda)

Spectral Rendering of Fluorescence using Importance Samplingより引用

レンダリングの際にはPPPM(Probablistic Progressive Photon Mapping)を用いてレンダリングパス毎にフォトン、レイに割り当てる波長をサンプリングしています。

BBRRDFを用いた手法

Alisaらは蛍光と非蛍光の反射を表現するために、物質中に含まれる蛍光分子の含有率を考慮したBBRRDF(Bispectral Bidirectional Reflection and Reradiation Distribution Function)をモデル化しています。

BRDF(双方向反射率分布関数)に対して、BispectralReradiation が追加されているように、位置と方向に加えて、入射時(吸収される光)の波長と出射時(蛍光として放出される光)の波長に依存した関数です。

  •  a(\lambda): 励起スペクトル
  •  e(\lambda): 蛍光スペクトル
  •  r(\lambda): 反射率スペクトル(非蛍光成分)
  •  Q: 蛍光分子の吸収するエネルギーに対して放出するエネルギーの比率
  •  \delta_{\lambda_i, \lambda_o}: 非蛍光成分において入射波長 \lambda_iと出射波長 \lambda_oを切り替えるデルタ関数
  •  f_{fluor}: 蛍光BBRRDF
  •  f_{nonfluor}: 非蛍光BBRDF
 \displaystyle
f_{fluor}(\lambda_i, \omega_i, \omega_o, \lambda_o) = \frac{c a(\lambda_i) Q e(\lambda_o)}{\pi}
 \displaystyle
f_{nonfluor}(\lambda, \omega_i, \omega_o) = \frac{(1 -c) a(\lambda) r(\lambda)}{\pi}

これらを合わせて、BBRRDFは以下のように表現されます。

 \displaystyle
f_r(\lambda_i, \omega_i, \omega_o, \lambda_o) = \frac{\delta_{\lambda_i, \lambda_o} (1 -c a(\lambda_i)) r(\lambda_i) + c a(\lambda_i) Q e(\lambda_o)}{\pi}

 \omega_i,  \omega_oを引数に持つように、入射と出射の方向の観点では相互作用を起こしそうですが、蛍光現象おいてはストークスの法則があるため、一般的に放出された蛍光による相互作用(二次蛍光)は起こりません。

 c, Q, a(\lambda), r(\lambda) [0, 1]の値をとり、 c = 0の場合は非蛍光の完全拡散反射BRDFになります。

波長のサンプリングとしては、以下の2ステップで行っています。

  1. 蛍光現象が発生するかをサンプリングする
  2. 新しい波長をサンプリングする

まず蛍光現象が発生するかについては、光源パスで発生する確率 P_lとカメラパスで発生する確率 P_cによって決定します。

 \displaystyle
P_l = \frac{c a(\lambda_i) Q}{c a(\lambda_i) Q + (1 - c a(\lambda_i))r(\lambda_i)}
 \displaystyle
P_c = \frac{c \int_\Lambda a(\lambda) d\lambda Q e(\lambda_o)}{c \int_\Lambda a(\lambda) d\lambda Q e(\lambda_o)+ (1 - c a(\lambda_o))r(\lambda_o)}

これらの確率は光源パス、カメラパスで反射された(蛍光現象によるエネルギーも含む)エネルギーに対する、蛍光として反射されたエネルギーの割合です。

 P_l の場合は光源から照らされて吸収される入射波長 \lambda_i P_c の場合は蛍光現象によって放出される出射波長 \lambda_oが与えられます。また、 P_lの分母の第1項の蛍光スペクトルの積分 \int_\Lambda e(\lambda) d\lambda = 1 として省略されています。

蛍光現象が発生したと決定した場合は、使用した確率に応じて波長をサンプリングする際に用いるPDFが変わります。

  • 光源パス( P_l): 蛍光スペクトル e(\lambda)をPDFとする
  • カメラパス( P_c): 励起スペクトル a(\lambda)をPDFとする

光源パスの場合は、光源 => 光の吸収 => 励起状態 => 光の放出 => カメラ

また、カメラパスの場合はその逆順の過程を経ることに注意が必要です。

A Simple Diffuse Fluorescent BBRRDF Modelより引用

左図は蛍光物質の球がUVライトによって照らされたシーンです。

右図において、横軸は左端を0、右端を1として吸収したエネルギーに対して放出したエネルギーの比率 Qを表し、縦軸は上段から c = 0, 0.2, 0.4, 0.6, 0.8, 1を表しています。

まとめ

今回は蛍光現象とそのレンダリング手法について紹介しました。 暗闇で仄かに輝く蛍光や燐光かっこいいですよね!

冒頭で紹介した蛍光スペクトラルビューアーは蛍光色素のスペクトルデータを出力したり、グラフを画像として書き出すことも可能です。 ポチポチしているだけでも割と楽しいので気になった方は是非遊んでみてください!

本来は蛍光物質のボリュームレンダリングについても紹介したかったのですが、間に合いそうになかったので今回はここまでにしたいと思います...。

それでは!

参考文献