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(0) | 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月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 | このブログの読者になる | 更新情報をチェックする

2010年07月27日

Irrlicht+CUDA+GLSLでフォンシェーディング

前回の続きです。

Irrlichtのチュートリアル10.Shadersで自分でシェーダ言語を使用する方法が紹介されています。
http://irrlicht.sourceforge.net/docu/example010.html

今回は上記のページと「OpenGL入門2テクスチャマッピング」を参考に、IrrlichtとGLSLでフォンシェーディングを試してみました。

CUDAは今回あまり関係ありませんが、少し頂点間の力の計算を変更してみました。

実行結果



動画の作成方法が良くないのかどうしてもカクカクしてしまいますね。

画質もあまりよくないので違いがわかりにくいですが、一応ハイライトがテカテカしていてポリゴンの境目なども目立たなくなっています。

環境マッピングやバンプマッピングなどまだまだ色々できそうではありますがたぶんやらないと思います。

次はジオメトリシェーダをちょっと試すか、PMDファイルをちょっと試すか、ぐらいですかね。
web拍手 by FC2
posted by シンドラー at 19:12 | Comment(0) | TrackBack(0) | CUDA | このブログの読者になる | 更新情報をチェックする

2010年07月22日

Irrlicht+CUDAのテスト その3

昨日の続きです。

頂点アニメーションを行うということは、当然頂点の法線ベクトルも変化しますので、法線ベクトルを再計算しないと光源を有効にした場合にひどいことになります。

三角ポリゴンでできたオブジェクトの頂点の法線ベクトルの計算方法は、まず最初に面の法線ベクトルを計算して、その頂点が属している面の法線ベクトルを全部足して正規化すればいいはずです。

面の法線ベクトルに関しては、並列処理でできそうでしたのでCUDA側にIndex情報を渡して面の法線ベクトルを計算しました。

頂点の法線ベクトルについてですが、全部足す処理が並列処理を行った場合危ないので、CPU側ですることにしました。Atomic関数や__threadfence関数などを使えばいいのだとは思いますが。

実行結果



昨日よりバネ係数を大きくしたので元気にずっと跳ねています。

録画しているとどうしてもかくかくしてしまいますね。
録画なしだとFPSは280ぐらいでもう少しスムーズに動いてはいます。

IrrlichtではShadowVolumeが使えるのですが、変形した場合は影がおかしくなってしまったので切っています。
変形するたびにShadowVolumeを計算しないといけなかったりするんでしょうかね。

なんとなく何もしていないのにトゥーンシェーディングっぽく見えますね。なぜでしょうか。

Irrlichtのチュートリアルに自分で書いたシェーダプログラムを使用する方法があったと思うので、次はそれを試したりしてみるかもしれません。

ジオメトリシェーダを使ってポリゴンレベルで細かくというのもありですかね。
web拍手 by FC2
posted by シンドラー at 21:30 | Comment(0) | TrackBack(0) | CUDA | このブログの読者になる | 更新情報をチェックする

2010年07月21日

Irrlicht+CUDAのテスト その2

前回はHalf-Edgeデータ構造で接続関係を調べてGLUTでテストしたので、それをIrrlicht+CUDAでも試してみました。

接続関係は変わらないものとして、隣接頂点の番号や初期相対位置などの情報はテクスチャメモリとして確保し、CUDAに渡しています。

2次元配列のテクスチャメモリを使ってみましたが、確保の仕方などが少しわかりにくく手間取りました。

実行結果



頂点数1200ぐらいのはちゅねモデルを使用させていただいております。
録画していない状態でFPSが400を超えていますので、これぐらいの頂点数だと問題なさそうです。
(変わりに最初にHalf-Edge構造を構築する時に時間かかっています)

位相関係ですが、手なら手、足なら足でオブジェクト毎に分けて作成しているモデルが多く、近接頂点の探索も行わないとパーツごとにばらばらになってしまいます。

パーツ間の位置関係とかの話になると結局ボーンが関係してくるような気がするので、次はPMDファイルのボーンアニメーションをCUDAでできないか試してみるかもしれません。
web拍手 by FC2
posted by シンドラー at 19:51 | Comment(0) | TrackBack(0) | CUDA | このブログの読者になる | 更新情報をチェックする

2010年07月03日

CUDAとOpenGLのVBOについて

CUDAをとりあえず使ってみようということで、使ってみました。

参考文献
http://wiki.livedoor.jp/mikk_ni3_92/d/CUDA

基本的な設定などは上記ページを参考にさせていただきましたが、Visual Studio用のWizardがありましたのでそれを使用することにしました。

CUDA VS Wizard
http://sourceforge.net/projects/cudavswizard/

OpenGLとの連携はどうするのかということですが、CUDA Programming Guideの3.2.7 OpenGL InteroperablilityにVBOを使用したサンプルがありましたので、これを少し改良することにしました。glutとglewを使用しています。

処理の流れ

1. CUDAのPPM画像読込関数を使用してテクスチャを作成
2. VBOの準備
2.1 画像の幅×高さの頂点座標
2.2 法線ベクトル
2.3 テクスチャ座標
2.4 三角ポリゴン用頂点インデックス
3. CUDAへの登録
4. 以下ディスプレイ関数内
4.1 CUDAへのマッピング
4.2 CUDAで頂点アニメーション
4.3 CUDAで法線ベクトル計算
4.4 CUDAへのマッピング解除
4.5 VBOの描画

実行結果



1400x1000ぐらいの頂点数ですが、リアルタイムで動いているようです。
Shared MemoryやConstant Memory等を使っていないので、そのあたりをうまく使えばもっと早くなる可能性があります。
はてさて、これを使って何をしましょうかね。
web拍手 by FC2
posted by シンドラー at 19:40 | Comment(0) | TrackBack(0) | CUDA | このブログの読者になる | 更新情報をチェックする

広告


この広告は60日以上更新がないブログに表示がされております。

以下のいずれかの方法で非表示にすることが可能です。

・記事の投稿、編集をおこなう
・マイブログの【設定】 > 【広告設定】 より、「60日間更新が無い場合」 の 「広告を表示しない」にチェックを入れて保存する。