環境設定

パラメータの類が随分増えてきたためいい加減ハードコーディングが辛くなってきた。
ということで外部からの入力をできるよう思案。
テキストファイルでも作ればそれで終わりだけど味気ない。
業務では MSExcel なので VBA でちゃちゃっと書けるんだけど生憎私用では OpenOffice なので
若干苦戦。

まぁシンプルでいいんじゃなかろうか。

Depth of field その2

実際の被写界深度範囲を考慮し色々確認を行った。

ピント位置:モデルよりも手前 → 全てボケる(後ろボケ)

ピント位置:モデル中央 → 全て合焦する

ピント位置:モデル中央より若干後ろ → 手前がボケる(手前ボケ)

ピント位置:モデル後方より若干後ろ → 全てボケる(手前ボケ)

ピント位置:無限遠 → 全てボケる(手前ボケ)

サンプル数が圧倒的に少ないため絵面としてはイマイチだけど
被写界深度効果は働いているようだったので一安心。
ボケるボケないは位置関係に依存するため無限遠で全てボケるというのはシーン次第。

Depth of field

簡易レンズモデルを実装。
レンズ関連のパラメータとして下記を利用。
・絞り値
焦点距離
・ピント位置
・レンズ口径


ピント位置が 3つの球より手前

ピント位置が 3つの球より若干手前

ピント位置が 手前の球付近

ピント位置が 真ん中〜奥の球付近

後方被写界深度より遠方にある場合は結構ボケてるが
前方被写界深度より手前にある場合はボケが弱いな、、、

レイトレ自体大概だけど分散レイトレは力任せの極みだ(汗
レンズの口径も影響するので射出する光線の数が恐ろしい。

MCPTその4

Lafortune の修正 Phone モデルを実装。
データ任せなので絵面が悪いが、、、


最大深度:3
サンプリング数:100
下図は直接照明の拡散反射項をオフ

鏡面反射項を入れたためロシアンルーレットでは更にサンプル数を増やさないとダメな予感。

3DS ファイルの読み込み

C:Load3DS
The Graphics File Format Page

この辺が参考になった。
かなり深い部分まで解析(特にマテリアルチャンク)している。
座標の単位が良く分からなかったが多分 cm 単位なんだろう。

早速実装してみた。


デザインセンスはないのでフリー素材を物色。
基本的にテクスチャがないモデルというのは少なくマテリアル設定は
色分け程度なものが多かったので探すのが大変だった。

法線の平滑化は時間がなかったのでとりあえず面法線を、、、
真面目にやると結構時間が掛かる部分。
3DS の場合はスムーシンググループである程度制御するようだが
スムーシングアングルとかのパラメータは見つからなかった。

この辺、面倒な時は足して正規化などが常套手段なんだけど
やっぱり同じ向きは除外するなどしないといけないだろうなぁ。

また考えておこう。

    • -

重複法線の除外は置いておいて、スムージングアングルとグループは
割と簡単に実装できるので済ませておいた。

なんだかんだで色々やっちゃってキリがないなぁ。
テクスチャ読み込みは今はやめておこう。
さすがに環境光と拡散光、自己発光だけでは少々飽きてきたので
コア部分に戻るとするかな。

空間分割その3

kd-tree を実装してみたのでお楽しみの速度比較。

最大深度: 3
サンプリング回数:500

通常

レンダリング時間:71129ms

Kd-tree

レンダリング時間:50245ms

およそ 20秒近くの高速化。
3割りくらいかな。

サンプリング数と二次レイが増加する程もっと顕著な差が出てくるはず。

予想外だったのはシーンによっては分断面を共有するプリミティブが多く
kd-tree の分割が全くされないケースや共有されるが故に余分なメモリ消費が発生。
コーネルボックスぽいのではまったく分割されないため、状況によっては kd-tree の方が
遅い結果になってしまった。

とりあえず落ち着いたので色々なシーンで試してみたいところ。
いい加減ハードコーディングしたシーンも面倒なので外部から読み込めるようにしておくべきか。
3DS ファイルあたりにでも対応してみることにしよう。

空間分割その2

前回 Octree で実装しようと考えていたがやはり無駄が多い気がした。
一方 BSP では分割が発生することと何よりも三角形以外(たとえば球)が
扱えないことが不便と気づく。
kdtree は形状を上手く扱えるかで若干悩んでいたが良いアプローチを
見つけたので kdtree で実装することにした。

Heuristic Ray Shooting Algorithms

構築とトラバース部分の実装を終えたところで力尽きる、、、

残りは三角形と AABB との交差判定を実装すれば動作するはずだが
この交差判定も中々厄介な部分で停滞中。