♦ 第100630版 (x64jp x64en x86jp x86en)
ボリュームフォトンマップの近傍フォトン数を(ストアされたフォトン数)0.38に変更。
フォトンの放出数のデフォルト値を4194304に変更。
ボリュームの設定ダイアログで位相関数の入力ができないことがあるバグを修正。
change: internal parameters.
fix: gui.
♦ 第100626版 (x64jp x64en x86jp x86en)
フォトン密度推定で0 divideが発生する可能性のあるバグを修正。
libtiffのバージョンを3.9.4にアップ。
fix: photon density estimation.
improvement: libtiff.
♦ 第100616版 (x64jp x64en x86jp x86en)
レンダリングパラメータ"Radiance Threshold"に対応するコマンドラインオプション"/rthreshold"追加。
addition: command line option.
以下のように/rthresholdオプションを使うことで、コマンドライン上で"Radiance Threshold"を入力できます。
> vidro scene.vdr /run /rthreshold=0.03
♦ 第100615版 (x64jp x64en x86jp x86en)
レンダリングパラメータ"Radiance Threshold"(放射輝度の閾値)追加。
addition: rendering paramter.
今まで内部パラメータで定数決め打ちにしていたものをユーザに公開するようにしました。
レンダリングパラメータ"Radiance Threshold"は近傍フォトンの最大探索半径を決定する為の値で、放射輝度の許容エラー量です。
詳細は"A Practical Guide to Global Illumination using Photon Mapping"のsection 5.2、
もしくは"High Quality Rendering using Ray Tracing and Photon Mapping"の70頁を参照して下さい。
このパラメータが小さいほど最大探索半径が大きくなり、このパラメータが大きいほど最大探索半径が小さくなります。
最大探索半径が小さくなると、計算時間が短くなり、影の境界がシャープになりますが、斑が出やすくなります。
放射輝度の大きさで入力するので、実際に画面に現れるエラーの大きさは露出値に比例します。
従って、露出の大きな設定でレンダリングする場合はこのパラメータを小さくし、
露出が大きな設定でレンダリングする場合はこのパラメータを大きくすると効率よくレンダリングできます。
初期値は0.05で、露出を1.0と仮定した値となっています。
自動露出を使う場合は初期値が適切でない事があるので注意して下さい。
♦ 第100613版 (x64jp x64en x86jp x86en)
ボリュームレンダリングで0 divideが発生するバグを修正。
コースティクスフォトンマップの近傍フォトン数を(ストアされたフォトン数)0.35に変更。
ボリュームフォトンマップの近傍フォトン数を(ストアされたフォトン数)0.40に変更。
fix: volume rendering.
change: internal parameters.
♦ 第100612版 (x64jp x64en x86jp x86en)
レイのウェイトに応じてBeam Radiance Estimateの探索領域を変えるようにした。
improvement: beam radiance estimate.
![]() version 100611 38.6 secs |
![]() version 100612 33.1 secs |
完全鏡面体が存在するシーン、パーティシペイティングメディアの散乱係数が小さいシーン、
あるいはオーバーサンプル数が多い設定でレンダリングした場合に差が出ます。
♦ 第100611版 (x64jp x64en x86jp x86en)
ポリゴンの裏面から放出されるフォトンが正しくサンプリングされないバグを修正。
パーティシペイティングメディア内に点光源が存在するシーンで、0 divideが発生するバグを修正。
fix: photon emission.
fix: point lights in participatng media.
♦ 第100610版 (x64jp x64en x86jp x86en)
ボリュームフォトントレーシング中に落ちるバグを修正。
拡散反射後のレイにおいて、Beam Radiance Estimateの探索領域を確率的に決めるようにした。
fix: volume photon tracing.
improvement: beam radiance estimate.
拡散反射後のBeam Radiance Estimateが遅いので
とりあえず探索半径を小さくするという付け焼刃的対策を今までとっていましたが
あまり速くならないので探索距離を短くするようにしました。
Beamの始点t0と終点t1は以下の式で求めます。
t0 = f(max(ξ(1 + u) - u, 0))
t1 = f(min(ξ(1 + u), 1 - ε))
関数f(x)はボリュームの確率密度関数(透過率×散乱係数)の累積分布関数の逆関数。
ξは一様乱数。uはBeamの長さを制御する値。εは十分に小さな定数。
上記の領域[t0, t1]を使って放射輝度を推定する場合、フォトンのパワーに次の値wを乗算します。
w = (1 + u)/u
とりあえず拡散反射後のレイにおいて w = 近傍フォトン数 になるようにuを決めるようにしました。
拡散反射後は疎なフォトンマップを用いるのが真っ当なやり方な気がしますが、
上記の方法だったら個々のレイのウェイトに応じてBeamの長さ(コスト)を変えたり出来るので、うまく使えば柔軟性が上がるかもしれません。
♦ 第100605版 (x64jp x64en x86jp x86en)
コースティクスフォトンマップの近傍フォトン数を(ストアされたフォトン数)0.38に変更。
ボリュームフォトンマップの近傍フォトン数を(ストアされたフォトン数)0.42に変更。
change: internal parameters.
密度推定に使う近傍フォトン数を少し減らしました。
近傍フォトンの数が少ないとボケ難くなり、計算時間も短くなりますが、代りに斑が出やすくなります。
レンダリング結果に斑が出るようならフォトンのサンプル数を増やすようにして下さい。
♦ 第100604版 (x64jp x64en x86jp x86en)
透過面で0 divideが発生するバグを修正。
fix: transparency.
♦ 第100602版 (x64jp x64en x86jp x86en)
透過面で0 divideが発生するバグを修正。
平行光源が入力時にオブジェクトが存在しないと0 divideが発生するバグを修正。
Beam Radiance Estimateをチューニング。
fix: transparency.
fix: parallel lights.
improvement: beam radiance estimate.
♦ 第100531版 (x64jp x64en x86jp x86en)
平行光源が正しく構築されないことがあるバグを修正。
平行光源から放出されるフォトンのサンプリングを改良。
fix: parallel lights.
improvement: photon emission.
♦ 第100530版 (x64jp x64en x86jp x86en)
第100520版以降において、コマンドラインで実行したとき、パラメータ"Over Sampling"の値が不正になるバグを修正。
fix: cui.
♦ 第100529版 (x64jp x64en x86jp x86en)
平行光源から放出されたコースティクスフォトンが遮蔽物をすり抜けることがあるバグを修正。
平行光源から放出されるフォトンのサンプリングを改良。
fix: photon emission.
improvement: photon emission.
第100527版で点光源にやったことと同じように、
平行光源もバウンディングボックスを使ってなるべくサンプリングの領域が小さくなるようにしました。
♦ 第100528版 (x64jp x64en x86jp x86en)
第100527版で点光源から放出されるフォトンが正しくサンプリングされないバグを修正。
fix: photon emission.
♦ 第100527版 (x64jp x64en x86jp x86en)
点光源から放出されるフォトンのサンプリングを改良。
improvement: photon emission.
vidroでは、点光源からフォトンを放出する際、
光源からターゲットのオブジェクトへ向けたバウンディングコーンを作り、
そのコーン内の方向をサンプリングしています。
このコーンは、バウンディングスフィアを用いて作られていましたが、
今回からバウンディングボックスも用いてなるべく領域が狭く作られるようにしました。
♦ 第100520版 (x64jp x64en x86jp x86en)
エリアライトのサンプリングを変更。
change: sampling of area lights.
今まで、スカイライトの輝度に比べて弱い発光をするオブジェクトは
シャドウレイやフォトンをサンプリングする対象から外してパスだけで計算していましたが、
今回から全ての発光するオブジェクトがシャドウレイやフォトンのサンプリング対象になるようにしました。
ただ、これだと弱く発光するオブジェクトしかない場合で効率が悪いので
オブジェクトがスカイライトに比べて弱い発光しかしないシーンでは、サンプル数の初期値を0にするようにしました。
逆にスカイライトを用いながら暗い室内のシーン等をレンダリングする場合は
デフォルトだとノイズが出ると思うのでサンプル数を自分で増やすようにして下さい。
♦ 第100519版 (x64jp x64en x86jp x86en)
オブジェクト読み込み時の頂点法線を求める計算で、浮動小数点の精度不足によって0 divideが発生するバグを修正。
fix: loader.
♦ 第100518版 (x64jp x64en x86jp x86en)
エリアライトのコースティクスが正しく計算されないバグを修正。
fix: caustics.
♦ 第100516版 (x64jp x64en x86jp x86en)
レンダリングパラメータ"Global Illumination"のデフォルト値を1024に増やした。
change: default rendering parameters.
♦ 第100515版 (x64jp x64en x86jp x86en)
コースティクスの近傍フォトンの数を(ストアされたフォトン数)0.4に変更。
フォトンの放射回数のデフォルト値を2097152に増やした。
change: internal parameters.
change: default rendering parameters.

