読者です 読者をやめる 読者になる 読者になる

椿の日記

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

カーソルをアクティブウィンドウのクライアント領域に制限する

カーソルをアクティブウィンドウのクライアント領域に制限するには、Win32 APIの ClipCursor 関数を使うのですが、なかなか期待する動作をしてくれません。多くのサイトでは、ウィンドウのアクティブ/非アクティブ状態をWM_ACTIVATEで検出し、クリッピングの…

Haskell@Windowsのコンソールで日本語が文字化けする話の対策

コンソールのコードページがCP932なので、最終的にCP932に変換しなければならないのですが、どうせWindowsでしか起こらない問題なので、WindowsのAPIを使っちゃいます。 import Data.Word import Foreign.Ptr import Foreign.C.Types import Foreign.C.Strin…

Frequency Domain Normal Map Filtering実装

少し忙しくて放置してたのですがFrequency Domain Normal Map Filteringを実装しました。画像はそれぞれ次をあらわしていて、左上をリファレンス画像だと思って見ます。 通常のバンプマップの32倍スーパーサンプリング 通常のバンプマップ NDFをmovMFで近似 …

pixel shaderでshared memoryって使えるの?

ここまで最適化を進めてきたのですが、これ以上はpixel shaderでは高速化は無理な気がしてきました…ループに[unroll]を付けたり階乗計算を漸化式的に書き直したりした結果、アセンブリコードの大半は積和計算になりました。それでも遅いということは、レジス…

シェーダの最適化ってどうするのがいいのかな

あんまりにもSH係数の計算が重いのでシェーダコードの最適化をしています。ただ、ある程度のところより先は、どう最適化するのがよいのかよく分からんことに。というのは、生成されたアセンブリコードをCUDAコアで実行するにあたって結局どういう風にコンバ…

球面調和関数の練習

やったこと やっと時間取れたので実装してみました。上段はリファレンスとなる通常の照明計算、下段はそれを球面調和関数の係数空間で計算しました。左から順にそれぞれ次のような照明計算を行いました。 Lambertian BRDF * DirectionalLight Phong BRDF * D…

Frequency Domain Normal Map Filtering続き^4

※式が違ったので修正(12/24)セクション4.3の次の式 について、次のようにそれぞれ球面調和関数展開できるとき、 その係数が次のようになる、 というこの部分について流し読みしていたのですが、よくよく考えてみると、よくある球面調和関数の内積と違ってを…

Frequency Domain Normal Map Filtering続き^3

セクション7で出てきた次の式(16)、 の出所は、これはClustering on the Unit Hypersphere using von Mises-Fisher DistributionsのAppendixに乗っていました。導出の詳細は論文を参照するとして、von Mises-Fisher分布関数のパラメータκとμをEMアルゴリズム…

Frequency Domain Normal Map Filtering続きの続き

論文のセクション8にも意味が分からなかった部分があったのですが、解決したので覚書しておきます。問題を要約すると、入射方向ωi、出射方向ωo、そのハーフ角ωhについて、が成り立つ、というものです。通常の反射の積分は入射方向で球面上を積分しますが、Bl…

Frequency Domain Normal Map Filtering続き

この論文も後半でいくつか分からない部分がありました。論文の後半は、NDFを近似するにあたってvMF(von Mises-Fisher)分布を用いています。vMFは球面上の1つの突起を表現していて、方向、幅、振幅の3つのパラメータで表されます。複数の突起を扱うには、その…

Frequency Domain Normal Map Filteringを読了

Frequency Domain Normal Map Filteringを読みました。法線マップのフィルタリングに関する論文で、法線マップを単純にミップマップ化すると法線が平均化されて想定外の方向を向いてしまい、シェーディング結果が変わってしまう 問題に対してどのように対処…

SparseVoxelOctreeの記事を読んだ続き

Interactive Indirect Illumination Using Voxel Cone Tracing について、ようやく大体のことを理解しました。細かいところで色々と分からない部分が出てきそうなので、理解を深めるために一度実装してみようかな。 ただ、現時点でSection 7のVoxel Shading…

SparseVoxelOctreeの記事を読む

急にUnrealEngine4で実装されているといわれるGIアルゴリズムについて調べたくなったので、関連する論文とか資料を読んでいます。SparseVoxelOctreeを利用したこのアルゴリズムは、光源方向からのフォトンの照射とOctreeへの格納、それから視点方向からの三…

最長増加部分列がイマイチ分からない

蟻本を少しずつ進めています。p.63~p.65の最長増加部分列の説明なのですが、自分にはどうも自明には思えなくて、そこで少し停止しています。dpは単調増加であるとか、更新できる要素は高々1個しかないとか、そこらへんが解説なしに進んでいってしまうので、…

tex記法の練習

プログラミングコンテスト チャレンジブック 第2版を買ってみた

プログラミングコンテストチャレンジブック [第2版] ?問題解決のアルゴリズム活用力とコーディングテクニックを鍛える?作者: 秋葉拓哉,岩田陽一,北川宜稔出版社/メーカー: マイナビ発売日: 2012/01/28メディア: 単行本(ソフトカバー)購入: 11人 クリック: …

