2011年08月29日

NVIDIA OptiXについて

レイトレーシングを自分で実装しなくても、OptiXを使えばいい気がしてきたので、少し試してみるかもしれません。

とりあえずサンプル実行までのメモ。

http://developer.nvidia.com/join-nvidia-registered-developer-program
でユーザ登録します。

http://developer.nvidia.com/optix-download
から最新のSDKをダウンロードしてインストールします。

デフォルトで下記の場所にインストールされます。
C:\Program Files\NVIDIA Corporation\OptiX SDK 2.1.1

CUDA SDKとCMakeとCコンパイラ(Visual Studio等)が必要です。

ここでは全部インストール済みとして話を進めます。

CMakeでVisual Studioのプロジェクトを作成します。
以下SDKフォルダのINSTALL-WIN.txtの適当和訳です。

1. cmake-guiをスタートメニューから起動します。

2. path/OptiX SDK 2.1.1/SDK ディレクトリをソースコードの位置に指定します。

3. ビルドディレクトリを作成します。ソースディレクトリとは別のディレクトリにしておきます。
path/OptiX SDK 2.1.1/SDK/buildフォルダを提案します。
このティレクトリに書込み権限があるかどうか確認しておきましょう。
ない場合はある場所を指定しましょう。
もしそのフォルダが存在していないのであれば、CMakeはフォルダを作るかどうか尋ねてくるでしょう。

4. Configureボタンを押して、Visual Studioのバージョンを選んでください。
64ビットと32ビットで分かれていることに注意してください。(例:Visual Studio 8 2005 Win64)

(私の場合Cgが見つからないっぽいエラーが出ました。入れてなかったですかね。)
http://developer.nvidia.com/cg-toolkit-download
(から最新のCg Toolkitをダウンロードしてインストールします。)
(今回64ビットで開発予定なのでComplete installationにしました)

(CMakeを起動し直してConfigureを押すと、今度はエラーは出ませんでした。)

もしあなたが64ビットのデバイスコードを生成したいのであれば、CUDA_64_BIT_DEVICE_CODEにチェックを入れてください。
デフォルトではOFFになっていて、32ビットデバイスコードを生成します。

(良くわかりませんがチェックを入れてみます。)

5. もう一度Configureを押して、次にGenerateを押してください。

6. buildディレクトリにOptiX-Samples.slnが作成されているはずですので、それを開いてください。

7. ソリューションのビルドを選んでください。

8. ソリューションエクスプローラから適当にサンプルプロジェクトを選んで、右クリック→スタートアッププロジェクトに設定してください。

9. サンプルを実行してください。"q"か"ESC"でウィンドウを閉じます。

サンプルについてはSDK/NVIDIA-OptiX-SDK-samples.htmlに説明がありますが、フォトンマッピングやマルコフ連鎖モンテカルロ法など色々ありますね。
FPSはこのグラフィックボードだとこれぐらいが限界、ということなんでしょうかね。

tutorialというプロジェクトがあるので、これを最初からやっていけば良さそうな気がしますね。

web拍手 by FC2
posted by シンドラー at 19:03 | Comment(6) | TrackBack(0) | CUDA | このブログの読者になる | 更新情報をチェックする

2011年08月28日

レイトレーシングのテスト その8

続きです。

一応1回反射して当たった色と6:4で混ぜてみました。

実行結果



FPSが7とか8とか遅すぎですね。
もっとうまく作ればもっと早くできそうなんですが、試すかどうかは分かりません。
web拍手 by FC2
posted by シンドラー at 23:25 | Comment(0) | TrackBack(0) | CUDA | このブログの読者になる | 更新情報をチェックする

2011年08月25日

FBOとMRTについて

前回まで自前でちまちまと時間をかけてレイとポリゴンの衝突点を計算していたのですが、シェーダを使えばリアルタイムで取得できます。

とりあえず欲しい情報は、レイが当たったワールド座標、その座標でのレイの反射方向、その座標の色だと思います。

レイが当たったワールド座標はバーテックスシェーダから取ってこれますし、レイの反射方向はreflect関数が用意されているので計算できます。座標の色も当然計算できますので、欲しい情報はシェーダの機能で簡単に計算できます。

後はどうやってその情報をCPUもしくはCUDA側で取得するかについてですが、Frame Buffer Objectを用いたMultiple Render Targetというものを使えば複数の結果をテクスチャとして書き出すことができるようです。

参考サイト
[1] http://marina.sys.wakayama-u.ac.jp/~tokoi/?date=20101208
[2] http://asura.iaigiri.com/OpenGL/gl66.html

結局VBOとFBOとPBO3つとも使っている状態ですが何とかならないんですかね。

実行結果



キーボードで切り替えて、色→ワールド座標→反射ベクトル→深度情報→色→・・・の順番で表示しています。
一つずつしか取れないわけではなく、4種類とも取得していますが60FPSを維持できています。

自分で計算した5FPSと比べると困ったものですね。

これで1回目のレイの衝突が計算できましたので、2回目以後をCUDAで行うという形になりますが全部GLSLでやったのでいい気がしてきました。


web拍手 by FC2
posted by シンドラー at 20:07 | Comment(0) | TrackBack(0) | OpenGL & Metasequoia | このブログの読者になる | 更新情報をチェックする

2011年08月23日

レイトレーシングのテスト その7

昨日の続きです。

前回面を含むボクセルまで到達していたので、そこから面とレイの衝突判定をして衝突していればそのボクセルの色に、衝突していなければ次のボクセルに進んでまた判定を繰り返しています。