reference image
![]() version 100512 emitted photons: 1048576 total rendering time: 32.8 secs |
![]() version 100515 emitted photons: 2097152 total rendering time: 31.0 secs |
コースティクスフォトンは次元が低いので割と綺麗に層化されますし、MISも効くので
近傍フォトンの数は多くなくても良さそうです。
♦ 第100512版 (x64jp x64en x86jp x86en)
ボリュームレンダリングで0 divideが発生するバグを修正。
fix: volume rendering.
♦ 第100511版 (x64jp x64en x86jp x86en)
内部パラメータ調整。
change: internal parameters.
♦ 第100510版 (x64jp x64en x86jp x86en)
パーティシペイティングメディア内に点光源が存在するシーンにおいて、浮動小数点の精度不足により不正な値が出力されるバグを修正。
fix: volume rendering.
♦ 第100509版 (x64jp x64en x86jp x86en)
コマンドラインオプション"/bg"で背景を指定したときに反映されないバグを修正。
fix: command line option.
♦ 第100508版 (x64jp x64en x86jp x86en)
レンダリングの画質パラメータ"Point Light"を"Global Illumination"に統合。
change: rendering parameters.
♦ 第100507版 (x64jp x64en x86jp x86en)
内部パラメータ調整。
change: internal parameters.
♦ 第100429版 (x64jp x64en x86jp x86en)
ボリュームの消滅係数が0より大きく、アルベドが0のとき、輪郭線が正しく描かれないバグを修正。
FBX SDKのバージョンを2011.2にアップ。
fix: contour.
improvement: fbx sdk.
♦ 第100405版 (x64jp x64en x86jp x86en)
テクスチャ等のパスにおいて、'/'を'\'に変換するようにした。
fix: path.
PathCombine関数等は、ディレクトリの区切り文字が'\'しか対応してないので
'/'は'\'に変換するようにしました。
♦ 第100318版 (x64jp x64en x86jp x86en)
kd-tree構築で無限ループに陥るバグを修正。
fix: kd-tree construction.
♦ 第100311版 (x64jp x64en x86jp x86en)
ボリュームフォトンの近傍フォトン数を減らした。
change: number of nearest neighbor volume photons.
ボリュームフォトンの方も、近傍フォトンの数を(ストアされたフォトン数)0.45にしました。
♦ 第100310版 (x64jp x64en x86jp x86en)
フォトンの放出処理で浮動小数点の誤差によって不正なメモリアクセスが発生するバグを修正。
fix: photon emission.
♦ 第100309版 (x64jp x64en x86jp x86en)
エリアライトからコースティクスフォトンが正しく放出されないバグを修正。
コースティスクスの近傍フォトン数を減らした。
fix: photon emission.
change: number of nearest neighbor caustics photons.
vidroでは密度推定に用いる近傍フォトンの数を(ストアされたフォトン数)βで決定しています。
βは0~1のパラメータで、今までβ=0.5にしてましたが、少し多すぎるみたいなのでβ=0.45にしました。
密度推定の結果が若干シャープになってます。
♦ 第100307版 (x64jp x64en x86jp x86en)
浮動小数点の誤差によって0 divideが発生するバグを修正
fix: 0 divide.
♦ 第100302版 (x64jp x64en x86jp x86en)
64bit版で凹ポリゴンの三角形化を行わないようにした
change: LWO Loader.
LWOファイルの凹ポリゴンの三角形化はD-Stormで配布しているライブラリを使ってるんですが、
ここでヒープ破壊が起きているようなので三角形化を行わないようにしました。
凹ポリゴンは事前にモデラ側で凸ポリゴンにしてからvidroに入力するようにして下さい。
♦ 第100226版 (x64jp x64en x86jp x86en)
平行投影における斜投影で、画角が正しく計算されないバグを修正。
斜投影の値をGUI上で入力できるようにした。
fix: oblique projection.
addition: gui.
♦ 第100225版 (x64jp x64en x86jp x86en)
VDRフォーマットのEyeチャンクに斜投影を制御するパラメータ"Oblique"を追加。
addition: oblique projection.

