ヘアーレンダリング4

marschner hairモデルを実装しシェーディングしてみた。 パラメータの調整がうまくできなくてとりあえず黒髪だけど、以下のようになる。 以下はdiffuse項をkajiya-kayを用い、specular項を今回のmarschnerモデルで置き換えた画像。

ヘアーレンダリング3

髪の毛のレンダリングにおいて前回までの円柱+球ではなく、カーブとしてレンダリングしてみた。 カーブのレンダリングの手法はRAY TRACING FOR CURVES PRIMITIVEを実装することで解決した。 また、髪の毛の一本一本をカーブとみなすために、点列間をcatmull…

ヘアーレンダリング2

前回のシーンの影を半透明にしてレンダリングしてみた。 あと今後できることは以下のようなことが考えられる。 もっと複雑なシェーディングモデルの採用 半透明シャドウの高速化 ヘアーセグメントのスプライン曲線による補間・細分化 GIへの対応

2011/3/23追記

影なしでシェーディングがすこしおかしかったところを改変。

ヘアーレンダリング

自作レンダラにおいて髪の毛のレンダリングに取り掛かっている。 具体的にどうするべきか、実験中であるが、とりあえずここ(HAIR Model Files - Cem Yuksel)からhairモデルを取得して単純なレイトレースにてレンダリングしてみた。 物体形状としては髪の毛…

QBVHを実装した

空間構造の一種であるQBVH(Quad-tree Bounding Volume Hierarchy)を実装した。 元の論文はhttp://www.uni-ulm.de/fileadmin/website_uni_ulm/iui.inst.100/institut/Papers/QBVH.pdf QBVHはレイトレーサの交差判定を高速化する。 以前syoyoさんがイイヨとお…

ヒルベルト曲線順

ヒルベルト曲線は空間充填曲線のひとつだ。このヒルベルト曲線でより高次の空間をたどるとキャッシュ効率がよくなるらしい。 さっそく3次元のモデルの面をヒルベルト曲線順で並び替えてみる。 以下はstanford bunnyのそれぞれの面の順番をHSVのH(色相)に…

追記

上のコードはortho_basisで基底ベクトルの組を、配列をヒープで作って返しているんだけどこれはタプルで十分ですね。 受け側ではmatch〜withでバインドする。 この変更を行ったところ約9.4秒→約8.3秒程度と高速化しました。 以下変更部分ソース

AOBenchをF#で実装した。

http://lucille.atso-net.jp/aobench/ で開催されているAOBenchをF#にて実装しました。 実装としてはC#版からの多くを拝借して移植。 あんまり関数型言語っぽくしてない。画像処理のような大きな配列を書き換える(リストから別のリストを作るのはやりやすい…

wavelet tree

圧縮検索で使われる技術wavelet treeをテンプレートライブラリとして書いてみました。 →を参考にしてみました。高速かつ省メモリで文字列を扱うデータ構造「wavelet tree」 元となる記事が大変興味深かったのだけど、どうもサンプルコードが複雑すぎるのと、…

正しい 演算子"<<" の定義の仕方

C++で何らかの型を定義して、その型を文字列に変換したいとき、演算子" class Hoge{ public: //たとえば配列のような型だったとする size_t size()const{/*略*/} int operator[](size_t i)const{/*略*/} /*略*/ }; Hoge hoge; std::cout << hoge << std::end…

画像の無限平面化

テクスチャなどに使う画像は有限の大きさを持つが、これを無限平面として扱えるようになると便利だ。 たとえば画像の任意のピクセルを参照するときX,Yでその位置を指定するが、X,Yの範囲値はそれぞれ 0 になる。 この範囲を超えてアクセスした場合、エラーと…

三角形のラスタライズ

三角形のラスタライズを行うには以下の手順を踏む 1.三角形の上下分割 2.Yスキャン 3.Xスキャン ・三角形の上下分割 三角形を上下2つに分けることでスキャン変換がしやすくなる 1.3つの頂点を縦方向にソートする 2.真ん中の頂点の高さと最上点か…

C#でパストレ

非常に眠いのだが、明日のOoOに何も用意してないので、これはまずいと思い、 前回C#で書いたレイトレを改造してパストレを書いてみた。 パストレ自体は難しくないんだが、球だけではちょっとわかりにくいので 平面を加え、シェーダーを物体から分離したりし…

縮小サンプリング

mipmapおよびripmap画像作成処理を書いた。 mipmap、ripmapはテクスチャマッピングにおける、縮小サンプリング時の処理だ。 つまり、出力画像のほうがテクスチャ画像より小さい(したがって出力画像の1ピクセルにテクスチャ画像の複数のピクセルが存在する…

ひとつはふくすうの部分集合

デザインパターンってあるけれど、これは設計というより、内部の関数、構造体どうしのインターフェースのノウハウ・・・パターンだと考えられるんじゃないかと思う。 プログラムは大きく3つの要素・・・構造・アルゴリズム・インターフェースによって構築さ…

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

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秒 と少し速い。ライトが多くなればもっと差がつくだろう。んが、前処理がかかりやがる。上…

フォトンマップ

フォトンを何も考えず最近隣だけ取ってレンダリングするとボロノイ分割の模様が現れるんだな。 無理やりフィルタの図。ほんとはこんなことをしてはいけない。 もっとだめなフィルタリング。フォトンマップ構造は意外と簡単に出来る。 けど、今のところGIにす…

lucy

lucyをレンダリングしてみた。 ・・・・ ・・・・ どっから撮ってるんだよ!って聞こえてきそうだけど、lucyは高さがZ軸なのね。 ほんとは回転させて再度レンダリングするべきなのだろうが、正直勘弁してくれと思った。 lucyはstanfordのアーカイブの中でも…

カメラシステム

やっとカメラをつけた。上から透視投影、平行投影、球体投影、円筒投影、魚眼投影。 こういう風にいくつものカメラに対応するなら一度、縦横を-1〜1の系に変換してから、それを入力にしてやれば、統一的なインターフェースが定義できる。 class camera{ publ…