Vector演算の高速化

レンダラが重いので、SIMDを使ってVectorの演算部分を書き直したのだが・・・。テストしてみると、超遅い。外積を求める演算を100000回させたら、SIMD使って無い方が1ms。でSIMDで書いた奴は15ms・・・。
シャッフルを多用したり、水平演算を噛ましてるのが遅くなってる原因なんだろうか?どの道、使えねえので捨てるか。

他の高速化手法としては、テンプレートを使ったExpression Templateとかが在るようなので、そっちも試してみよう。

初めにやるアレ

何故かハンドアセンブルに興味がわいたので、例のアレをやってみた。

B2 48 B4 02 CD 21 B2 65 CD 21 B2 6C CD 21 B2 6C CD 21 B2 6F CD 21 B2 20 CD 21 B2 57 CD 21 B2 6F CD 21 B2 72 CD 21 B2 6C CD 21 B2 64 CD 21 B2 21 CD 21 CD 20

バイナリエディタからtest.comとかで保存して、コマンドラインから実行すれば表示される。

フォトンマッピング 其の五

幾つか細かいバクを潰したのと、屈折の実装をした。
一番の基本の拡散反射の式が間違っていたらしく、直したらかなり綺麗になった。


一応、集光模様っぽいのが出ている。

しかし、まだ、完全にレンダリング方程式を再現していない。
完全再現のために次は直接照明をやる予定。

フォトンマッピング 其の四

反射を実装した。が、何かノイズがでてる・・・。
特に左の奴はまともに描画すらされていない。

何も考えずに書いていたせいで、クラス間の依存関係が酷くなってきた。書き直したいけど、もう少し頑張ろう。。

フォトンマッピング 其の三

放射輝度推定が出来るようになったので、サクッとレンダリングしてみた。
と言いたいが、超時間掛かった。効率無視のゴリ押しコード書いてたから仕方ないか。
放出フォトン数500000個、放射輝度推定に1000個。

なんか、それっぽくはなったけど全然リアルじゃない。
輝度を計算してるときに、他のオブジェクトのフォトンを拾ったりしてるせいで、床に球の色が混ざってしまっている。部屋の縁に線が出てるし。。
次は鏡面反射を実装する予定。

フォトンマッピング 其の二

フォトンの反射を実装した。と言っても一番簡単な鏡面反射だけだが。
次は光線追跡部分。この辺りは一般的なレイトレと同じようにレイを追跡して計算する。ただフォトンマッピングではレイが衝突したときに、その周りのフォトンを探して輝度の計算を行う。

交差判定をしてピクセルを塗りつぶすとこまでやった。まだべた塗り状態。。

よく使いそうなBRDFはハードコーディングしてもいいんだけど、スクリプトで書けたら楽そうだ。組み込む価値はありそう。

フォトンマッピング 其の一

最近忙しくて趣味のプログラムを書く時間が余りない。
以前からフォトンマッピングのレンダラを作成しているのだが、ようやくフォトンをばら撒いてKDTreeを構成するところまで来た。
といっても、ベクトルの交差判定くらいしかしてないので、まだ先は長い・・・。。

前に書いたレンダラを改造してフォトンを表示してみた。

要であるフォトンのトレース部分だが、反射をまだ実装してないので吸収オンリーである。
まあ、まだ初めだしこんな物だろう。