Cabinet Projection
"Oblique X Y"で斜投影の横軸方向の強さXと縦軸方向の強さYを指定します。
斜投影の角度をθ、奥行きの縮尺をαとするとき、X,Yは以下の式で表されます。
X = αcosθ
Y = αsinθ
従って、例えばキャビネット投影法(θ=45°,α=0.5)を用いたい場合、
投影法のタイプをOrthogonal(平行投影)にし、以下のように記述します。
Oblique 0.353553391 0.353553391
また、キャバリエ投影法(θ=45°,α=1.0)の場合では、
投影法のタイプをOrthogonal(平行投影)にし、以下のように記述します。
Oblique 0.707106781 0.707106781
♦ 第100224版 (x64jp x64en x86jp x86en)
投影面とレンズのティルトにクォータニオンを使うようにした。
improvement: tilt.
![]() FilmTilt 0° 0° |
![]() FilmTilt 30° 30° |
♦ 第100223版 (x64jp x64en x86jp x86en)
32bit版において、浮動小数点の精度誤差によって点光源から放出されるフォトンのサンプリングに失敗するバグを修正。
fix: photon emission.
♦ 第100215版 (x64jp x64en x86jp x86en)
"On building fast kd-Trees for Ray Tracing, and on doing that in O(N log N)"を実装。
improvement: kd-tree construction.
![]() version 100214 37.7 secs |
![]() version 100215 29.6 secs |
今までボクセルの中央でぶった切るという単純なkd-treeだったんですが、あまり良くないのでSAHで構築するようにしました。
フォトンを使わないシーンでは20~30%速くレンダリングできるようになってます。
あと、中央で切る場合は構築時間が短かったのでシーンのロードと同時に構築してたんですが、
SAHだと少し時間が掛かるので、最初のレンダリングの直前に構築するように変更しました。
最初にオーバーヘッドが数秒かかりますが、サンプル数が多い場合はトータルで速くなります。
一応、浮動小数点の誤差を考慮したりしながら気をつけて実装したつもりですが
ポリゴンがかけるとか構築中に落ちるとかいった問題を見つけた方は連絡頂けると助かります。
♦ 第100214版 (x64jp x64en x86jp x86en)
32bit版において3DSファイルの読み込みで落ちるバグを修正。
fix: 3ds loader.
♦ 第100212版 (x64jp x64en x86jp x86en)
Emissionの分布マップの読み込みでエラーが発生するバグを修正。
fix: emission.
♦ 第100129版 (x64jp x64en x86jp x86en)
[アートスタイル(A)]->[照明]の仕様を変更。
[アートスタイル(A)]を[表示(V)]に名称変更。
change: gui.
♦ 第100128版 (x64jp x64en x86jp x86en)
HDRファイルの読み込みを修正。
fix: hdr loader.
今まではヘッダが"#?RADIANCE"でなければHDRファイルとして認識しないようにしてましたが
"#?RGBE"の場合でも読み込みを許可するようにしました。
今まで読めなかった幾つかのHDRファイルが読めるようになってると思います。
♦ 第100127版 (x64jp x64en x86jp x86en)
反射率、照明、発光を個別に表示できるようにした。
change: art style.
[メニュー]->[アートスタイル]でそれぞれ表示できます。
(最終画像)=(反射率)×(照明)+(発光)になります。
他の画像処理ソフトでポストプロセッシングをする場合に、各画像を保存して使って下さい。
♦ 第100126版 (x64jp x64en x86jp x86en)
アートスタイル"マテリアルカラー"の仕様を変更。
change: art style.
今まで"マテリアルカラー"は(発光放射輝度)+(垂直入射時の反射率)でしたが、(発光放射輝度)+(反射率)にしました。
鈍い鏡面反射の場合に入射角依存で色が変わります。
あと今回の更新とは関係無いですが64bit版は上手くLWOが読めないみたいです。
LWOの読み込みにやたら時間がかかったり失敗したりする人は32bit版を試してみて下さい。
♦ 第100122版 (x64jp x64en x86jp x86en)
コマンドラインオプションに"/exposure", "/exposure_img"追加。
addition: command line options.
"/exposure"で露出値を、"/exposure_img"で露出画像をそれぞれ指定をします。
"/exposure"は、"/ae=false"で自動露出をオフにしないと実質機能しません。
♦ 第100121版 (x64jp x64en x86jp x86en)
間接照明が正しく計算されないバグを修正。
fix: indirect light.
♦ 第100120版 (x64jp x64en x86jp x86en)
サンプリングをチューニング。
improvement: sampling.
♦ 第100115版 (x64jp x64en x86jp x86en)
レンダリングの画質の設定で、大域照明パラメータに0を指定すると不正な処理が発生するバグを修正。
鈍い鏡面反射にKelemen & Szirmay-KalosのGeometric termを使うようにした。
fix: rendering parameter.
change: glossy specular model.
![]() Ashikhmin |
![]() Kelemen & Szirmay-Kalos |
"A Microfacet Based Coupled Specular-Matte BRDF Model with Importance Sampling"で提案されているGeometric Termを使うことにしました。
これは比較的物理的な挙動に近いCook-TorranceモデルのGeometric Termを近似したものです。
Cook-TorranceモデルのGeometric Termは以下の式で表されます。
G/(4(N⋅ωi)(N⋅ωo))
Nは法線、ωiは入射方向、ωoは出射方向。
Gは以下の式で表されるGeometric Factorです。
G = min{2(N⋅H)(N⋅ωi)/((H⋅ωo)), 2(N⋅H)(N⋅ωo)/((H⋅ωi)), 1}
HはωiとωoのHalf Vectorです。
Kelemen & Szirmay-KalosはこのGeometric Termを以下のように近似しています。
1/(4(H⋅ωi)2)
とてもシンプルです。
ちなみに、vidroが今まで採用していたAshkhminの鏡面反射モデルのGeometric Termは以下の式です。
1/(4(H⋅ωi)max(N⋅ωi, N⋅ωo))
AshikhminモデルよりKelemen & Szirmay-Kalosモデルの方が暗くなり難いようです。
ただ、Ashikhminモデルだとインポータンスサンプリングしたときにウェイトが1を超えることがないんですが、
Kelemen & Szirmay-Kalosモデルでは超えることがあるので
ロシアンルーレットする場合は気をつける必要があります。
♦ 第100113版 (x64jp x86jp)
自動露出をデフォルトにした。
change: exposure.
マニュアル露出にしたい場合はコマンドラインで"/ae=false"オプションを指定するか、
GUI上で[メニュー]->[アートスタイル(A)]->[露出...]を開いて、[自動露出]のチェックを外して下さい。
♦ 第100112版 (x64jp x64en x86jp x86en)
自動露出を改良。
improvement: auto exposure.

