♦ 第100309版 (x64jp x64en x86jp x86en)
エリアライトからコースティクスフォトンが正しく放出されないバグを修正。
近傍フォトン数を減らした。
fix: caustics photon.
change: number of nearest neighbor 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では反射・屈折によってレイが分岐する際、どちらかのレイをスタックに積んで、
もう一方を先に処理する、という深さ優先探索をやってるんですが、
今までは、分岐の数が結構多い事を想定してスタック用の領域を馬鹿みたいに確保してました。
でも良く考えたら、ウェイトの小さなレイはロシアンルーレットでレイを分岐させないようにしてたので、
分岐の際は、ウェイトの大きなレイをスタックに積み、小さなレイを先に処理するようにして
必要なスタックサイズを小さくしました。