[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を頂点データに入れる際に参考にしました。
スポンサーサイト

[DirectX9]「VarianceShadows11」をDirectX9で実装した




タイトルのまんまです。
元々、シャドウマッピングを実装していましたが、今回DirectX公式サンプルの「VarianceShadows11」の各種テクニックを実装しました。

前回のHDRライティング同様、実装に関してはサンプルのまんまなので、参考にしたサイトをメモ。

参考文献
VarianceShadows11サンプルは、「分散シャドウマップ」に加えて、「カスケードシャドウマップ」と「ライト空間透視シャドウマップ」などのテクニックも取り入れられているので、各アルゴリズムごとにリンクを貼っておきます。

カスケードシャドウ(Cascaded Shadow Maps)
MSDN - カスケード シャドウ マップ
公式サンプルの解説ページです。

☆PROJECT ASURA☆ [Direct3D 11] 『平行分割シャドウマップ』
「カスケードシャドウ」に焦点を当てた解説が書かれています。
公式サンプルでは分割距離は手動でしたので、こちらで取り上げられていた平行分割を実装しました。
DirectX9ではテクスチャ配列が使えなかったので、こちらのif文での分割シャドウマップの選択も参考にしました。

分散シャドウマップ(Variance Shadow Maps)
【分散シャドウマップ】 – Variance Shadow Maps - | 株式会社ヘキサドライブ |
「分散シャドウマップ」に焦点を当てた解説が書かれています。

OpenGL ES 3.0 @ 分散シャドウマップ - ラーメンは味噌汁
OpenGLですが分散シャドウマップだけのコードも書いてあるので、比較しながらサンプルのコードを読みました。

MSDN - カスケード シャドウ マップ
カスケードシャドウマップの解説ページですが、VSMについても下の方で解説されています。

ライト空間透視シャドウマップ(Light Space Perspective Shadow Maps)
☆PROJECT ASURA☆ [OpenGL] 『Light Space Perspective Shadow Maps』
ライト空間透視シャドウマップに焦点を当てた解説をされています。

その他改良テクニック
☆PROJECT ASURA☆ [Direct3D 11] 『シャドウマッピングの基本』
下のほうに深度バイアスの計算についての解説がありますが、サンプルのRenderVarianceScene.hlslのCalculateVarianceShadow関数でこのテクニックが使われています。
DirectX9では、SampleGrad関数が使えないので、上記のサイトを元にバイアスを計算しました。


[DirectX9]HDRライティング




HDRライティングを実装したので、備忘録です。
実装に関していろいろ書こうかと思ったけど、実装は結果的にDirectXのサンプルのまんまになってしまったので、DirectXのサンプルを実装するにあたって、参考になりそうなことをつらつらと書いていきます。

HDRと「いい感じの画面」

HDRとはハイダイナミックレンジの略で、HDRレンダリングは「ディスプレイの表現できる限られた色(1677万色)を超えた、色でレンダリングすること」です。

これで何をするのかというと、ディスプレイ上での色ではなく、現実の光の量をレンダリングします。
ルクスとかそういう類のイメージです。
月明かりが1ルクス、晴れの日の屋外は100,000ルクスだそうで、明暗が99,999ルクスの差あります。この差をいい感じにごまかしていたものを、ちゃんと計算するのがHDRレンダリングで、その計算結果にトーンマッピングやブルームなどのエフェクトをかけて「いい感じの画面」を作ります。

3Dグラフィックス・マニアックス 41 HDRレンダリング(1)~HDRレンダリングとは?

具体的にやること
1.HDRレンダリングに対応する
2.トーンマッピングする
3.エフェクトをかける

各エフェクトの効果は下記のサイトが分かりやすかったです。

ラーメンは味噌汁 - OpenGL ES 3.0 @ RGB10_A2フォーマットでHDRレンダリング

実際の実装はDirectXのサンプルのまんまになってしまいましたが…。

HDRLighting サンプル


1.HDRレンダリングに対応する
0.0f~1.0fの世界を超えたレンダリングをするようにシェーダーを書き直します。
お手軽なのは光源のディフューズカラーを50倍するとか。
ここを突き詰めたものが、物理ベースレンダリングです。いつかやりたい。

そして、シェーダーのレンダーターゲットにD3DFMT_A16B16G16R16FなどのHDRフォーマットのテクスチャを指定します。
各種エフェクトをかけるときもHDRテクスチャを使うので、定数とか使ってHDRでないテクスチャをごっちゃにしないように注意します。

2.トーンマッピングする
画面の平均輝度を計算して、その輝度を元にディスプレイでの表示に合わせて補正します。

この辺の実装はいろいろあるようですが、論文を参考にした実装のDirectXのサンプルがいい感じでした。
自力で「いい感じ」にしようとするとドツボにはまりますので注意です(2日ぐらい吹き飛んだ)

3.エフェクトをかける
「眩しい」を表現するために、ブルームやグレアなどのエフェクトをかけます。

実際の描画で使われるのはトーンマッピング後のテクスチャなので、これらのエフェクトもトーンマッピングを掛けたテクスチャを元に計算します。
「明るく見える白いところを抽出」ではなく、本当に「明るいところ」を抽出出来るようになるのもHDRのいいところです。

実装にあたって
元々いろいろテクニックを書いた状態でのHDR対応だったので、シャドウの部分の減衰とかも見直したりしました。

レンダーターゲットを切り替えたり、テクスチャとサーフェイスを沢山用意したりしますが、この辺りは予めクラス化してあったので、カスタマイズが楽でした。

参考文献
3Dグラフィックス・マニアックス 41 HDRレンダリング(1)~HDRレンダリングとは?

ラーメンは味噌汁 - OpenGL ES 3.0 @ RGB10_A2フォーマットでHDRレンダリング

t-pot『Tone mapping』

HDRLighting サンプル

[DirectX]Xファイルアニメーション作成メモ[RokDeBone2]

RokDeBone2を使ってXファイルアニメーションを作る。
モデルはプリミティブなのを組み合わせたものを使う(いわゆるメッシュアニメーション)

RokDeBone2 操作チートシート
カメラ操作
右ドラッグ:回転
ホイールドラッグ:移動
左+右ドラッグ:拡縮

ボーンの入れ方は参考ページのやり方でOK。
人型の場合は、対称命名法に従って名前を付ける。
頭や腰など左右対称じゃないもの…◯◯_X
腕や足など左右対称なもの
X軸プラス方向側…◯◯_X+
X軸マイナス方向側…◯◯_X-
これにより対称pasteが使える。

対称命名法の例
rokdebone02.png

影2を使って体のパーツを覆うようにボーンの影響度を設定するとうまく動く。
影響度設定をするボーンは末端のボーン。

アニメーション
ポーズ取らせてキーフレームを付けていく。

アニメーションのFPSは「表示」→「同期ダイアログ」より設定出来る(基本60FPS)

モーションの保存は、File→ファイル書き出し→qua を選択。

Xファイルの保存は、File→ファイル書き出し→sig を選択。
保存ダイアログで拡張子を「マルチトラックXファイル」にして保存。
ダイアログで、「加」ボタンを押してアニメーションをセットして保存完了。


分からんこと
ボーンの位置を左右対称にしたい。

・参考ページ
Xファイルのアニメーションを作る
おちゃっこLAB - RokDeBone2

RokDeBone2での作業の流れ
ゲーム好きかい? - RokDeBone2講座ぁぁぁあああああ!!!!

細かいRokDeBone2の使い方
Windowsで作る3Dゲーム

[DirectX9.0]Xファイルモデルのアニメーション[自分用]

自分用。アニメーションする上で使えそうなサイトのリンクを貼るだけ

・参考ページ
Xファイルのアニメーションを作る
おちゃっこLAB - RokDeBone2

Xファイルのアニメーションのいろいろ
マルペケつくろーどっとコム - その37 アニメーションの根っこ:アニメーションコントーラをガンガン使う!

Xファイル読み込んで、複数のオブジェクトそれぞれアニメさせる
一つのスキンメッシュで複数のキャラを制御する

アニメーション合成の注意
雨弓のゲーム製作ブログ - アニメーションの合成
最新記事
最新コメント
最新トラックバック
月別アーカイブ
カテゴリ
検索フォーム
RSSリンクの表示
リンク
ブロとも申請フォーム

この人とブロともになる

QRコード
QR
プロフィール

ぴお

Author:ぴお
ようこそ

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

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

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

Twitter
このページのトップへ