視差遮蔽マッピング ( Parallax Occlusion Mapping )
先日、弄ってみたDirectX SDKのParallaxOcclusionMappingサンプルを自分のフレームワークに取り込むことがでキタ━━(゜∀゜)━━ッ!!
(単にエフェクトファイルを読み込んで表示させただけなんですがね( ´_ゝ`) )
ちゃんと、プログラムが走るとうれしいですね。
かわいい、わんこもこんな感じに!!
から画像をお借りしました。
「忘れないように、今回のプログラムについて気が付いたことをメモしておきます。↓」
・視差マッピングは、頂点座標系において、頂点からカメラに向かう方向ベクトルを使って、テクスチャ座標をずらす。
・頂点座標系の基底をちゃんと作らないと、間違った方向にテクスチャ座標がずれることになるので注意。
・最初、頂点座標系の基底を作るために、D3DXComputeTangent関数を使用して、エフェクトを表示してみたが、うまく表示されなかった。作られた接線ベクトル、従法線ベクトルを調べてみると、確かに直交はしているが、期待する方向のベクトルではなかった。(モデルに張るテクスチャの張り方が、悪かったのかもしれない。)
エフェクトファイル内でfloat3x3( vTangentWS, vBinormalWS, vNormalWS );のように頂点座標系に変換する基底を作るのだが、作成した接線ベクトル、従法線ベクトルをそのまま入れても、正しい基底は作れないので、float3x3( -vBinormalWS, -vTangentWS, vNormalWS );のように変更して基底の作り方を変更した。
・作成する基底に必要な接線、従法線ベクトルが正しいものかを調べるためには、まず、『ゲームプログラミングのための3Dグラフィックス数学 p_153』 or 『DirectX 9 シェーダプログラミングブック p_275』に載っている式(両方とも同じ内容)で、手計算をして、紙に絵を描いてイメージすると良い。
・D3DXComputeTangent関数を使う時は、隣接情報を引数に与えたほうが良い。
・モデルによっては、「D3DX: D3DXValidMesh: Bowtie found around vertex」のような警告がデバッグ欄に表示されることがある。表示されるモデルには、D3DXCleanMesh( D3DXCLEAN_BOWTIES, .....);関数をあらかじめ呼び出しておくと良い(隣接バッファが必要です)。
・視差遮蔽マッピングは、すさまじく重い('A`)
[参考解説ホームページ]
【コラム】3Dグラフィックス・マニアックス (17) バンプマッピングの先にあるもの(1)~視差マッピング | パソコン | マイコミジャーナル