ブログ移転しました

はてなダイアリーからはてなブログに移転しました。なんとなくスッキリ。 (実はあんまり機能とか確認せずに新しいものに飛びついただけだったり…)

MySQLの日本語表示の話

なんか日本語が表示できないなあ、と思ってたら凄く単純な話でした。これをやっておかないとならないようです。 quickQuery conn "SET NAMES utf8" [] こうしないと、日本語文字の部分が?に化けてしまいます。これはmysqlの関数がやっているようで、Haskell…

Haskellの実行速度

haskell vs その他の言語 - ながとの日記 という記事を見て、へぇーと思ってみてたのですが、元記事のコードの次の2つが何故これほどまでに違うのか、ちょっと気になったのでコンパイルだけして実際に確認してみます。(2つ目のはBangPatternの言語拡張のとこ…

Haskellでこの問題を解いてみた②

同じ人が別の問題を作っておられたようなので、解いてみました。ぷよぷよ19連鎖 import Data.Array import Data.List type Point = (Int,Int) type Field = Array Point Char type Route = [Point] isLegalPuyo :: Char -> Bool isLegalPuyo '\n' = False is…

Haskellでこの問題を解いてみた

web巡回してたらこんなページを見つけたので、解いてみました。人材獲得作戦・4 試験問題ほか import Data.Array import Data.Maybe import Data.List data Cell = Space | Wall | Start | Goal | Road deriving (Show, Eq) type Field = Array (Int,Int) C…

Haskellからmysqlを実行する

Haskellからmysqlを叩きたくなったので調べていたのですが、かなり骨が折れる作業になりました。一筋縄に行かない問題が次から次へと…。しかしなんとか解決できたので、忘れないように覚書を残しておきます。 ビルドするのはThe HDBC-mysql packageです。パ…

レイのフラスタムパケット化はパストレに弱い?

Kirill Garanzhaの手法の続報で「パストレにおいて性能が出ない」ということが書かれたpptを見つけました。何故遅いのか理由の記述を探しているのですが詳しい記述が見当たらないなあ。 ただの推測ですが、フラスタムのパケット化を中心としたアルゴリズムな…

レイの境界フラスタムの構築の仕方

Large Ray Packets for Real-time Whitted Ray Tracing, Ryan Overbeck Ravi Ramamoorthi William R. Markフラスタムの構築手法のところだけ。大きく分けて3通りの構築の仕方があります。 1次レイに関するフラスタムの構築 点光源のシャドウレイに関するフ…

GPU向けのBVH構築の手法

次にこれを読んでいます。Fast BVH Construction on GPUs, C. Lauterbach and M. Garland and S. Sengupta and D. Luebke and D. Manocha, EUROGRAPHICS 2009 http://luebke.us/publications/eg09.pdfとりあえずSAHを利用する場合のみ読んでます。 主な並列…

リアルタイムでレイトレ用のBVHを構築するっていう論文

On fast Construction of SAH-based Bounding Volume Hierarchies, --- Ingo Wald, Proceedings of the 2007 Eurographics/IEEE Symposium on Interactive Ray Tracing http://www.sci.utah.edu/~wald/Publications/2007///FastBuild/download//fastbuild.pd…

レイトレを幅優先探索でGPUで処理するっていう論文

読み終えたので、忘れないようにメモ書きしておきます。GPUによる、高い並列性を持つレイトレーシングの手法の一つです。Fast Ray Sorting and Breadth-First Packet Traversal for GPU Ray Tracing, Kirill Garanzha and Charles Loop http://research.micr…

シェーダデバッガをONにするとフレームレートが下がる件について

ただの覚書ですが、原因不明のフレームレート低下に見舞われてしまったので記録しておきます。 DirectXにはシェーダのデバッグ機能があります。①/Zi /Od コンパイルオプションを付けてシェーダをコンパイル ②DirectX Control Panelで「Enable Shader Debuggi…

colladaを使ってみる

colladaを読み込むにはcollada domというのを使うのですが、2点気をつけることがあったので単なる備忘録。・daeファイルのバージョンとcollada domのsdkのバージョンは合わせる必要があります。(上位互換/下位互換があるわけではないようです) ・colladaの…

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

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

スレッドを使ってみる(2)

直接となる原因は分かりませんが、Win32のsleepではなく、Control.Concurrent.threadDelayを使うと、上手くいくようです。 [0,0,0,32769,32768] [32768,32768,32768,32768,32768] [32768,0,0,0,0] [0,0,0,0,0] [0,32769,32768,32768,32768] [0,0,0,0,0]期待…

スレッドを使ってみる

ゲームプログラムでは、メインスレッドからコントローラ入力監視のスレッドを独立させ、短い周期でポーリングし、得られたデータをキューに突っ込んでメインスレッドから扱えるようにすると良いと思います。 とりあえずHaskellでやってみるんで、まずシング…

Text.Regex.Posixがリンクできない

GHCi, version 6.12.3: http://www.haskell.org/ghc/ :? for help Loading package ghc-prim ... linking ... done. Loading package integer-gmp ... linking ... done. Loading package base ... linking ... done. Loading package ffi-1.0 ... linking .…