[DirectX9]水面シェーダー




今回も例のごとく参考にしたサイトの備忘録です。

ひっかかったところ
・描画の管理
今まで単一のシェーダーで全てのモデルを描画していましたが、水は特殊なので、別にすることに。
水面メッシュの描画を担うOceanRendererクラスと波マッピングするWaveMapクラスを作って、既存の描画管理クラスで非透過オブジェクトの描画後に、水を描画しました。

・SetFVF関数だと、TANGENTとBINORMALが使えない
頂点バッファは面倒くさいので、簡単なメッシュにはDrawPrimitiveUPをいつも使ってたんですが、バンプマッピングで使われるTANGENTのような接空間法線にFVFは対応していませんでした。
DrawPrimitiveを使う形にして、CreateVertexDeclarationで専用の頂点データフォーマットを指定して解決。

・テクスチャの解像度と波
自分のところでは画面全体に水が表示されるので、テクスチャの解像度を上げたところ「海にどでかい水滴がぽつぽつ落ちてる」感じになって、ものすごい違和感が出てしまいました。
参考にしたサイトのシェーダーは、1フレームに波を1つずつしか追加出来なかったので、16個波を同時に発生させられるように拡張して、更に波の影響範囲を広げました。
コードはこんな感じです。
// 波の発生
for( int i = 0; i < 16; ++ i )
{
if( distance( In.Tex, AddWavePos[ i ] ) < 0.01f )
{
V + AddWaveHeight[ i ];
}
}


参考文献

Maverick Project - 波シェーダー

まんまこれです。

Maverick Project - 視差マッピング

波の法線テクスチャを描画する際のテクニックがこちらです。

○×(まるぺけ)つくろーどっとコム - その5 0から学ぶ法線マップ

バンプマッピングの接空間の解説です。

ゲームプログラミング技術集 - HLSL アプリケーション側の実装方法

水面のメッシュに自力でTANGENTやBINORMALを頂点データに入れる際に参考にしました。
スポンサーサイト

コメントの投稿

非公開コメント

最新記事
最新コメント
最新トラックバック
月別アーカイブ
カテゴリ
検索フォーム
RSSリンクの表示
リンク
ブロとも申請フォーム

この人とブロともになる

QRコード
QR
プロフィール

ぴお

Author:ぴお
ようこそ

自分のゲーム制作での備忘録や製作記録を書き留めておくブログです。

■やってるサービス
Twitter:piorimumu

Pixiv
http://www.pixiv.net/member.php?id=1126385

Twitter
このページのトップへ