2006-01-01から1年間の記事一覧

オブジェクトレベルでの空間構造

CG

レイトレーサにおいて、扱う対象が三角形の集合(メッシュ)だけならいいのだが、それ以外にも球や曲面を扱うとすると、シーン全体でひとつの空間分割構造に押しこめてしまうのは無理が出てくる。 ここでは、メッシュや球・曲面などのひとかたまりをオブジェ…

BIH実装

大分前から各所で話題になっていたBIHですが遅ればせながら、実装して試しました。 BIHって用は分割位置が二つあるkdtreeなんですが、ようは内部の三角形を2つの空間に分けるとき適当にどっちかに入れるか決めてしまってその境目は適当にやってしまおうとい…

MemoryPoolについて

MemoryPoolという構造体がある。これは一種のアロケータで、あるサイズ分メモリーをブロックとして確保しておき、それをためて置く。これを必要になったときそれを使用する。Effecient C++にはそんな構造体が載っている。 いくつかの不具合を修正したので、…

クラスを使おう!無名名前空間を利用しよう!

オブジェクト指向言語であるC++においてクラスは基礎的な部品であり、論理構造を抽象化し、ソースコードの見通しを良くしてくれる。 クラスは他の関数ないしクラスのメンバ関数において、実装として局所的に使われるケースがあっても良い。なにもクラスは「…

compositeパターン

compositeパターンは複数のものを単数扱いして複雑な構造への処理を容易に行なえるようにするものだ。この適用範囲は思いのほか広い。これには、『複数のものを単数扱い』というより『単数の出力を複数の出力』とみなすとした方が分かりやすいかもしれない。

例外安全にする基本

例外に対し安全なコードを書く基本 ClassA * p_ClassA = new ClassA(); 【何か】 delete p_ClassA;としてはいけない。

関数の中のstatic変数

static変数は怖い。摩訶不思議。 const char* func(){ static std::string s; s = GetHoge(); return s.c_str(); }を const char* func(){ static std::string s = GetHoge(); return s.c_str(); }にすると期待どうりに動かないだろう。2/24 返り値の型まち…

pimplイディオム

実装をヘッダファイルに書かないためにそのすべてのメンバを実装したクラスへのポインタのみをメンバにもつことをpimpl*1イディオムと呼ぶ。2/24 パターン→イディオム *1:Pointer of IMPLement

ロガーの作り方

ロガーとはログを書き出す仕組みのこと。 C++を使っているのであれば、多態を使って柔軟なロガーを作ることができる。

円柱と光線の交差判定

レイトレーシングにおける円柱との交差判定を考える。 ウェブや本などでいくつかの記述例があるが、それは大抵、複雑であるか、軸がY軸もしくはZ軸に固定であるかのどちらかだろう。 以下ではすっきりと記述でき、if文だらけにならず、なおかつ軸を固定しな…

フォトン・シャドウマップ

フォトン・シャドウマップ的なものを実装した。シャドウ・フォトンマップではない。 参考用にレイトレースシャドウ レンダリング時間は点光源×3で 上:5秒 下:7秒 と少し速い。ライトが多くなればもっと差がつくだろう。んが、前処理がかかりやがる。上…