実行結果



FPSが5まで下がってしまいました。後は面に当たったらそこから反射ベクトルを計算して同じようにレイを追跡していけばいいので、あと少しで一応できそうです。
web拍手 by FC2
posted by シンドラー at 23:58 | Comment(0) | TrackBack(0) | CUDA | このブログの読者になる | 更新情報をチェックする

2011年08月22日

レイトレーシングのテスト その6

昨日の続きです。

視線から見て一番近いボクセルに当たったので、そこからさらに面が含まれるボクセルまでトラバースしていきます。

実行結果

今回もボクセルの番号で色をつけています。



FPSが20まで落ちてしまいましたね。ここから面とレイの交差判定をして当たったら反射して、当たらなければそのまままっすぐ、といった処理を繰り返すのですが、それを入れるとさらにFPSが下がりそうですね。

まぁCPUで数十秒から数分かかっていたのと比べると速いんですが、リアルタイムでやるためにはもっと最適化が必要そうですね。
web拍手 by FC2
posted by シンドラー at 20:54 | Comment(0) | TrackBack(0) | CUDA | このブログの読者になる | 更新情報をチェックする

2011年08月21日

レイトレーシングのテスト その5

CUDA+PBO+VBOでレイトレーシングに挑戦中です。

とりあえず前回と前々回の内容を反映させて、視点位置からレイを飛ばしてUniform Gridに当たったらそのボクセル番号×?の色をPBOに書き込んで表示するところまでできました。

実行結果



動画は8x8x8のグリッドでやっています。GeForce載った少し昔のノートPCでも32x32x32のグリッドで55fpsぐらいでているので、並列的な処理はやっぱりGPUでやった方が速いですね。

GPUのメモリの問題で64x64x64は無理みたいですがもっと性能のいいグラボを積んだデスクトップPCならもっといけると思います。

次はVBOから面の情報使って面に衝突したらそこの色をぐらいまで進めたいですね。

web拍手 by FC2
posted by シンドラー at 20:17 | Comment(0) | TrackBack(0) | CUDA | このブログの読者になる | 更新情報をチェックする

2011年08月18日

OpenGLのPBOとVBOとCUDA4.0について

CUDAでレイトレーシングを行うための準備中です。

CUDAもいつのまにか4.0になっていたので、インストールし直しました。

OpenGL+PBOで画像処理を行ったサンプルと、OpenGL+VBOで頂点アニメーションを行ったサンプルを昔作っていたので、OpenGL+PBO+VBO+CUDAを組み合わせて使ってみます。

1. 3Dモデルの情報はVBOで保持してCUDAと共有
2. レンダリング結果はPBOで保持してCUDAと共有
(レンダリングというか色の計算もCUDAでやってPBOに出力)

実行結果

cuda_vbo_pbo_test_001.png

CUDAでVBO経由で頂点情報と法線情報を参照して、法線情報を色にしてPBOに出力した結果をOpenGLで表示したものです。
説明がややこしいですね。

CUDA4.0になっていろいろ便利になったはずですが全然活かせていませんね。
昔はCUDAを使う場合はFBOではなくPBOになっていましたが今はFBOでも使えるんでしょうかね。

後はCPUでやっていたレイトレーシングをCUDA側で実装すればいいので道筋は見えましたかね。
道筋が見えると満足してやめてしまうことがよくあるので注意が必要ですね。
web拍手 by FC2
posted by シンドラー at 19:55 | Comment(0) | TrackBack(0) | CUDA | このブログの読者になる | 更新情報をチェックする

2011年08月14日

マウスでクリックした点のワールド座標の計算について

レイトレーシングを行う場合、各ピクセル座標にレイを飛ばす必要があります。

この場合、ピクセル座標をワールド座標系に戻してレイを飛ばす方法と、頂点座標などをクリッピング座標に変換して、カメラの位置が原点となる座標系でレイを飛ばす方法が考えられると思います。

普通は後者のような気もしますが、現在は前者でやっていますので、その方法についてメモしておきます。
たまに間違ったことを書いていると思いますので間違っていたら教えてください。

例題としてマウスでクリックしたピクセル座標のワールド座標での位置を計算します。

mouse_000.PNG

マウスでクリックした座標は(130, 240)といった左上が原点の2次元のピクセル座標と考えられます。

最初にこれをクリッピング座標系に変換します。クリッピング座標系はXYZ各軸とも-1.0〜1.0の範囲に収まる座標系ですので、XとYは画像の幅と高さで割って2倍して1.0を引けばその範囲に変換できます。

Z軸については、通常近クリップ面にピクセルが集まりますので、-1.0ということになります。
同次座標系で考えた場合、4次元目のwが必要となりますので、それは1.0ということになります。

次にクリッピング座標系をワールド座標系に変換するので、透視投影変換行列の逆行列と、モデルビュー変換行列の逆行列をクリッピング座標系の座標に掛ければ、マウスでクリックした座標のワールド座標が計算できます。

昔の記事で別の方法でマウスでクリックしたワールド座標を計算していましたが、今回のやり方の方が計算量などは少ないのではないかと思います。

ソースコード
AffineTest_2.zip

Eigenというライブラリで逆行列を計算していますので、コンパイルするためにはEigenライブラリをダウンロードしてパスを設定する必要があります。

web拍手 by FC2
posted by シンドラー at 00:57 | Comment(0) | TrackBack(0) | OpenGL & Metasequoia | このブログの読者になる | 更新情報をチェックする