9. フォトンマッピング


9. フォトンマッピング

フォトンマッピング(photon mapping)は、光の反射や屈折により生じる集光を表現する技術である。フォトンマッピングにより、虫めがねやガラスコップを通過する光がガラスの屈折により生じる集光模様や、鏡や金属による光の反射による集光模様の表現をすることが可能になる。(以前のバージョンではインテリア機能の1部分として、透明体において正確でないが擬似的な集光を表現することしかできなかったが、バージョン3.5ではさらにフォトンマッピングの機能が付加され正確な表現が可能になった。)

フォトンマッピングの設定には次の3つがある。

グローバルなフォトン設定 グローバル設定におけるフォトン設定は、放たれるフォトンの数やフォトン収集範囲や数など、フォトンマッピング全体に関係することを指定する。
物体のフォトン設定 物体におけるフォトン設定では、集光模様を生じさせる原因となる物体を指定したりするなど、各物体に対するフォトンマッピングを指定する。
光源のフォトン設定 光源におけるフォトン設定では、フォトンが発射される光源を指定する。
フォトンマッピングを使用するにはこれらの3つの設定を適切に行う必要がある。


9.1 グローバルなフォトン設定

< photons の構文/グローバル設定>


global_settings {

 photons {

   spacing PHOTON_SPACING | count PHOTONS_TO_SHOOT

   [ gather MIN_GATHER, MAX_GATHER ]

   [ media MAX_STEPS [, FACTOR ] ]

   [ jitter JITTER_AMOUNT ]

   [ max_trace_level PHOTON_TRACE_LEVEL ]

   [ adc_bailout PHTON_ADC_BAILOUT ]

   [ save_file "filename" | load_file "filename" ]

   [ autostop AUTOSTOP_FRACTION ]

   [ expand_thresholds PERCENT_INCREASE, EXPAND_MIN ]

   [ radius GATHER_RADIUS, MULTIPLIER,

           GATHER_RADIUS_MEDIA, MULTIPLIER ]

 }

}  

photons グローバル設定でフォトンマッピングを有効にするキーワード
spacing PHOTON_SPACING フォトン間の距離を指定する。⇒「9.1-1 フォトン間隔」
count PHOTONS_TO_SHOOT フォトン数の指定をする。⇒「9.1-2 フォトン数」
gather MIN_GATHER, MAX_GATHER 各点で収集するフォトンの最大値と最小値を設定する。最小値、最大値を整数で指定する。[デフォルト:gather 20,100 ]であり、通常は変更の必要なし。
media MAX_STEPS [, FACTOR] メディアに対してフォトンを有効にする。MAX_STEPSは、区間あたりに割り当てられるフォトンの最大値の設定である。FACTORは通常のspacingとの比であり、メディアのspacingとなる。[デフォルト:0 ]
jitter JITTER_AMOUNT サンプリングで使用されるゆらぎの量をを設定する。[デフォルト:0.4 ]、通常は変更の必要なし。
max_trace_level PHOTON_TRACE_LEVEL フォトンの最大反射・屈折回数の設定  [デフォルト:5 ] ⇒「4.7 max_trace_level」
adc_bailout PHTON_ADC_BAILOUT 反射・屈折計算の精度の指定  [デフォルト:1/255 ](約0.0039) ⇒「4.1 ADC_bailout」
save_file "filename" フォトンマップを指定名でファイルに保存する。load_fileと同時に使用することはできない。
load_file "filename" フォトンマップを指定ファイルから読み込む。save_fileと同時に使用することはできない。
autostop AUTOSTOP_FRACTION フォトンの発射の自動停止。指定された割合(0.0〜1.0)のフォトンが標的物体に全く当たらないとき、フォトン発射を中止する。1つでも当たるとこの機能は解除される。
expand_thresholds PERCENT_INCREASE, EXPAND_MIN より正確にフォトンを収集するための収集半径の増加割合PERCENT_INCREASE(20%がディフォルト)、この値でもあまりフォトンを収集できないとEXPAND_MIN(40%がディフォルト)で再収集を行う。
radius GATHER_RADIUS, MULTIPLIER, GATHER_RADIUS_MEDIA, MULTIPLIER フォトンの収集半径と半径調整用の乗数、メディア用のフォトンの収集半径と半径調整用の乗数の設定  ⇒「9.1-3 収集半径」

spacingcountはどちらか一方を使用する。同時に両方使用すると、countの設定が優先されて使用される。

load_fileを使用するとフォトンマップが読込まれフォトンマップの作成済みの状態になり、フォトンの発射は全く行われないことに注意する。

※ 重要なことは、すべてのフォトンの最終密度を大体同じ大きさにするということ。ある部分で高密度のフォトンを使用し、他の部分で低密度なフォトンを使用すると、望ましくない斑点模様が発生したりする。フォトン密度に大きい相違があると、シーンのレンダリングに大変な時間がかかる原因になったりする。

