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月20日

Half-Edgeデータ構造体について

これまでは頂点座標のデータと面データの2つを使ったデータ構造を使っており、どの頂点とどの頂点が接続されているかといった位相情報については特に考慮していませんでした。

Softbodyなどを表現する場合には、頂点間をバネで繋いだりするので、接続情報が大事になってきます。

そういった接続情報を持つデータ構造として、Winged-edge, Half-edgeなど色々あるようですが、今回は下記サイトを参考にHalf-edgeを使用することにしました。

http://www.flipcode.com/archives/The_Half-Edge_Data_Structure.shtml

実行結果



とりあえずOpenGLで接続情報を使って初期の位置関係を維持するような力を各頂点にかけています。

適当なのでかなり不自然ですね。シェイプマッチング法などを使えばそれっぽくなるのでしょうか。

次はIrrlicht+CUDAで同じことを試してみたいと思います。

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

2010年07月15日

Irrlicht+CUDAのテスト

Irrlicht+CUDAを使って頂点アニメーションでもしてみることにしました。

3dsファイルを読み込んでBulletのSoftbodyに渡すようなプログラムを以前作っていたので、Bulletの代わりにCUDAを使って自前でアニメーションさせるような感じです。

昔のソースコードには一応コメントが書いてあったのですが、コメントを読んでもさっぱりわかりませんでした。

実行結果



三次元CG@七葉様のモデルを使用させていただいております。
頂点数が約1500ぐらいで、CUDAでちょっとだけ頂点をsin関数等を使って動かしています。

1ブロックを16x16スレッドにして、頂点数/256+1個のブロックを作って1スレッドが1頂点を計算するようにしています。
頂点の衝突判定等をやろうとするとこの分け方はあまりよくないと思いますが。

CUDA側では殆ど計算していないのでなんともいえませんが、現段階でFPSが400程度は出ているので、何かできないかなーと考え中です。

一応ソースコード公開しておきます。
続きを読む
web拍手 by FC2
posted by シンドラー at 20:49 | Comment(0) | TrackBack(0) | Irrlicht | このブログの読者になる | 更新情報をチェックする

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日間更新が無い場合」 の 「広告を表示しない」にチェックを入れて保存する。