Default Exposure

Auto Exposure
輝度の平均だけ使って露出を決めると、明暗差の大きな画像では白飛びしやすいので
分散も使って露出を制御するようにしました。
今の所、以下の式を使って露出値Eを決めてます。
E = max(1/h, min(0.5/e, max(α/e, 1/(e + β*σ))))
hは輝度の最大値、eは輝度の平均値、σ2が輝度の分散。
αとβはヒューリスティックなパラメータで、今の所α=0.18, β=2.0にしています。
とりあえず上記の方法で露出を決めるようにしましたが、
簡単でもっと良い露出の決め方を知ってる人がいたら教えて下さい。
♦ 第100111版 (x64jp x86jp)
自動露出を改良。
improvement: auto exposure.
♦ 第100110版 (x64jp x64en x86jp x86en)
コマンドラインオプションに自動露出を指定する"/ae"を追加。
addition: command line option.
コマンドラインで"/ae"もしくは"/ae=true"を指定すると自動露出になります。
また、"/ae=false"でマニュアル露出になります。
"/ae=false"は、現在デフォルトでマニュアル露出なので意味はないんですが、
将来、自動露出がデフォルトになった場合の為に用意してあります。
♦ 第100109版 (x64jp x64en x86jp x86en)
0 divideが発生するバグを修正。
AE(自動露出)を追加。
fix: 0 divide.
addition: auto exposure.
AEを有効にするには、[メニュー]->[アートスタイル(A)]->[露出...]でExposure Dialogを開き、
[自動露出]にチェックを入れて[OK]を押します。
これで出力画像の明るさに応じて自動的に露出の値が決まります。
良い絵を作るには微調整が必要だと思いますが、
入力シーンの明るさに依存せずにまともに見られる画像が出来るので少し便利になったと思います。
♦ 第100108版 (x64jp x86jp)
フォトンとシャドウレイを使うべき面光源か否かの判定を変更。
change: area light.
今までは露出が1を仮定して、フォトンとシャドウレイを使うべき面光源かどうかを自動判定してましたが、
露出に依存するのは良くないので、マテリアルの発光放射輝度がスカイライトや平行光源と比べて十分に大きい場合に
フォトンとシャドウレイを使うようにしました。
スカイライトや平行光源が存在しない場合、発光するマテリアルは全てフォトンとシャドウレイが使われます。
シーン全体のオブジェクトが淡く発光する場合は効率が悪くなるかもしれません。
♦ 第100105版 (x64jp x64en x86jp x86en)
拡散反射の反射率を1以上に出来るようにした。
improvement: diffuse reflection.
![]() diffuse reflectance: 0.5 |
![]() diffuse reflectance: 1.2 |
反射率が1より大きな物体は、多分現実には存在しないと思うんですが
面白いので入力できるようにしました。
通常暗くなる壁の隅のような場所では、反射率が1を超える物体だと逆に明るくなります。
ただし、全て反射率が1以上の壁で囲まれた室内なんかでは
光が無限に増幅していって計算が収束しないので、入力する際は注意して下さい。
♦ 第100104版 (x86jp x86en)
スタックメモリの使用量を抑えた。
オーバーサンプル数が多い場合でも、ウェイトの小さな鏡像の輪郭線を描ける様にした。
リファクタリング & コードチューニング。
improvement: stack size.
improvement: contour.
improvement: refactoring & code tuning.
vidroでは反射・屈折によってレイが分岐する際、どちらかのレイをスタックに積んで、
もう一方を先に処理する、という深さ優先探索をやってるんですが、
今までは、分岐の数が結構多い事を想定してスタック用の領域を馬鹿みたいに確保してました。
でも良く考えたら、ウェイトの小さなレイはロシアンルーレットでレイを分岐させないようにしてたので、
分岐の際は、ウェイトの大きなレイをスタックに積み、小さなレイを先に処理するようにして
必要なスタックサイズを小さくしました。