※ 各パラメータの設定値により画質が決まる。設定値により計算時間は大幅に異なる。このため計算時間を考慮した場合、最適な設定はシーンと目的により異なり、これが最適値というものを示すことができない。以下に示す主なパラメータと例で設定の参考にしてほしい。


9.1-1 フォトン間隔(spacing)

発射されるフォトン間のおおよその距離を指定する。間隔が短いほどたくさんのフォトンが生成される。この指定により生成フォトン数が異なってくる。一般的にフォトン数が多いと高画質になるが計算時間が長くなる。右図はフォトンの数が少ないため斑点のような模様が発生している例である。

potons { spacing 0.02 } potons { spacing 0.2 }
図9.1-1 フォトン間隔(spacing)による集光の違い


9.1-2 フォトン数(count)

生成するフォトン数を指定する。フォトンが透明体に衝突すると2つに分かれるため、総フォトン数はこの設定値と一致するとは限らない。一般的にフォトン数が多いと高画質になるが計算時間が長くなる。右図はフォトンの数が少ないため集光模様がぼやけたようになっている例である。

potons { count 200000 } potons { count 10000 }
図9.1-2 フォトン数(count)による集光の違い


9.1-3 収集半径(radius)

フォトンを収集するための半径を指定する。省略した場合は、POV-Rayにより適切な半径が自動設定される。右図は、小さい半径(自動設定半径の1%)を指定したため画像にモアレ模様のようなものが発生している例である。

potons { spacing 0.02 } potons { spacing 0.02 radius 0.01 }
図9.1-3 収集半径(radius)による集光の違い


9.2 物体のフォトン設定

< photons の構文/物体設定>


object{

 photons {

   [ target [SPACING_MULTIPLIER ] ]

   [ refraction on|off ]

   [ reflection on|off ]

   [ collect on|off ]

   [ pass_through ]

 }

}

photons
物体設定でフォトンマッピングを有効にするキーワード
target [SPAACING_MULTIPLIER] フォトンを発射の目標となる物体の指定。SPAACING_MULTIPLIERは物体に対するフォトン密度調節を行う。0.5であれば、フォトン間隔は他の物体の1/2となる。⇒「9.2-1 目標物体」
refraction on|off 屈折を有効にするスイッチ(その物体に衝突したフォトンが屈折するかしないかの指定) [デフォルト:off ] ⇒「9.2-2 物体フォトン屈折」
reflection on|off 反射を有効にするスイッチ(その物体に衝突したフォトンが反射するかしないかの指定) [デフォルト:off ]
collect on|off 物体にフォトンの収集を指示するスイッチ [デフォルト:on ] ⇒「9.2-3 フォトン収集」
pass_through 物体にフォトンが通り抜けることを指示するスイッチ ⇒「9.2-4 フォトン透過」

※ 目標物体でなければ、通常この物体にフォトン文を記述する必要はない。しかし、フォトンが衝突しないと思われる物体には、correct off を使用し、フォトンの収集をしないようにすると計算時間が速くなる。

※ 透明体(ガラス)の物体には、通常 correct off を使用する。

※ 目標物体と光源それぞれに屈折と反射のスイッチが記述できるが、その物体おけるその光源のフォトンの振る舞いは次のような組み合わせになっている。
物体と光源ともに記述なし---> off 指定となる。
物体にon|offの記述、光源は記述なし---> その物体の指定に従う。
物体は記述なし、光源にon|offの記述---> その光源の指定に従う。
物体と光源のon|offの記述が一致---> その指定に従う。
物体と光源のon|offの記述が不一致 ---> off 指定となる。


9.2-1 目標物体(target)

フォトンが発射される目標となる物体を指定する。指定されることでその物体に対してフォトンが放たれ、その結果、集光模様が発生したりする。この指定がないと、その物体に対してフォトンが発射されない。
次の図9.2.1の画像は、target記述の有無による違いである。左側の画像では両方のリングに target を記述している。右側の画像では、右側リングに記述なし左側リングに記述ありの場合である。

図9.2-1 目標物体(target)指定の有無よる集光の違い

図9.2-1の右図の例)

cylinder{<2,0,0>,<2,0,2>,5 open 

   	texture { T_Gold_1A }

	photons {

         target

          collect off

          reflection on

	 }

  }



cylinder{<-2,0,0>,<-2,0,2>,5 open 

        texture { T_Gold_1A }

        photons {

          collect off

         }

  } 






9.2-2 物体フォトン屈折(refraction)

その物体に衝突したフォトンが屈折するかしないかの指定をする。このスイッチは、透明対の場合にのみ意味がある。ディフォルトは off である。物体にこのスイッチを記述していない場合は、光源のフォトン屈折スイッチの記述があればその指定に従う。


図9.2-2 物体フォトン屈折(refraction)のoff

図9.2-2:図9.1-1において、refraction off を指定した例)


sphere{<0,0,3.2> 3

        material{M_Glass3}   

	photons {

          target

          collect off

          reflection on

          refraction off

	}

}


9.2-3 フォトン収集(collect)

