raytrace

lucilleコンパイルしてみた

http://d.hatena.ne.jp/tueda_wolf/20090214/p1 でちょうどgitのリポジトリが紹介されていたので それならば早いということでやってみた。 環境はGentoo Linux。 scons0.97だと AddOption is not defined とかエラーがでるので1.00に sconsをアップグレード …

種型の練習

球の法線計算まで実装することができた。 前回つくりかけのベクターは当初想定していた程度のものは完成。 早速組み込んで使ってみた。 正規化忘れをコンパイル時に検出できるのは悪くない感じ。 C++のエクスプレッションテンプレート(よく知らないw)のよう…

やはりVectorを定義することにした

前回はベクトルを[Floating]で済ますことにしたが気が変わって ベクトルを専用型にすることにした。 正規化されたベクトルをclass型として強制したりするとhaskellっぽいような気がしたので 煩雑なだけかもしれないがやってみる。Vector.hs module Vector wh…

球との交差

球との交差まで実装。 ようやくコーディングが軌道に乗ってきた。 haskellの難しさというか取っ付きの悪さはシンタックスの問題だと思った。 関数型がどうとかモナドが云々という段階に達する前に 括弧の要不要、','の要不要、type constructorとdata constr…

まずは画像出力

http://www.ryanlothian.com/articles/haskell-raytracer に倣って画像出力から。 main=do writeP3 "tmp.ppm" width height (rendering width height) where width=256 height=256 writeP3::String->Int->Int->[RGB24]->IO() writeP3 filepath width height …

バイナリPPMの出力

調べるのにすごい苦労してしまった。 [Word8]がByteStringであることはすぐにわかったのだが Int->Word8の変換方法が見つからなくて難航。 たまたま検索でかかったコード辺からようやく判明した。 toEnumとするとInt->Word8にできるらしい。 リファレンスを…

今度はHaskellでやってみようかと

年末からC++で書いていたRayTracerはマルチスレッド化したときに速度が低下する原因が 突き止められなくて士気が下がってしまった。 Intel TBBでもpthreadでも同じように遅くなるので書き方がよろしくないところがどこかにある。 なんらかの競合が起きている…

pthreadを導入

例によって速度低下orz う〜む。 実装としてはスレッドそれぞれが同じピクセルを弄らないという前提で 一切ロックしないで作った。 レンダリングの条件はオーバーサンプリングなしで通常のレイトレース。 光源はdirectional一個でシーンに鏡面・透明無し。 …

透明と反射を実装

延々とリファクタリングを続けてようやく前進できるようなった。 半歩戻って普通の再帰レイトレースを実装。

mpl実験終了

boost::mpl::listで格納する型を指定できるUniformGridを作って それを使えるように一式書き換える作業が完了。 6割か7割くらいソースを弄るはめになった。 結果から言うと便利なのかどうか微妙。 まだちゃんと測っていないがboost::mpl::for_eachの実行は …

データ構造を模索

UniformGridににいろんな種類の形状を突っ込む方法を模索中。 インターフェースとしてはこんなのがあって、 Shape { result intersect(const Ray &ray); }; 具体的には、TriangleとSphereを格納したい。 ゆくゆくは無限平面とか曲面とかintersect関数が定義…

PathTrace?

年末年始モードを終えて通常モードに復帰。 文献を参考に適当にPathTraceを実装した。 あっているのかわからないがそれっぽいノイズが出現。 ToDo http://tpot.jpn.ph/t-pot/program/97_RayTraceMonteCarlo/index.html 見てやり直す。

ポイントライトとシャドウとマテリアルまで

あと大きさのある光源を実装したらGI的なフェーズに進める。

次のテーマはThe Cornell Box

http://www.graphics.cornell.edu/online/box/ とりあえずマテリアルとエリアライトとシャドウを実装する。

効果が出ない

レイの発射部分をtbb経由に置き換えたのだが どうしても速度が出ない。 tbbでマルチスレッドにした方がだいたい2倍から2.5倍遅い。 その間CPU負荷は2つともほぼ100%になるので待ち合わせが 原因ではないように見える。 そこでgoogle performance toolsでプロ…

レイのサンプリング部をtbbのblocked_range2dで換装してみた。

まずは変更が少なくて済むparallel_forでやってみる。 画素毎のループをファンクタに抽出して必要な変数を持たせてやるだけだったのでさくっと作業は完了。 さっそく実行してみる。モデルはスタンフォードのドラゴン。 // 通常バージョン store: dragon_vrip…

UniformedGrid実装

ようやくUniformedGridの実装に成功。 曖昧な理解では書けないことはないのだが デバッグできないのであった。 UniformedGrid実装に考慮されるべき点で気づいたことをメモ。 まず、グリッドのサイズをどうやって決めるか。 今回は長辺を基準に何分割するかを…

微速前進

UniformedGridはおいといて球を実装してみた。 さすがに簡単だったが、 TinyJSONのany_castで値コピーとリファレンスを間違えてはまったり のちの拡張用に球の入れ物をboost::variantにしたりとかしたので 少し時間がかかった。 作っているうちに設定ファイ…

Uniformed Grid頓挫中

すぐできるかと思ったが意外と厄介。 まだ、2分割以上するとまともに動かないw

directional lightとlambertシェーディングを実装

カメラ位置を変えるのにも再コンパイルという 状況を鑑みて設定ファイルを導入。 ファイルフォーマットは、先日仕込んでおいたboost::spirit のTinyJSONを活用してJSON形式とした。 こんな感じで。 { "view":{ "eye":[0.0, 0.1, 0.8], "angle":30.0 }, "scen…

ぼちぼちレンダラ作成開始

ここのところ少しずつ準備していたレイトレーサが ようやく動作するところまで来た。 Erlangのレイトレースベンチの時に作ったやっつけのものじゃなくて わりとちゃんとしたものを作ろうとしている。 球のみのシーンから始めても良かったのだが むしろ世間の…

レンダラ原型

元ソースを大幅に端折って、交差判定オンリーのレンダラを作ってみた。 とりあえず動いたがありえない遅さ。機能も隠面消去、シェーディング、アンチエイリアシング、空間分割等何にもございません。高速化以前に激しく低速化してしまったorz さっさとC++で…