椿の日記

たぶんプログラムの話をします

2011-05-01から1ヶ月間の記事一覧

CUDAを使ってみる

次はフォトンマッピングをしようかと思ったのですが、気分転換にCUDAを勉強してみようと思います。とりあえずv4.0のSDKをインストールしたあとにハマった点だけ簡易まとめ。 cutil cutilはDirectXで言うところのDXUTのようなユーティリティのようです。 自分…

疑問

パストレで、拡散面の輝度を直接照明と間接照明に分けて混ぜ合わせるときの割合を、反射位置を基準に光源が占める立体角によって求めました。でも、光源が点光源だったらどうするんだろう。点光源ということは面積を持たないわけで立体角もなにも求めらんな…

Image Space Photon Mapping(ISPM)を読んでみたが

http://graphics.cs.williams.edu/papers/PhotonHPG09/今見た産業 フォトンの1次反射はGPUで計算して残りはCPUで計算するよ フォトンの影響範囲を適当なジオメトリで近似してラスタライズして求めるよ 最後はカメラからみた視点で(G-Bufferを使って)ラスタ…

直接照明再び

照明方向の立体角の計算式を間違えてた。照明の傍で反射したときに照明へ飛ぶ確率が実際よりも多くなり(てか1.0を超えていた)、それが影響して白とびしてたらしいです…。追記:一晩放置してレンダリングしてみた。流石に綺麗

FLOWERING NIGHT 2011でそれどころではない

行ってきました新木場STUDIO COAST。いやー楽しかった。で、パストレの話の続きなんですけど、とりあえずt-potの流れで直接照明と間接照明に分けて積分する方法をやってみたのですが、なんか上手くいきません…。白いブツブツが出ている。何でだろうと思って…

次は何をしよう

レンダリング全ステップが終わらないと結果が分からない構造だったのを少しずつ結果が分かる構造にするとか、レンダリングスレッドで計算してメインスレッドは止めないようにするとか、細かい問題の対策を中心に実装してました。予定では、ここまでやったら…

屈折の式を修正したら

512K回の反復で320x240を計算させてみた。計算時間8時間(笑) でも大分綺麗になった!あと、屈折の時の衝突判定が間違っていて、球体の内部から外に出る時にレイと球の衝突を考慮してなくて貫通してしまっていたので、それも修正しました。そしたら鏡球に映…

間接照明

t-potを見たりしながらモンテカルロ積分による光線追跡法を実装してみました。8192回の反復では全然足りなかった。しかも重すぎるので160x120… でもちゃんと集光模様が出るようになったし、精度とか除けば一応は出来てるのかなー。リアルタイムレンダリング…

照明改善

距離の二乗に反比例するように光の加減を変えたり壁の色を少し変えたり。あ、それっぽくなった。

色々間違ってた

なんというか残念なことに屈折方向を求めるところで代入してからの計算を間違えていたorz。リファレンス画像を確認しつつ修正。というか鏡面反射ならともかくガラス球とかマジマジと見たことないから屈折の方向とか分からんよー。あと点光源にしてみた。でも…

屈折

昨日は例大祭だったのでお休み。本日は改めて屈折を試してみました。 まず、法線ベクトルNと、入射ベクトルLが作る平面を考え、その平面上で法線ベクトルNに直交する単位ベクトルEを求めます。L-(L・N)N の長さは sinθ なので、これをsinθで割って単位ベクト…

反射

ソースが長いのでいい加減に画像だけに…。 鏡面反射する方向ベクトルを求めて、そちらに向けて再帰的にTraceRay関数を呼び出して、反射項を求めました。鏡面反射ベクトルは、衝突した位置の法線をN、レイが飛んでくる方向をRとすると、2*(R・N)N - Rで求まり…

boost::variantでデータ構造を書き換え

boost::variantを利用してシェイプクラスを抽象的にします。 typedef boost::variant<Sphere,Plane> Shape; enum SHAPE_TYPE { SHAPE_TYPE_SPHERE, SHAPE_TYPE_PLANE, }; struct Scene { std::vector<Shape> shapes; std::vector<Vector3> directionalLights; }; 関数型言語に慣れ始めると</vector3></shape></sphere,plane>…

影を追加する

シャドウバッファとかの元になってるやつ。流石にCPUの手抜き実装だとらくちんですね… /* レイと球の交差位置取得。 */ bool Test_Ray_Sphere( const Vector3& p0, const Vector3& v, const Sphere& s, float* out_t ) { Vector3 m = p0 - s.p; // tについて…

複数のオブジェクトの表示

複数のオブジェクトを表示するので、Sceneオブジェクトを作って、最近傍衝突点を返す関数を作る。 struct Scene { std::vector<Sphere> spheres; std::vector<Plane> planes; std::vector<Vector3> directionalLights; }; struct Contact { Vector3 p; Vector3 n; float t; }; Scene </vector3></plane></sphere>…

ディフューズシェーディング

そして何の変哲も無いディフューズシェーディング。 /* レイと球の交差位置取得。 */ bool Test_Ray_Sphere( const Vector3& p0, const Vector3& v, const Sphere& s, float* out_t ) { Vector3 m = p0 - s.p; // tについての二次方程式(at^2 + 2bt + c = 0)…

とりあえずレイトレース

http://d.hatena.ne.jp/mokehehe/20090716/raytracer こちらの記事を参考にしながら、レイトレースの実験を開始しました。記事に習って、レイが正しく飛ばせているかどうかの実験からです…。そういえば、初めてDirect2D使った。意外に便利かも。ウィンドウ作…

QGK

急にグローバルイルミネーションに興味が出てきたので、の略。 というわけでフォトンマッピングをやってみたいのですが、まず根本的によく分かってないわけです。 オーム社のフォトンマッピングの本を買ってはみたものの、なんか知らん方程式出てきた、放射…