その物体が、輝度計算のためのフォトンを収集するかしないかの指定をする。ディフォルトは on である。一般的には目標物体(target)の指定をしたときは、off でよい。目標物体でない他の物体にこの記述をすると、フォトンの収集を行わないため、その物体上に集光模様は表れなくなる。
次の図9.2-4の画像は、2つの直方体の上にリングが乗っている。左側の画像は直方体にフォトン文を記述していない通常の場合のものである。右側の画像では、手前の直方体にはフォトン文で collect off が指定されておりフォトンの収集が行われなかった。このためリング反射光が表現されていない。

図9.2-3 フォトン収集(collect)有無よる集光の違い

図9.2-3の右側図の例)

box{ <-8,-8,-2> <8,-2.5,0> 

      pigment {color rgb<0.45,0.4,0.2>*2.5}  

    }



box{ <-8,-2,-2> <8,3,0> 

     pigment {color rgb<0.45,0.4,0.2>*2.5} 

     photons { collect off }

   }


9.2-4 フォトン透過(pass_through)

フォトンが目標物体に到達するまでに、途中に物体があるとそれが影になりフォトンが遮られる。pass_through を途中に物体に指定することで、フォトンがその物体を透過するようになる。ただし、目標物体に衝突し反射や屈折をしたフォトンに対しては、この指定は働かない。
フォトンのシーンにおいて no_shadow の指定をすると、no_shadow の本来の機能のほかに、pass_through on の指定が自動的される。このとき no_shadow だけを働かせたいときは、pass_through off の指定をする。

図9.2-4 フォトン透過(pass_through)の有無よる集光の違い

図9.2-4の右側図の例) 影を落としている板である box に記述



box{ <-2,0,0>,<8,6,1>> 

     texture {T_Wood1 scale 3 rotate x*90} 

     photons { pass_through }   

     translate<-5,-3,7>>

 }


9.3 光源のフォトン設定

< photons の構文/光源設定>


light_source {

  photons {

    [ refraction on | off ]

    [ reflection on | off ]

    [ area_light ]

  }

}

photons 光源設定でフォトンマッピングを有効にするキーワード
refraction on|off 屈折を有効にするスイッチ(その光源から放たれるフォトンが、屈折する性質を持つか持たないかの指定) [デフォルト:off ]
reflection on|off 反射を有効にするスイッチ(その光源から放たれるフォトンが、反射する性質を持つか持たないかの指定) [デフォルト:off ]
area_light 面光源を使用したときに記述する。面光源を使用してもこの指定がないと点光源として取り扱われる。 ⇒「9.3-1 面光源」

※ 通常の場合、目標物体に refraction on や reflection on の記述をするので、光源にフォトン文を記述する必要はない。(面光源のみ例外的に記述する必要がある。)特定の光源からのフォトン発射を中止したい場合に、refraction off やreflection off などを記述する。

※ 目標物体と光源それぞれに屈折と反射のスイッチが記述できるが、その物体おけるその光源のフォトンの振る舞いは次のような組み合わせになっている。
物体と光源ともに記述なし---> off 指定となる。
物体にon|offの記述、光源は記述なし---> その物体の指定に従う。
物体は記述なし、光源にon|offの記述---> その光源の指定に従う。
物体と光源のon|offの記述が一致---> その指定に従う。
物体と光源のon|offの記述が不一致 ---> off 指定となる。


9.3-1 面光源(area_light)

フォトンマッピングを面光源で使用するときに記述する。面光源を使用したときにこの記述がないと、面光源は点光源として取り扱われので、点光源の場合同じ集光模様となる。POV-Rayにおいては面光源は点光源の集合による擬似的な光源なので、リアルな映像を得るためには取り扱いに注意する。
example A : グローバル設定/spacing 0.02 面光源/10x10
example B : グローバル設定/spacing 0.02 面光源/3x3
example C : グローバル設定/spacing 0.1 面光源/10x10
example D : グローバル設定/spacing 0.1 面光源/3x3


図9.3-1a 面光源example A


//-----------------exmaple A

 global_settings {

     photons {spacing 0.02 }   

 }



 light_source {

     <-30,20,35> color White

     area_light

       <20,0,0>,<0,20,0> 10,10

     jitter

     photons { area_light }

 }


図9.3-1b 面光源example B


//-----------------exmaple B

 global_settings {

     photons {spacing 0.02 }   

 }



 light_source {

     <-30,20,35> color White

     area_light

       <20,0,0>,<20,20,0> 3,3

     jitter

     photons { area_light }

 }


図9.3-1c 面光源example C


//-----------------exmaple C

 global_settings {

     photons {spacing 0.1 }   

}



 light_source {

     <-30,20,35> color White

     area_light

       <20,0,0>,<0,20,0> 10,10

     jitter

     photons { area_light }

 }


図9.3-1d 面光源example D

//-----------------exmaple D

 global_settings {

     photons {spacing 0.1 }   

 }



 light_source {

     <-30,20,35> color White

     area_light

       <20,0,0>,<0,20,0> 3,3

     jitter

     photons { area_light }

 }