フォト

Google AdSense


  • AdSense
無料ブログはココログ

« 動的ディスプレースメントマッピングのデモ(バイナリ修正しました) | トップページ | タブレットプログラミング(バーチャルサインボールへの道) »

2004.09.27

実装案

とりあえず公開したデモの実装案。

デモは、2パスのシェーダで構成されています。簡単に言うと最初のパスがVerlet積分(コレについては以前の記事をどうぞ)を解くヤツで、2パス目がディスプレースするだけのシェーダです。

1パスのシミュレーションは水面の動きだけを単純にモデル化したものを適用しただけなんで、安定してないので破綻してすごい波がおきちゃったり減衰と言う点ではあまり配慮はしてません。

安定させるのは難しいわけではないですが、それはあとでまずはシンプルなところから。

・1パス
NVIDIAがCEDEC初日2コマ目で実装のアイデアを与えてました(実際にはCEDECの資料にあった参考文献の『Advanced Character Physics』を参考にしています)。

第1パスでは以下の式を実装しています(VS なし, PS 3.0)。

form001.GIF式1
form002.GIF式2

上の式1では現在のフレームの位置(今回は高さのみ)をHとます。まずは、Hの近傍4点(下のFig1だとのような感じ)の高さの和をとります。これはテクスチャのUV値をずらしてサンプリングすればOKですね。

vertex.gif
Fig1.式1のイメージ

式2ですがnが現在のフレームです。Hn+1というのは次のフレーム時の高さでHn-1は前のフレーム時の位置です。式1はいいとして、式2の場合、現在のフレームの高さと前のフレームの高さと2つの高さマップが必要になります。

これは事前に現段階のフレームの高さを保持するレンダーターゲットテクスチャ(R32F)と前のフレームの高さを保持するレンダーターゲットテクスチャ(R32F)を用意しておきます。

1パスでは、まずAを出しておき、続いてHn+1を出します。このあとで、レンダーターゲット0にはこのHn+1を出力。MRT(Multi Render Target)でレンダーターゲット2にHnを出力しておきます。こうしておけば、次回の処理時にはHn+1がHnになり、HnがHn-1になるわけですね。

ちなみにこれだけで波っぽくなるんですが、このデモではピクセルシェーダの出力前に元の陸地の高さマップ(Tipsの方のサンプルででディスプレースメントマップとして使ってるヤツ)を参照してある程度輝度の高いところ(・・・たぶん陸地だろう)はそれはそのままの値を入れて出力することにしています。あと、UVの値が0.0もしくは1.0のところも計算をさせていません。

なお、デモ中の左下にディスプレースメントマップがありますが、左がHnの高さマップで、右がHn-1の高さマップになっています。

パス2(VS 3.0 PS 3.0)
ここは単純にディスプレースです。

それにしても質感がイマイチなのは、質感に無頓着な方だから>自分。

« 動的ディスプレースメントマッピングのデモ(バイナリ修正しました) | トップページ | タブレットプログラミング(バーチャルサインボールへの道) »

Programming」カテゴリの記事

画像付き」カテゴリの記事

コメント

コメントを書く

コメントは記事投稿者が公開するまで表示されません。

(ウェブ上には掲載しません)

トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/2210/1535474

この記事へのトラックバック一覧です: 実装案:

« 動的ディスプレースメントマッピングのデモ(バイナリ修正しました) | トップページ | タブレットプログラミング(バーチャルサインボールへの道) »