波面シェーダ + 頂点テクスチャフェッチ(追記)
以前,下記の記事でやった波面シェーダの結果を頂点シェーダでテクスチャ参照してジオメトリの変位を行うようにしました。
波面シェーダ : FX Composerの"Fluid"より
http://www.shader.jp/xoops/html/modules/wordpress/index.php?p=97
個人blogの方(動作ビデオを置いてます)
http://masafumi.cocolog-nifty.com/masafumis_diary/2006/02/post_df71.html
※上記ビデオでは256×256頂点ですが,下のソースでは64×64頂点でやってます.シミュレーションテクスチャの解像度は一緒です.

デモでは,画面上をマウスで左クリックするとその位置に応じて波の計算を行って頂点が変形するってかんじです.発生位置は,画面を0.0〜1.0と見たててテクスチャ座標の0.0〜1.0に対応するって感じです.
・動作要件
下の方にソース & バイナリがあります(Visual Studio.NET 2003 & Visual Studio 2005).DirectX SDK February 2005です.
実行ファイルもありますが,実行時にDLLが足らないとか言われる方は下記からDirectX End-User Runtimes (February 2006) を入れるようお願いします(SDKを入れたくない方も).
GPUは,GeForce 6シリーズおよびGeForce 7シリーズで(RADEON X1xxxシリーズは頂点シェーダでテクスチャ参照ができないのでダメです).
・ソースの簡単な概略
CGPUFluid* g_cgpu = NULL; // 水面エフェクト
このクラスでやってます。
// CGPUFluid
g_cgpu = new CGPUFluid;
g_cgpu->Init( pd3dDevice, 64, 64 ); // 初期化
初期化の第2,第3引数は横と縦のグリッドの数(頂点数 = 横 x 縦).
一応,シミュレーションテクスチャが256×256ピクセルなので256×256頂点にすべきなのですが,パフォーマンス的なことを考えてこのぐらいにしてます.
// MouseProc内
g_cgpu->GenerateWave(pd3dDevice, &vPos);
波の発生位置を決めるとこです.第2引数は,シミュレーションテクスチャの発生位置のテクスチャ座標。
// 描画
hr = g_cgpu->Render3D(pd3dDevice, g_pTexture, &imat);
第3引数は,トランスフォーム行列.
・ダウンロード
ダウンロード(501KB)
http://www.shader.jp/xoops/html/DL/VertexTextureWater.zip
※注意.本デモは実験的に作ったものなので何が起こるかわかりません(大袈裟)ですので,起動にともなう損害,その他はこちらではサポートしません.その点をご理解いただける方のみダウンロードしてください.
デモの著作権についてですが,このファイル自体の無断転載・再配布はおやめください.ただし,このソースを参考にして何かのプログラムに組み込むとか,改変すること自体に関しては制限しません.
コメント
TrackBack URL : http://www.shader.jp/xoops/html/modules/wordpress/wp-trackback_script.php/208
この投稿には、まだコメントが付いていません
コメントの投稿
改行や段落は自動です
URLとメールアドレスは自動的にリンクされますので、<a>タグは不要です。
以下のHTMLタグが使用可能です。<a href="" title="" rel=""> <abbr title=""> <acronym title=""> <b> <br> <code> <em> <i> <strike> <strong>



